Linux内核分析——跟踪分析Linux内核的启动过程

张瑜
《Linux内核分析》MOOC课程
http://mooc.study.163.com/course/USTC-1000029000

一、实验过程:

实验内容为使用gdb跟踪调试内核从start_kernel到init进程启动

1.根据实验指导按照过程,在实验楼环境下打开shell:

cd LinuxKernel/

qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img
这里写图片描述

输入help指令:

2.使用gdb跟踪调试内核:

qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S
这里写图片描述

3.另开一个shell窗口,输入gdb指令:

这里写图片描述

设置断点:

这里写图片描述

这里写图片描述
4.输入list指令:

这里写图片描述

二、分析start_kernel函数的执行过程

start_kernel( )函数完成了Linux内核的初始化工作。每个内核部件都是用这个函数进行初始化的。

1.调用sched_init()函数来初始化调度程序

2.调用build_all_zonelists()函数俩初始化内存管理

3.调用page_alloc_init()函数来初始化伙伴系统分配程序

4.调用trap_init()函数和init_IRQ()函数以初始化IDT

5.调用softing_init()函数初始化TASKLET_SOFTIRQ和HI_SOFTIRQ(软中断)

6.调用time_init()初始化系统日期时间

7.调用kmem_cache_init()函数初始化slab分配器(普通和高速缓存)

8.调用calibrate_delay()函数用于确定CPU时钟(延迟函数)

9.调用kernel_thread()函数为进程1创建内个线程,这个内核线程又会创建其他的内核线程并执行/sbin/init程序

10.在start_kernel()开始执行之后会显示linux版本,除此之外,在init程序和内核线程执行的最后阶段还会显示很多其他信息。最后,就会在控制台上出现熟悉的登陆提示,通知用户Linux内核已经启动正在运行。

三、对“Linux系统启动过程”的理解。

1.进程1又称为init进程,是所有用户进程的祖先由进程0在start_kernel调用rest_init创建init进程PID为1,当调度程序选择到init进程时,init进程开始执行kernel_init ()函数init是个普通的用户态进程,它是Unix系统内核初始化与用户态初始化的接合点,它是所有用户进程的祖宗。在运行init以前是内核态初始化,该过程(内核初始化)的最后一个动作就是运行/sbin/init可执行文件总体来说,这里是几乎各种子系统的诞生之地。

2.idle进程完成重要子系统初始化后,就退居二线。1号进程从0号进程fork出来,然后又切换到用户态,完成控制权从核心态到用户态的转换,因此用户交互才能开始。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值