fork系统调用过程
来源:互联网 发布:淘宝子账号有什么用 编辑:程序博客网 时间:2024/06/06 17:32
又是查找资料,又是看源码,折腾了大半天,终于把fork的过程弄完了,但是后面的跟踪状态还不太懂,等具体后面弄清楚了,再加上。内核是2.6.11版本的。fork()系统调用:我们运行一个系统调用时,系统将调用宏指令_syscall0
#define _syscall0(type,name) \ type name(void) \ { \ register long __a __asm__ ("r10"); \ register long __n_ __asm__ ("r9") = (__NR_##name); \ __asm__ __volatile__ (".ifnc %0%1,$r10$r9\n\t" \ ".err\n\t" \ ".endif\n\t" \ "break 13" \ : "=r" (__a) \ : "r" (__n_)); \ if (__a >= 0) \ return (type) __a; \ errno = -__a; \ return (type) -1; \ }
进而,调用0x80号中断,中断0x80 把调用(控制)传给核心入口地址中的system_call()负责保护所有的寄存器,并检查系统调用是否合法,如果合法那么根据从sys_call_table中找出的偏移量,把控制权转给真正的系统。当用户调用INT 0x80而进入system_call函数后,首先检查用来存放系统调用编号的eax的值是否超出IDT表的项数NR_syscalls如没有超出的话,就根据eax的值从系统调用表(sys_call_table)中得到对应的系统调用入口,并通过call 指令转入各个具体函数(sys_*)的处理过程。)对esp和eip进行处理,使其指向内核栈。然后把寄存器eax中的系统调用号入栈。然后当切换到到内核态后,内核根据系统调用号来查找到对应的系统调用处理例程的函数名(sys_fork),从而找到对应的代码入口址。
long sys_fork(void){ long ret; current->thread.forking = 1; ret = do_fork(SIGCHLD, 0, NULL, 0, NULL, NULL); current->thread.forking = 0; return(ret);}
这里面current->thread.forking 记录了进程复制的过程,与复制本身无关。 sys_fork(void)中调用do_fork()函数。 long do_fork(unsigned long clone_flags, unsigned long stack_start, struct pt_regs *regs, unsigned long stack_size, int __user *parent_tidptr, iner *cild_tidptr )do_fork()中首先通过查找pidmap_array位图,为子进程分配新的pidlong pid = alloc_pidmap();copy_process复制进程描述符.如果所有必须的资源都是可用的,该函数返回刚创建的task_struct描述符的地址. 这是创建进程的关键步骤.
struct task_struct *p;p = copy_process(clone_flags, stack_start, regs, stack_size, parent_tidptr, child_tidptr, pid);
如果父子进程运行在同一个CPU上,并且不能共享同一组页表(CLONE_VM标志被清0).那么,就把子进程插入父进程运行队列.并且子进程插在父进程之前.这样做的目的是:如果子进程在创建之后执行新程序,就可以避免写时复制机制执行不必要时页面复制.否则,如果运行在不同的CPU上,或者父子进程共享同一组页表.就把子进程插入父进程运行队列的队尾.
阅读全文
0 0
- fork系统调用过程
- fork系统调用的执行过程
- 分析fork函数对应的系统调用处理过程
- fork系统调用
- fork()系统调用
- linux fork系统调用
- fork系统调用
- 系统调用分析:fork
- Linix fork系统调用
- linux 系统调用fork
- fork 系统调用
- Linux fork()系统调用
- fork系统调用
- fork()系统调用函数
- fork系统调用
- 浅析fork系统调用
- 系统调用fork()函数
- 用fork系统调用,clone系统调用
- C++ STL priority_queue
- activity之间传递bitmap大小超过40M的解决办法
- python 安装
- 第三章 内核对象
- 大规模模型绘制的优化思路
- fork系统调用过程
- Unity3D学习记录——API工具类2
- Redis简介-安装-Spring-SpringBoot集成教程
- Allegro导出PCB封装文件和焊盘文件
- Intellij Idea-统一显示SpringMVC请求和处理方法映射列表
- 如何选择合适的UI培训学校
- [Ubuntu 14.04] Samba创建文件出现Connection Abort 或者Window资源管理器访问samba崩溃问题
- spring-mvc4配置和使用
- hihoCoder #1319 : 区域周长