Linux内核的启动过程简述

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


    其实对于Linux算是很熟悉了,最近五年的工作电脑就安装的Ubuntu系统,由于毕竟工作时Windows还离不开,于是就在主机下虚拟个windows XP系统,解决必须用windows的工作。尽管这样,对于内核的启动过程其实一无所知,只是看到启动过程不断输出信息,然后等待shell的登陆界面。这次通过学习,也算略有了解,就把老师要求的实验过程记录一遍,也加深自己的印象。

    虚拟机中的电脑没有成功,最后还是直接使用实验楼的环境,把分析过程记录一下:

    直接启动可调试模式。系统停止在内核加载之前。

技术分享

   按下Ctrl+Shift+T开启另一个终端窗口。启动gdb,加载内核代码,连接远程端口1234。

技术分享

设置断点break start_kernel,c命令继续执行,可以看到虚拟机启动窗口中,操作系统停止在Booting the Kernel。

在gdb中执行list命令可以查看当前执行的代码。

技术分享

执行几次list命令,可以看见start_kernel中的初始化函数,有些名字就说明了作用,同时代码开始处也都进行了说明。如

boot_cpu_init();

page_address_init();

trapf_init();

内存管理初始化

mm_init();

核心进程调度器初始化,其优先级要高于任何中断,初始化进程0,也就是idle进程

sched_init();

init_IRQ();

init_timer();

console_init();

pidmap();

任务系统初始化

cred_init();

buffer_init();

key_init();

再设置一个断点break rest_init,c命令继续执行如下:

技术分享

直接执行完启动过程,出现老师改造过的简单界面menuos。可以执行3个命令,其它输入都会提示“This is a wrong cmd!

技术分享

    总结,Linux内核启动有次引导程序Grub将内核代码(内核映像)加载到内存,取得系统控制权,执行start_kernel中的相应代码,完成系统的各种初始化处理,进入idle进程,也就是0好进程,在linux进程列表中看不到,然后调用init作为系统的1号进程,完成系统环境的设置。init进程成为所有进程的父进程,进入人机交互方式,出现我们熟悉的界面,完成内核的启动。

本文出自 “StudyPark” 博客,请务必保留此出处http://swordautumn.blog.51cto.com/1485402/1622315

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。