系统调用
简单描述:产生中断,陷入内核
详细描述:调用函数;产生0x80中断;不能继续执行main程序,被替换下去;将对应系统调用号写入eax寄存器中;在进行现场保护;陷入内核,在系统调用表中寻找eax中存放的系统调用号;将找到的返回值写回eax中;这样就得到了最终的返回值,完成了系统调用。
Fork的实现
Fork
Vfork
Clone 都是通过do_fork实现
实现流程:
在一开始,该函数定义了一个task_struct类型的指针p,用来接收即将为新进程(子进程)所分配的进程描述符。紧接着使用alloc_pidmap函数为这个新进程分配一个pid。由于系统内的pid是循环使用的,所以采用位图方式来管理。简单的说,就是用每一位(bit)来标示该位所对应的pid是否被使用。分配完毕后,判断pid是否分配成功。
通过copy_process()创建子进程的描述符,并创建子进程执行时所需的其他数据结构,最终则会返回这个创建好的进程描述符。
1.复制进程描述符
Struct task_struct; 进程描述符/进程控制块(pcb)
最多32768
1)为子进程分配新的pid
- 2)复制父进程的所有属性和资源
最重要的一步:copy_process的过程
2.1)
通过dup_task_struct()为子进程分配一个内核栈、thread_info结构和task_struct结构。注意,这里将当前进程描述符指针作为参数传递到此函数中。
2.2)调用一些copy_*函数来创建新的数据结构,并把父进程的相应的数据结构的值复制到新的数据结构中
2.3)??子进程eax被设置为0,所以子进程pid=0
子进程和父进程共享时间片,不占用其他空间.