第6节 分析Linux内核创建一个新进程的过程【Linux内核分析】

原创作品转载请注明出处 +《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

一、实验要求

根据本周所学知识分析fork函数对应的系统调用处理过程

二、实验内容

  • 阅读理解task_struct数据结构http://codelab.shiyanlou.com/xref/linux-3.18.6/include/linux/sched.h#1235

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

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

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

三、实验环境

本地linux环境(ubuntu14.04 64bit)

主要优点:使用方便,方便保存,不受网络影响。

四、实验过程

1. 在本地搭建环境

以前都是在虚拟机上完成的实验,这次就在本地搭建了实验环境,大部分过程参考孟老师的教程

为了方便查看,特在此将完整过程写下,使用自己的Linux系统环境搭建MenuOS的过程:

    # 下载内核源代码编译内核
    cd ~/LinuxKernel/
    wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.18.6.tar.xz
    xz -d linux-3.18.6.tar.xz
    tar -xvf linux-3.18.6.tar
    cd linux-3.18.6
    make i386_defconfig
    make # 一般要编译很长时间,少则20分钟多则数小时

    # 制作根文件系统
    cd ~/LinuxKernel/
    mkdir rootfs
    git clone https://github.com/mengning/menu.git  # 如果被墙,可以使用附件menu.zip 
    cd menu
    gcc -o init linktable.c menu.c test_fork.c -m32 -static –lpthread
    cd ../rootfs
    cp ../menu/init ./
    find . | cpio -o -Hnewc |gzip -9 > ../rootfs.img

    # 启动MenuOS系统
    cd ~/LinuxKernel/
    qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img

注意:
制作根文件系统,如果你的系统是新安装的,那么很可能就无法制作成功,会出现错误

/usr/include/features.h:374:25: 
fatal error: sys/cdefs.h: No such file or directory

原因很简单,就是因为缺少c/c++的函数库。运行下面两句代码,完成库的安装

sudo apt-get install gcc-multilib
sudo apt-get install g++-multilib

解决方法参考自:64bit Linux tries to compile 32bit and fails

2.启动MenuOS

打开shell终端,执行以下命令:

cd LinuxKernel

rm -rf menu

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

cd menu

mv test_fork.c test.c

make rootfs

这里写图片描述

3.调试MenuOS

通过增加-s -S启动参数打开调试模式

qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S

打开gdb进行远程调试

gdb

file linux-3.18.6/vmlinux

target remote:1234

这里写图片描述

设置断点

b sys_clone

b do_fork

b dup_task_struct

b copy_process

b copy_thread

b ret_from_fork

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值