X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/61a1daa59589212608039e2734009870818bacd3..f13e160f6aa2f74895ecf1f65099265643836210:/lunaix-os/kernel/process/process.c?ds=inline diff --git a/lunaix-os/kernel/process/process.c b/lunaix-os/kernel/process/process.c index e30e461..9cef1f8 100644 --- a/lunaix-os/kernel/process/process.c +++ b/lunaix-os/kernel/process/process.c @@ -123,7 +123,7 @@ __DEFINE_LXSYSCALL2(int, setpgid, pid_t, pid, pid_t, pgid) struct proc_info* gruppenfuhrer = get_process(pgid); - if (!gruppenfuhrer || proc->pgid == proc->pid) { + if (!gruppenfuhrer || proc->pgid == gruppenfuhrer->pid) { __current->k_status = EINVAL; return -1; } @@ -142,9 +142,12 @@ init_proc_user_space(struct proc_info* pcb) /*--- 分配用户栈 ---*/ + struct mm_region* stack_vm; + + stack_vm = region_create( + USTACK_END, USTACK_TOP, REGION_RW | REGION_RSHARED | REGION_ANON); // 注册用户栈区域 - region_add( - &pcb->mm.regions, USTACK_END, USTACK_TOP, REGION_RW | REGION_RSHARED); + region_add(&pcb->mm.regions, stack_vm); // 预留地址空间,具体物理页将由Page Fault Handler按需分配。 for (uintptr_t i = PG_ALIGN(USTACK_END); i < USTACK_TOP; i += PG_SIZE) { @@ -196,6 +199,13 @@ dup_proc() pcb->intr_ctx = __current->intr_ctx; pcb->parent = __current; + memcpy(pcb->fxstate, __current->fxstate, 512); + + if (__current->cwd) { + pcb->cwd = __current->cwd; + vfs_ref_dnode(pcb->cwd); + } + __copy_fdtable(pcb); region_copy(&__current->mm.regions, &pcb->mm.regions); @@ -204,7 +214,7 @@ dup_proc() // 根据 mm_region 进一步配置页表 struct mm_region *pos, *n; - llist_for_each(pos, n, &pcb->mm.regions.head, head) + llist_for_each(pos, n, &pcb->mm.regions, head) { // 如果写共享,则不作处理。 if ((pos->attr & REGION_WSHARED)) {