2024-2025-1 20242828 《Linux内核原理与分析》第七周作业

2024-2025-1 20242828 《Linux内核原理与分析》第七周作业

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

实验内容

  • 阅读理解 task_struct 数据结构 https://github.com/torvalds/linux/blob/v3.18-rc6/include/linux/sched.h#L1235;

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

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

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

fork():

  • 它用于创建一个新的进程,称为子进程,而调用 fork 的进程称为父进程。
  • 这个新创建的子进程是父进程的副本,拥有相同的代码和几乎相同的内存,但有自己独立的执行路径。

实验步骤:

1、打开实验楼的虚拟机,进入LinuxKernrl,删除原有的menu,重新克隆menu

git clone http://github.com/mengning/menu.git

图

2、进入menu目录,用test_fork.c覆盖test.c

3、输入make roofts命令进入MenuOS,并使用help查看现有的命令

4、回到LinuxKernel目录,启动内核

cd LinuxKernel   //返回LinuxKernel目录
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S  //启动内核

图

5、打开另一个终端,LinuxKernel进入目录,启动gdb,加载内核,建立连接

file linux-3.18.6/vmlinux
target remote:1234 //建立连接

图

6、在sys_clone、do_fork、dup_task_struct、copy_process、copy_thread、ret_from_fork处设置断点

7、执行程序,使其停留在do_fork、dup_task_struct,最后进入dup_task_struct

在 Linux 系统中,可以通过调用系统调用 fork() 来创建新进程。fork() 是一个关键的系统调用,它的作用是创建一个当前进程的副本,即“子进程”。这个子进程会继承父进程的所有内容,包括变量、环境、打开的文件描述符等。

具体流程

  • 当一个进程调用 fork() 时,操作系统会为新进程分配一块新的地址空间,复制父进程的内容到子进程中。
  • fork()会返回两次:
    • 在父进程中返回子进程的 PID(进程ID),这有助于父进程区分子进程并进行进程控制。
    • 在子进程中返回 0,这样子进程可以识别出自己是子进程而非父进程。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值