2020-2021-1 20212824《Linux内核原理与分析》第四周作业

问题1:没有compiler-gcc7.h

在这里插入图片描述
解决方法如下图
在这里插入图片描述

问题2 git代码的时候连不上github

在这里插入图片描述
解决如下图 修改一下网址
https->git
在这里插入图片描述

问题3:在自己的机器上不能进行32位编译

在这里插入图片描述
解决如下图 下载俩东西
在这里插入图片描述
在这里插入图片描述

然后就可以跑起来了

在这里插入图片描述

问题4

在这里插入图片描述
解决方案
在这里插入图片描述

重新编译Linux内核

make menuconfig

  • kernal hacking
    • compile-time checks and compile options
      • compile the kernel with debug info

按照这个目录把compile the kernel with debug info打上*
在这里插入图片描述

二次编译
在这里插入图片描述

启动,冻结

qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd -S -s
-Scpu初始化之前冻结起来
-s在1234端口上创建了一个gdb-server
在这里插入图片描述

gdb调试

在这里插入图片描述

设置断点,并执行到第一个断点

断点设置在 start_kernel
在这里插入图片描述

执行到第二个断点

断点设置在rest_init
在这里插入图片描述

分析一下main.c代码

linux-3.18.6/init/main.c
在这里插入图片描述

start_kernel

set number vim 显示行号
:500跳转到某行
在这里插入图片描述
init_task是0号进程

rest_init

在这里插入图片描述
(403行)kernel_thread创建1号进程
(405行)用kernel_thread执行kthreadd ,创建pid=2的2号进程

其他

  • rest_init 创建了一号进程
  • cpu_startup_entry
    • cpu_idle_loop 0号进程,系统没有调度时就执行这个

总结

init_task()(PID=0)在创建了init进程后,调用cpu_idle
演变成idle进程,执行一次调度后,init进程执行。
最后调用do_execve加载init程序,演变成init进程(用户态1号进程)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值