diff --git a/.gitignore b/.gitignore index be1e0c72..58fdc1b7 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ kernel/kernel .DS_Store *.o +*.a *.s serial_opt.txt user/sys_api_lib diff --git a/Makefile b/Makefile index 5a879bfb..974a9ee8 100644 --- a/Makefile +++ b/Makefile @@ -28,9 +28,6 @@ ifeq ($(DEBUG), DEBUG) GLOBAL_CFLAGS += -g endif -# ifeq ($(DragonOS_GCC), ) -# $(error 尚未安装DragonOS交叉编译器, 请使用tools文件夹下的build_gcc_toolchain.sh脚本安装) -# endif export CC=$(DragonOS_GCC)/x86_64-elf-gcc export LD=ld @@ -52,8 +49,7 @@ kernel: .PHONY: user user: - mkdir -p bin/user/ - mkdir -p bin/tmp/user + @if [ -z $$DragonOS_GCC ]; then echo "\033[31m [错误]尚未安装DragonOS交叉编译器, 请使用tools文件夹下的build_gcc_toolchain.sh脚本安装 \033[0m"; exit 1; fi $(MAKE) -C ./user all || (sh -c "echo 用户程序编译失败" && exit 1) diff --git a/kernel/src/process/fork.c b/kernel/src/process/fork.c index 90b01abd..0a3c14d8 100644 --- a/kernel/src/process/fork.c +++ b/kernel/src/process/fork.c @@ -136,7 +136,7 @@ unsigned long do_fork(struct pt_regs *regs, unsigned long clone_flags, unsigned // 唤醒进程 process_wakeup(tsk); - //创建对应procfs文件 + // 创建对应procfs文件 procfs_register_pid(tsk->pid); return retval; @@ -188,8 +188,10 @@ int process_copy_files(uint64_t clone_flags, struct process_control_block *pcb) if (clone_flags & CLONE_FS) return retval; + // TODO: 这里是临时性的特殊处理stdio,待文件系统重构及tty设备实现后,需要改写这里 + process_open_stdio(current_pcb); // 为新进程拷贝新的文件描述符 - for (int i = 0; i < PROC_MAX_FD_NUM; ++i) + for (int i = 3; i < PROC_MAX_FD_NUM; ++i) { if (current_pcb->fds[i] == NULL) continue; diff --git a/kernel/src/process/process.c b/kernel/src/process/process.c index d8718b8b..b795f55e 100644 --- a/kernel/src/process/process.c +++ b/kernel/src/process/process.c @@ -409,6 +409,8 @@ ul do_execve(struct pt_regs *regs, char *path, char *argv[], char *envp[]) // 关闭之前的文件描述符 process_exit_files(current_pcb); + + process_open_stdio(current_pcb); // 清除进程的vfork标志位 current_pcb->flags &= ~PF_VFORK; @@ -640,6 +642,10 @@ void process_init() // 初始化init进程的signal相关的信息 initial_proc_init_signal(current_pcb); + + // TODO: 这里是临时性的特殊处理stdio,待文件系统重构及tty设备实现后,需要改写这里 + process_open_stdio(current_pcb); + // 临时设置IDLE进程的的虚拟运行时间为0,防止下面的这些内核线程的虚拟运行时间出错 current_pcb->virtual_runtime = 0; barrier(); @@ -724,11 +730,13 @@ int process_wakeup_immediately(struct process_control_block *pcb) */ uint64_t process_exit_files(struct process_control_block *pcb) { + // TODO: 当stdio不再被以-1来特殊处理时,在这里要释放stdio文件的内存 + // 不与父进程共享文件描述符 if (!(pcb->flags & PF_VFORK)) { - for (int i = 0; i < PROC_MAX_FD_NUM; ++i) + for (int i = 3; i < PROC_MAX_FD_NUM; ++i) { if (pcb->fds[i] == NULL) continue; @@ -843,15 +851,15 @@ int process_release_pcb(struct process_control_block *pcb) int process_fd_alloc(struct vfs_file_t *file) { int fd_num = -1; - struct vfs_file_t **f = current_pcb->fds; for (int i = 0; i < PROC_MAX_FD_NUM; ++i) { + // kdebug("currentpcb->fds[%d]=%#018lx", i, current_pcb->fds[i]); /* 找到指针数组中的空位 */ - if (f[i] == NULL) + if (current_pcb->fds[i] == NULL) { fd_num = i; - f[i] = file; + current_pcb->fds[i] = file; break; } } @@ -882,3 +890,14 @@ void process_set_pcb_name(struct process_control_block *pcb, const char *pcb_nam { __set_pcb_name(pcb, pcb_name); } + +void process_open_stdio(struct process_control_block *pcb) +{ + // TODO: 这里是临时性的特殊处理stdio,待文件系统重构及tty设备实现后,需要改写这里 + // stdin + pcb->fds[0] = -1UL; + // stdout + pcb->fds[1] = -1UL; + // stderr + pcb->fds[2] = -1UL; +} \ No newline at end of file diff --git a/kernel/src/process/process.h b/kernel/src/process/process.h index bb942c66..dc451e79 100644 --- a/kernel/src/process/process.h +++ b/kernel/src/process/process.h @@ -220,4 +220,6 @@ extern int process_try_to_wake_up(struct process_control_block *_pcb, uint64_t _ * @return false 唤醒失败 */ extern int process_wake_up_state(struct process_control_block *pcb, uint64_t state); -void __switch_to(struct process_control_block *prev, struct process_control_block *next); \ No newline at end of file +void __switch_to(struct process_control_block *prev, struct process_control_block *next); + +void process_open_stdio(struct process_control_block * pcb); \ No newline at end of file diff --git a/kernel/src/syscall/syscall.c b/kernel/src/syscall/syscall.c index 85de7f2c..9afd4fe8 100644 --- a/kernel/src/syscall/syscall.c +++ b/kernel/src/syscall/syscall.c @@ -6,8 +6,8 @@ #include #include #include -#include #include +#include #include #include #include