用fork创建进程
除了进程0,其它所有的进程都是fork产生的。子进程是通过复制父进程的数据和代码产生的。创建结束后,子进程和父进程的代码段、数据段共享。但是子进程有自己的进程控制块、内核堆栈和页表。
我们知道一个进程需要有如下3个结构
1.task[]数组中的一项,即进程控制块(task_struct)
2.GDT中的两项,即TSS段和LDT段描述符
3.页目录和页表
所以fork()的任务就是为一个新进程构造这3个结构。
sys_fork() 系统调用的实现在2个文件中。fork.c中的全部和system_call.s中_sys_fork。sys_fork()系统调用分成2步完成,第一步调用函数find_empty_process(),在task[]数组中找一项空闲项,第二步调用copy_process() 函数,复制进程。
sys_fork() 入口
_sys_fork:
// 第一步,调用find_empty_process()函数,找task[]中的空闲项。
// 找到后数组下标放在eax中。如果没找到直接跳转到ret指令。
call _find_empty_process
testl %eax,%eax
js 1f
push %gs // 中断时没有入栈的寄存器入栈,
// 作为copy_process() 函数的参数
pushl %esi
pushl %edi
pushl %ebp
pushl %eax
// 第二步,调用copy_process() 函数复制进程。
call _copy_process
addl $20,%esp
1: ret
程序调用copy_process() 函数时,
当前进程内核堆栈的情况如下:
分享到:
相关推荐
linux-0.11-060618-gcc4.tar.gz,基础代码 --》在上面修改编译在ubuntu12.04运行的linux0.11系统比较方便
sourceinlight4
赠送jar包:eclipse-collections-forkjoin-7.1.2.jar; 赠送原API文档:eclipse-collections-forkjoin-7.1.2-javadoc.jar; 赠送源代码:eclipse-collections-forkjoin-7.1.2-sources.jar; 赠送Maven依赖信息文件:...
创建新进程:fork函数:fork函数干什么? fork函数与vfork函数的区别在哪里?为何在一个fork的子进程分支中使用_exit函数而不使用exit函数?
linux内核 do_fork 函数源代码浅析。 经典讲解!
linux_fork函数
赠送jar包:eclipse-collections-forkjoin-7.1.2.jar; 赠送原API文档:eclipse-collections-forkjoin-7.1.2-javadoc.jar; 赠送源代码:eclipse-collections-forkjoin-7.1.2-sources.jar; 赠送Maven依赖信息文件:...
linux 0.11源码,有注释,学习侵入式的好文档,对了解linux系统机制有好处
本课程介绍Linux0.11版本内核如何人工设置第一个任务(task 0)以及任务0从内核态切换到用户态的详细过程。包括全局描述符表中的TSS0描述符和LDT0描述符的创建过程。与引导过程中全局描述符表及局部描述符表的创建过程...
Linux进程控制编程-fork子进程创建实例.pdf 学习资料 复习资料 教学资源
linux下的fork函数机理说明和用法。非常详细和生动。
* 我们需要下面这些内嵌语句 - 从内核空间创建进程(forking)将导致没有写时复制(COPY ON WRITE)!!! * 直到一个执行execve 调用。这对堆栈可能带来问题。处理的方法是在fork()调用之后不让main()使用 * 任何堆栈...
前端开源库-swint-forkswint fork、swint的进程行为(fork、代码块的公共/单独执行等)管理器
Laravel开发-laravel-translatable-fork-dimsav 多语言模型的Laravel包
前端开源库-node-minify-custom-fork节点小型定制fork,基于babili/yui压缩器/google闭包编译器/uglifyjs2/sqwish/clean css/csso的javascript/css小型化器
前端开源库-sails-hook-autoreload-fork帆钩自动加载叉,帆JS钩自动加载控制器和模型时,改变。
pandas-stubs-fork-1.5.3.230203.tar.gz
pandas-stubs-fork-1.5.1.221024.tar.gz
pandas-stubs-fork-1.5.3.230214.tar.gz
python库。 资源全名:pynput-robocorp-fork-1.7.4.tar.gz