2021-2022-1 20212809《Linux内核原理与分析》第七周作业

操作系统内核三大功能:

  • 操作系统内核三大功能分别是进程管理,内存管理,文件系统。
    其中最核心的是进程管理,而pid是系统区别进程的编号。

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的东西复制过来

然后初始化子进程。

实验

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

 ls
 cd ~/LinuxKernel
 rm menu -rf
 git clone https://github.com/mengning/menu.git
 cd menu 
 mv test_fork.c test.c
 make rootfs
 qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -S -s
 gdb
 (gdb)file linux-3.18.6/vmlinux
 (gdb)target remote:1234

在这里插入图片描述
在这里插入图片描述

do_fork是进程管理中一个最关键的宏

do_fork处理了以下内容:
  • 调用copy_process,将当期进程复制一份出来为子进程,并且为子进程设置相应地上下文信息。
  • 初始化vfork的完成处理信息(如果是vfork调用)
  • 调用wake_up_new_task,将子进程放入调度器的队列中,此时的子进程就可以被调度进程选中,得以运行。
  • 如果是vfork调用,需要阻塞父进程,知道子进程执行exec。
进程创建的关键copy_process,其工作流程如下:
  • 1.检查各种标志位(已经省略)
  • 2.调用dup_task_struct复制一份task_struct结构体,作为子进程的进程描述符。
  • 3.检查进程的数量限制。
  • 4.初始化定时器、信号和自旋锁。
  • 5.初始化与调度有关的数据结构,调用了sched_fork,这里将子进程的state设置为TASK_RUNNING。
  • 6.复制所有的进程信息,包括fs、信号处理函数、信号、内存空间(包括写时复制)等。
  • 7.调用copy_thread,这又是关键的一步,这里设置了子进程的堆栈信息。
  • 8.为子进程分配一个pid
  • 9.设置子进程与其他进程的关系,以及pid、tgid等。这里主要是对线程做一些区分。
copy_thread函数为子进程准备了上下文堆栈信息,其工作流程如下:
  • 获取子进程寄存器信息的存放位置
  • 对子进程的thread.sp赋值,将来子进程运行,这就是子进程的esp寄存器的值。
  • 如果是创建内核线程,那么它的运行位置是ret_from_kernel_thread,将这段代码的地址赋给thread.ip,之后准备其他寄存器信息,退出
  • 将父进程的寄存器信息复制给子进程。
  • 将子进程的eax寄存器值设置为0,所以fork调用在子进程中的返回值为0.
  • 子进程从ret_from_fork开始执行,所以它的地址赋给thread.ip,也就是将来的eip寄存器。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值