fork 和 写时拷贝
fork
1.fork是一个系统调用,父进程调用fork,触发软中断,然后陷入内核,将cpu寄存器保存在内核栈中,去中断向量表中找软中断处理函数,然后软中断处理函数根据寄存器里的系统调用号,去系统调用表里执行对应系统调用。创建子进程pcb,拷贝父进程内核栈,将父进程内核栈里的eax,也就是返回值寄存器里的值改成子进程pid,将子进程内核栈里eax的值改成0,然后将pcb加入运行队列
2.父进程fork系统调用执行完后从内核栈中恢复寄存器,然后返回用户态
3.创建子进程pcb时,会浅拷贝父进程的mm_struct和files_struct,共享父进程的数据和代码。将pcb里pc指针改成fork后的指令
4.子进程调度后开始从内核栈恢复寄存器,然后返回用户态
写时拷贝
fork创建子进程时pcb的mm_struct采用浅拷贝的模式,也就是说虚拟地址空间结构(vm_area_struct)和页表映射物理页(页表)父子进程是一样的,而且拷贝后会将父子进程的页表权限全部设为只读,当其中一个进程往某个地址写入时,mmu硬件找虚拟地址对应页表项,查看权限时是只读,mmu硬件会缺页异常,硬件电路已经编好了出现缺页异常怎么做了,就是cpu会陷入内核,执行14号中断函数