diff --git a/.vscode/settings.json b/.vscode/settings.json index c9fc4281..288878d2 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -148,6 +148,7 @@ "timer.h": "c", "hid.h": "c", "cfs.h": "c", + "err.h": "c", "rtc.h": "c", "wait_queue_head.h": "c", "list.h": "c", diff --git a/kernel/common/kthread.h b/kernel/common/kthread.h index 28818c28..440066f6 100644 --- a/kernel/common/kthread.h +++ b/kernel/common/kthread.h @@ -92,3 +92,17 @@ int kthread_mechanism_init(); */ bool kthread_set_worker_private(struct process_control_block *pcb); +/** + * @brief 获取pcb中的kthread结构体 + * + * @param pcb pcb + * @return struct kthread* kthread信息结构体 + */ +struct kthread_info_t *to_kthread(struct process_control_block *pcb); + +/** + * @brief 释放pcb指向的worker private + * + * @param pcb 要释放的pcb + */ +void free_kthread_struct(struct process_control_block *pcb); \ No newline at end of file diff --git a/kernel/driver/video/video.c b/kernel/driver/video/video.c index 1b809226..387d293b 100644 --- a/kernel/driver/video/video.c +++ b/kernel/driver/video/video.c @@ -183,7 +183,7 @@ int video_init() PAGE_KERNEL_PAGE | PAGE_PWT | PAGE_PCD, false); io_mfence(); - char init_text2[] = "Video driver initialized."; + char init_text2[] = "Video driver initialized.\n"; for (int i = 0; i < sizeof(init_text2) - 1; ++i) uart_send(COM1, init_text2[i]); diff --git a/kernel/process/kthread.c b/kernel/process/kthread.c index 7d8c5c0c..22361c78 100644 --- a/kernel/process/kthread.c +++ b/kernel/process/kthread.c @@ -41,7 +41,7 @@ struct kthread_create_info_t * @param pcb pcb * @return struct kthread* kthread信息结构体 */ -static inline struct kthread_info_t *to_kthread(struct process_control_block *pcb) +struct kthread_info_t *to_kthread(struct process_control_block *pcb) { WARN_ON(!(pcb->flags & PF_KTHREAD)); return pcb->worker_private; @@ -55,6 +55,7 @@ static struct process_control_block *__kthread_create_on_node(int (*thread_fn)(v if (create == NULL) return ERR_PTR(-ENOMEM); + BUG_ON(name_fmt == NULL); create->thread_fn = thread_fn; create->data = data; @@ -65,7 +66,9 @@ static struct process_control_block *__kthread_create_on_node(int (*thread_fn)(v spin_lock(&__kthread_create_lock); list_append(&kthread_create_list, &create->list); spin_unlock(&__kthread_create_lock); - // kdebug("to wakeup kthread daemon..., current preempt=%d, rflags=%#018lx", current_pcb->preempt_count, get_rflags()); + // kdebug("to wakeup kthread daemon..., current preempt=%d, rflags=%#018lx", current_pcb->preempt_count, + + // todo: 使用completion优化这里 while (kthreadd_pcb == NULL) // 若kthreadd未初始化,则等待kthreadd启动 ; // 唤醒kthreadd守护进程 @@ -79,21 +82,21 @@ static struct process_control_block *__kthread_create_on_node(int (*thread_fn)(v pcb = create->result; if (!IS_ERR(create->result)) { - // todo: 为内核线程设置名字 + // 为内核线程设置名字 char pcb_name[PCB_NAME_LEN]; va_list get_args; va_copy(get_args, args); - //获取到字符串的前16字节 + // 获取到字符串的前16字节 int len = vsnprintf(pcb_name, name_fmt, PCB_NAME_LEN, get_args); if (len >= PCB_NAME_LEN) { //名字过大 放到full_name字段中 struct kthread_info_t *kthread = to_kthread(pcb); - char *full_name = kzalloc(1024, __GFP_ZERO); + char *full_name = kzalloc(1024, 0); vsprintf(full_name, name_fmt, get_args); kthread->full_name = full_name; } - //将前16Bytes放到pcb的name字段 + // 将前16Bytes放到pcb的name字段 process_set_pcb_name(pcb, pcb_name); va_end(get_args); } @@ -307,4 +310,21 @@ int kthread_mechanism_init() kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_SIGNAL); return 0; +} + +/** + * @brief 释放pcb指向的worker private + * + * @param pcb 要释放的pcb + */ +void free_kthread_struct(struct process_control_block *pcb) +{ + struct kthread_info_t *kthread = to_kthread(pcb); + if (!kthread) + { + return; + } + pcb->worker_private = NULL; + kfree(kthread->full_name); + kfree(kthread); } \ No newline at end of file diff --git a/kernel/process/process.c b/kernel/process/process.c index c7133ff2..c01a44d5 100644 --- a/kernel/process/process.c +++ b/kernel/process/process.c @@ -1169,14 +1169,19 @@ void process_exit_thread(struct process_control_block *pcb) /** * @brief 释放pcb * - * @param pcb + * @param pcb 要被释放的pcb * @return int */ int process_release_pcb(struct process_control_block *pcb) { + // 释放子进程的页表 + process_exit_mm(pcb); + // 释放子进程的pcb + free_kthread_struct(pcb); kfree(pcb); return 0; } + /** * @brief 申请可用的文件句柄 * diff --git a/kernel/process/process.h b/kernel/process/process.h index feb4c12b..36d196c9 100644 --- a/kernel/process/process.h +++ b/kernel/process/process.h @@ -188,12 +188,6 @@ pid_t kernel_thread(int (*fn)(void *), void *arg, unsigned long flags); int process_fd_alloc(struct vfs_file_t *file); -/** - * @brief 释放pcb - * - * @param pcb - * @return int - */ int process_release_pcb(struct process_control_block *pcb); /** diff --git a/kernel/syscall/syscall.c b/kernel/syscall/syscall.c index 1c16d8a0..225c4bb6 100644 --- a/kernel/syscall/syscall.c +++ b/kernel/syscall/syscall.c @@ -10,7 +10,7 @@ #include #include #include