From f886476139da26762e252834007d02af4881f589 Mon Sep 17 00:00:00 2001 From: ridethepig Date: Wed, 23 Nov 2022 22:54:45 +0800 Subject: [PATCH] forkbomb over 10W, god knows still some conflicts? --- kern/fork.c | 7 +++++-- kern/wait.c | 7 +++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/kern/fork.c b/kern/fork.c index b42b4d0..479e3bd 100644 --- a/kern/fork.c +++ b/kern/fork.c @@ -127,6 +127,8 @@ kern_fork(PROCESS_0 *p_fa) xchg(&p_fa->lock, 0); return -EAGAIN; } + while (xchg(&proc_child->pcb.lock, 1) == 1) + schedule(); PROCESS_0 *p_child = &proc_child->pcb; // 再之后你需要做的是好好阅读一下pcb的数据结构,搞明白结构体中每个成员的语义 // 别光扫一遍,要搞明白这个成员到底在哪里被用到了,具体是怎么用的 @@ -154,17 +156,17 @@ kern_fork(PROCESS_0 *p_fa) p_child->exit_code = p_fa->exit_code; // p_child->fork_tree // p_child->kern_regs - p_child->lock = 0; + // p_child->lock // p_child->page_list p_child->pid = i; p_child->priority = p_fa->priority; p_child->statu = INITING; //! important!!! if you copied this from parent, haha, waste one hour p_child->ticks = p_fa->ticks; p_child->user_regs = p_fa->user_regs; + ENABLE_INT(); //? 2. ALLOC PAGES AND COPY PHYSICAL MEMORY copy_parent_pages(p_child, p_fa); // panic("Unimplement! soul torture1"); - ENABLE_INT(); //? 3. SET restart point // //! maybe, kern stack different, use offset relevant to stack base addr to set child's kern esp // u32 esp_off = p_fa->kern_regs.esp - (u32)p_fa; @@ -196,6 +198,7 @@ kern_fork(PROCESS_0 *p_fa) p_fa->fork_tree.sons = p_son; // 最后你需要将子进程的状态置为READY,说明fork已经好了,子进程准备就绪了 p_child->statu = READY; + xchg(&p_child->lock, 0); xchg(&p_fa->lock, 0); // 在你写完fork代码时先别急着运行跑,先要对自己来个灵魂拷问 // 1. 上锁上了吗?所有临界情况都考虑到了吗?(永远要相信有各种奇奇怪怪的并发问题) diff --git a/kern/wait.c b/kern/wait.c index 94992f6..e958e5d 100644 --- a/kern/wait.c +++ b/kern/wait.c @@ -33,12 +33,11 @@ kern_wait(int *wstatus) // wait系统调用与exit系统调用关系密切,所以在实现wait之前需要先读一遍exit为好 // 可能读完exit的代码你可能知道wait该具体做什么了 // panic("Unimplement! Read The F**king Source Code"); - +again: + while (xchg(&p_proc_ready->pcb.lock, 1) == 1) + schedule(); PROCESS_0 *p_fa = &p_proc_ready->pcb; int child_pid = -1; -again: - while (xchg(&p_fa->lock, 1) == 1) - schedule(); struct son_node* p_son = p_fa->fork_tree.sons; if (p_son == NULL) { xchg(&p_fa->lock, 0);