《Linux内核分析》第六周学习总结node
——进程的描述和进程的建立linux
姓名:王玮怡 学号:20135116shell
1、理论部分数据结构
(一)进程的描述函数
一、进程描述符task_stuck数据结构(一)学习
操做系统三大功能:进程管理(核心)、内存管理、文件系统spa
PCB task_struct中包含:进程状态、进程打开的文件、进程优先级信息操作系统
进程控制块PCB——进程描述符task_stuck提供了内核所需了解的进程信息线程
Linux进程状态转换图:3d
二、进程描述符task_stuck数据结构(二)
内核把进程的列表存放在任务队列的双向循环链表中
(1)非空双向链表结构
(2)空双向链表结构
(3)进程父子关系
(二)进程建立
一、进程的建立概览及fork一个进程的用户态代码
(1)进程的建立:start_kernel ...cpu_idle -->kernel_init和kthreadd -->0、一、2号进程(其中1号进程是全部用户线程的祖先,2号进程是全部内核线程的祖先)
(2)fork()系统调用:在用户态建立一个子进程
else if和else都会被执行:fork系统调用在父进程和子进程中各会返回一次,在子进程中pid的返回值为0,在父进程中的返回值为子进程的pid。
二、理解进程建立过程发杂代码的方法
建立新进程是经过复制当前进程来实现的,父、子进程大多数信息相同,但有些不一样,如pid、内核堆栈等,而且只复制了一部分(内核堆栈栈底内容,SAVE_ALL部分)。
三、浏览建立进程的相关关键代码
(1)系统调用内核处理函数sys_fork、sys_clone、sysvfork:
fork、vfork和clone三个系统调用均可以建立一个新进程,并且都是经过调用do_fork来实现进程的建立。
(2)do_fork()
(3)copy_procrss()中dup_task_stuck()复制PCB
(4)alloc_thread_info_node()分配内核堆栈空间
(5)copy_thread()中
四、建立的新进程是从哪里开始执行的
p->thread.ip = (unsigned long) ret_from_fork; //调度到子进程时的第一条指令
当子进程得到CPU的控制权开始运行, ret_from_fork可使其出栈从iret返回到子进程用户态。
2、实验部分:使用gdb跟踪建立新进程的过程
一、启动MenuOS,并查看fork功能:
二、gdb调试fork指令
(1)qemu -kernel linux-3.18.6
(3)设置断点
(4)在MenuOS中执行fork,就会发现fork函数停在了父进程中
(5)继续执行以后,停在了do_fork的位置
而后n单步执行,依次进入copy_process、dup_task_struct
按s进入该函数,能够看到dst = src(也就是复制父进程的struct)
(6)在copy_thread中,能够看到把task_pg_regs(p)也就是内核堆栈特定的地址找到并初始化
3、总结
Linux经过复制父进程来建立一个新进程,经过调用do_ fork来实现,并为新建立的进程动态分配一个task_ struct结构。