Linux内核分析

Linux内核的启动过程初见

2017-03-11  本文已影响51人  athorn

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

讲真,因为启动过程太复杂,这个博客很难写,想了几天,不知道从哪里开始讲起。不过,不开始,永远不知道有多难写,那么就试试看。
***一般的学习主线是:Start_kernel(); –> rest_init(); -> kernel_init(); ***

在写的过程中,感觉到自己文字的生硬,完全是硬解,而不能算得上是真的理解。

内核代码交叉引用链接
在本地制作Menu OS,成功。



惯例,实验步骤如下:

cd LinuxKernel/
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S
# 关于-s和-S选项的说明:
# -S freeze CPU at startup (use ’c’ to start execution)
#-s shorthand for -gdb tcp::1234 若不想使用1234端口,则可以使用-gdb tcp:xxxx来取代-s选项
gdb
(gdb)file linux-3.18.6/vmlinux # 加载符号表
(gdb)target remote:1234 # 建立gdb和gdbserver之间的连接
(gdb)b start_kernel # 在start_kernel处设置断点
(gdb)c # 继续运行

如下:



从上图可以看得出来,系统已经停止在了start_kernel处,接下来便是我们要分析的地方。

首先是lockdep_init,只是初始化一次hash表。
紧接着的是[set_task_stack_end_magic]((http://lxr.free-electrons.com/ident?v=3.18;i=set_task_stack_end_magic)(&init_task);从下图看得到,意图很简单,仅仅是为init_task设置堆栈的边界点,所谓的魔数,用来防止堆栈溢出。

对于单CPU,smp_setup_processor_id无作用。
接下来debug_objects_early_init,初始化buckets,即obj_hash。把static object pool数组的元素初始化成链表;
boot_init_stack_canary,初始化带防止栈溢出攻击保护的堆栈;
cgroup_init_early,初始化cgroup以及需要尽早启动的子系统;
local_irq_disable,关闭当前CPU的所有中断响应;





跟踪调试的时候,发现总是不执行到下面的这一段语句:

if (!try_to_run_init_process("/sbin/init") ||  
!try_to_run_init_process("/etc/init") ||  
!try_to_run_init_process("/bin/init") ||  
!try_to_run_init_process("/bin/sh"))

run_init_process又调用do_execve。


到汇编了,就跟不下去了。可以用ni,si。

先到这里吧,慢慢品味。

上一篇 下一篇

猜你喜欢

热点阅读