Update chapter6.md

pull/1/head
Zhiyuan Shao 4 years ago
parent 699c5f11f8
commit 4d06391314

@ -5,9 +5,10 @@
#### 应用: ####
app5.c源文件如下
```
int main(){
if(fork() == 0) {
printf("this is child process;my pid = %d\n",getpid());
}else {
@ -28,7 +29,7 @@ int main(){
完善"pk/proc.c"中的alloc_proc(),你需要对以下属性进行初始化:
```
l enum proc_state state;
l int pid;
@ -52,7 +53,7 @@ l uintptr_t pagetable;
l uint32_t flags;
l char name[PROC_NAME_LEN + 1];
```
@ -250,9 +251,9 @@ l name进程名
144 write_csr(sscratch, kstack_top);
```
在这里声明了一个trapframe并且将它的gpr[2]sp设置为内核栈指针将它的epc设置为current.entry其中current.entry是elf文件的入口地址也就是app的起始执行位置随即我们调用了do_fork函数其中传入参数stack为0表示我们正在fork一个内核进程。
在这里声明了一个trapframe并且将它的gpr[2]sp设置为内核栈指针将它的epc设置为current.entry其中current.entry是elf文件的入口地址也就是app的起始执行位置随即我们调用了do_frok函数其中传入参数stack为0表示我们正在fork一个内核进程。
在do_fork函数中你会调用alloc_proc()来为子进程创建进程控制块、调用setup_kstack来设置栈空间调用copy_mm来拷贝页表调用copy_thread来拷贝进程。现在我们来对以上函数进行分析。
在do_frok函数中你会调用alloc_proc()来为子进程创建进程控制块、调用setup_kstack来设置栈空间调用copy_mm来拷贝页表调用copy_thread来拷贝进程。现在我们来对以上函数进行分析。
setup_kstack函数代码如下在函数中我们为进程分配栈空间然后返回
@ -402,7 +403,7 @@ copy_mm k函数代码如下在函数中我们对页表进行拷贝。
40 ret
```
可以看到在switch_to中我们正执行了上一个进程的上下文保存以及下一个进程的上下文加载。在switch_to的最后一行我们执行ret指令该指令是一条从子过程返回的伪指令会将pc设置为x1ra寄存器的值还记得我们在copy_thread中层将ra设置为forkret嘛现在程序将从forkret继续执行
可以看到在switch_to中我们正执行了上一个进程的上下文保存以及下一个进程的上下文加载。在switch_to的最后一行我们执行ret指令该指令是一条从子过程返回的伪指令会将pc设置为x1ra寄存器的值还记得我们在copy_thread中层将ra设置为forkret嘛现在程序将从forkret继续执行
```
160 static void

Loading…
Cancel
Save