问题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
-S
cpu初始化之前冻结起来
-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号进程)