实验介绍
学号尾数:186
原创作品转载请注明出处 + https://github.com/mengning/linuxkernel/
引例:http://codelab.shiyanlou.com/xref/linux-3.18.6/include/linux/sched.h#1235
参考:https://www.cnblogs.com/fuchen1994/p/5400967.html
实验背景
代码运行在Ubuntu14.04上
虚拟机在Mac的Parallel Desktop上运行。
目标
理解进程创建、可执行文件的加载和进程执行进程切换,重点理解分析fork、execve和进程切换
分析fork函数对应的内核处理过程do_fork,理解创建一个新进程如何创建和修改task_struct数据结构;
使用gdb跟踪分析一个fork系统调用内核处理函数do_fork
理解编译链接的过程和ELF可执行文件格式等
实验步骤
1.阅读进程调度相关代码
代码来源:http://codelab.shiyanlou.com/xref/linux-3.18.6/include/linux/sched.h#1235;
task_struct的结构体
Linux系统是采用链式方式来组织PCB的,对于不同的状态建立起一个进程队列。在Linux内核中,使用一个名为task_struct的结构体来描述PCB.此处仅列出部分结构体的定义代码。
1235 struct task_struct {
1236 volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */
1237 void *stack;
1238 atomic_t usage;
1239 unsigned int flags; /* per process flags, defined below */
1240 unsigned int ptrace;
do_fork函数
Linux中创建进程有三个函