|
|
|
@ -557,7 +557,7 @@ user/app_naive_fork.c --> user/user_lib.c --> kernel/strap_vector.S --> kernel/s
|
|
|
|
|
206 }
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
该函数使用第175--205行的循环来拷贝父进程的逻辑地址空间到其子进程。我们看到,对于trapframe段(case CONTEXT_SEGMENT)以及堆栈段(case CODE_SEGMENT),do_fork()函数采用了简单复制的办法来拷贝父进程的这两个段到子进程中,这样做的目的是将父进程的执行现场传递给子进程。
|
|
|
|
|
该函数使用第175--205行的循环来拷贝父进程的逻辑地址空间到其子进程。我们看到,对于trapframe段(case CONTEXT_SEGMENT)以及堆栈段(case STACK_SEGMENT),do_fork()函数采用了简单复制的办法来拷贝父进程的这两个段到子进程中,这样做的目的是将父进程的执行现场传递给子进程。
|
|
|
|
|
|
|
|
|
|
然而,对于父进程的代码段,子进程应该如何“继承”呢?通过第187--195行的注释,我们知道对于代码段,我们不应直接复制(减少系统开销),而应通过映射的办法,将子进程中对应的逻辑地址空间映射到其父进程中装载代码段的物理页面。这里,就要回到[实验2内存管理](chapter4_memory.md#pagetablecook)部分,寻找合适的函数来实现了。注意对页面的权限设置(可读可执行)。
|
|
|
|
|
|
|
|
|
|