Linux进程的创建图文教程,分析Linux内核创建一个新进程的过程

分析Linux内核创建一个新进程的过程

攥写人:杨光  学号:20135233

( *原创作品转载请注明出处*)

( 学习课程:《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-100

知识点及分析:

***操作系统内核三大功能:

进程管理,内存管理,文件系统

最核心的是进程管理

pid是系统区别进程的编号

***linux进程的状态和操作系统原理的描述进程状态有所不同,比如就绪状态和运行状态都是TASK_RUNNING。(这个表示它是可运行的,但是实际上有没有在运行取决于它是否占有CPU)

***Linux通过复制父进程来创建一个新进程

fork函数,具体的过程:

复制一个PCB——task_struct

要给新进程分配一个新的内核堆栈

ti = alloc_thread_info_node(tsk, node);

tsk->stack = ti;

setup_thread_stack(tsk, orig); //这里只是复制thread_info,而非复制内核堆栈

要修改复制过来的进程数据,比如pid、进程链表等,见copy_process内部。

*childregs = *current_pt_regs(); //复制内核堆栈

childregs->ax = 0; // 子进程的fork返回0

p->thread.sp = (unsigned long) childregs; //调度到子进程时的内核栈顶

p->thread.ip = (unsigned long) ret_from_fork; //调度到子进程时的第一条指令地址

系统调用内核处理函数sys_fork,sys_vfrok,sys_clone,其实最终执行的都是do_fork

do_fork里有:

copy_process

dup_task_struct // 复制pcb

alloc_thread_info_node // 创建了一个页面,其实就是实际分配内核堆栈空间的效果。

setup_thread_stack // 把thread_info的东西复制过来

之后初始化子进程***创建的新进程是从哪里开始执行的--》ret_from_fork

*childregs = *current_pt_regs(); 复制内核堆栈(复制的pt_regs,是SAVE_ALL中系统调用压栈的那一部分。)

childregs->ax = 0; 子进程的fork返回0

p->thread.sp = (unsigned long) childregs; 调度到子进程时的内核栈顶

p->thread.ip = (unsigned long) ret_from_fork; 调度到子进程时的第一条指令地址

ip指向的是ret_from_fork,所以是从这里开始执行的。

实验要求:

分析fork函数对应的内核处理过程sys_clone,理解创建一个新进程如何创建和修改task_struct数据结构;

使用gdb跟踪分析一个fork系统调用内核处理函数sys_clone ,验证您对Linux系统创建一个新进程的理解,推荐在实验楼Linux虚拟机环境下完成实验。

特别关注新进程是从哪里开始执行的?为什么从哪里能顺利执行下去?即执行起点与内核堆栈如何保证一致。

实验过程:

删除原来的menu,并clone新的menu,用test_fork.c覆盖test.c

d8ce084ead28515f9cd79b4382a13b6c.png

make rootfs之后新的内核启动,测试fork功能

45f3ffbbbaa6cf8064429ed89f517237.png

使用-s -S冷冻内核,准备调试

0b0301536c8f624e244c40fca65a2e0b.png

a190474d3d50de5e93e92bb7919d6f40.png

gdb

a12316c01ccb899400aaec543c4f2d30.png

加载符号表,配置端口

ea8a1f4459cf3e42f24e72c588efadf1.png

设置断点

29c9ae8fb0be1040bce377b9ddc33546.png

6915f95c734b5c5354d43e031ea8b49f.png

根据断点,进行跟踪,得到结果

5cff5af2f0ddddff21982af49641b3e4.png

6d2e610b2097c682f6e8f7dfb7c2785b.png

c2f81607bdfd27c7c64859ce17f1c2bb.png

ef5c4e1b3c1d4e101f4789c86260b32b.png

735833bc28899059d2654d002864c587.png

9f634b8d0397b5c3c8a8f0576cbb7cd8.png

906fcfc66d1e167fd018b9559d38df4f.png

405b8cbf8b385d99801a0150389f5380.png

来源:https://www.cnblogs.com/yg137565645/p/5340874.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值