Linux内核的启动过程简述

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


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

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

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

wKioL1UKkNizN6ktAAF_bZQweN4119.jpg

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

wKiom1UKkLqzFjbEAAE0l1TvVOY867.jpg

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

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

wKiom1UKk7jjHM-YAAKGigLP4IU127.jpg

执行几次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命令继续执行如下:

wKiom1UKmFLhd3TZAAT2GHOfgBE995.jpg

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

wKiom1UKmrGhFglnAAI7y_P8DUQ125.jpg

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章