Linux内核分析第三周——构造一个简单的Linux系统MenuOS
构造一个简单的Linux系统MenuOS
李雪琦 + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
计算机三个法宝:
- 1、存储程序计算机
- 2、函数调用堆栈
- 3、中断
操作系统两把宝剑:
- 1、中断上下文的切换:保存现场和恢复现场
- 2、进程上下文的切换
一、阅读Linux内核代码
本周我们要学习如何阅读Linux内核源代码,首先打开Lstest Stable Kernel:linux-3.18.6。
arch/目录在Linux内核中占有相当庞大的代码量,因为Linux支持很多CPU,这个arch/x86目录下的代码是我们重要关注的代码。

根目录中比较关键的目录:
- Documentation/文档
- fs/文件系统
- init/内核启动相关的代码基本都在init目录下,里面的main.c是整个Linux内核启动的起点。它的起点是start_kernel
start_kernel函数相当于普通C程序的main函数。

- ipc/进程间通信
- kernel/Linux内核的核心代码在kernel目录中
- lib/公用的库文件
- mm/memmory management内存管理
- net/与网络相关的代码
- security/与安全相关的代码
- scripts/脚本
二、构造一个简单的Linux系统MenuOS
使用实验楼的虚拟机打开shell。linux-3.18.6.tar就是内核源代码,rootfs里面有用menu编译好的init可执行文件,rootfs.img是它生成的。输入help会有以下三条命令。
使用gdb跟踪调试内核
输入以下命令
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -S -s
- S表示:在CPU初始化之前,冻结CPU
- s表示在:1234端口上创建一个tcp接口
水平分割,再打开一个shell窗口,输入gdb
输入(gdb)file linux-3.18.6/vmlinux
在targe remote之前加载符号表
Reading后,连接到刚启动的被冻结的linux系统,设置断点,把内核启动的起点start_kernel设为断点,在init/main.c文件中,第501行
输入c,回车,系统从冻结状态开始执行,启动。
输入list,可以看见start_kernel代码上下的这段代码
再设一个断点rest_init,按c继续执行
系统已经执行到rest_init
输入list,看rest_init前后的代码
在start_kernel尾部被调用






三、简单分析start_kernel
1. init/main.c -> stat_kernel
asmlinkage void __init start_kernel(void)该函数是Linux内核的入口。
start_kernel()是内核的汇编与C语言的交接点,在该函数以前,内核的代码都是用汇编写的,完成一些最基本的初始化与环境设置工作。
在start_kernel()中Linux将完成整个系统的内核初始化。内核初始化的最后一步就是启动init进程,这个所有进程的祖先。
不管分析内核那一部分都会涉及到start_kernel,因为几乎所有模块在初始化时都会调用它。
2. 一些init函数
(1)全局变量 init_task
全局变量init_task,即手工创建的PCB,0号进程初始化,0号进程就是最终的idle。
(2)初始化一些中断向量 trap_init()
中断向量表的初始化函数,设置了很多中断门(Interrupt Gate)
set_intr_gate:设置中断门
(3)内存管理模块初始化 mm_init()
(4)调度模块初始化 sched_init()
函数内做了很关键的一步初始化——对0号进程,即idle进程进行初始化。
(5)其它模块初始化 rest_init()
kernel_thread``(kernel_init,NULL,CLONE_FS)中的kernel_init包含一个run_init_process,创建了一号进程,即第一个用户态进程。之后创建了kthread,一个内核线程来管理系统的资源。
各部分启动完毕后,调用static void cpu_idle_loop(void),当系统没有进程需要执行时就调度到idle进程中的cpu_idle_loop,其中while(1)无限循环,即rest_init的中0号进程会一直存在。
四、总结
qemu -kernel (文件名) -initrd (rootfs.img)
- qemu相当于打开一个虚拟机 
- kernel启动一个内核,位置由其后的文件名指定。如果在当前目录下,可以直接输入文件名,如果不是,则需要输入该内核的全路径。 
- initrd指令是挂了一个ramdisk虚拟硬盘,是内核的重要补充,rootfs.img就是这个虚拟硬盘,内有分区,然后启动的其实是其中的init文件,这个文件是由之前的menuOS编译而成,gcc -o命名为init。 
所以就是要启动一个内核,挂一个硬盘,然后再运行一个init即1号进程。
也就是说,init中main.c中有一个start_kernel函数
在start_kernel函数的尾部调用了一个rest_init
有一个全局变量init_task,即手工创建的PCB,0号进程,即最终的idle进程。0号进程一直存在,系统没有进程需要执行时调度到0号进程。
rest_init()中有kernel_thread(kernel_init,NULL,CLONE_FS)
kernel_init中有run_init_process,run_init_process创建了一号进程。
Linux内核分析第三周——构造一个简单的Linux系统MenuOS的更多相关文章
- 20135327郭皓--Linux内核分析第三周  构造一个简单的Linux系统MenuOS
		Linux内核分析第三周 构造一个简单的Linux系统MenuOS 前提回顾 1.计算机是如何工作的三个法宝 1.存储程序计算机 2.函数调用堆栈 3.中断 2.操作系统的两把宝剑 中断上下文的切换 ... 
- linux内核分析 第三周 构造一个简单的Linux系统MenuOS
		一.计算机的三个法宝 存储程序计算机,函数调用堆栈,中断二.操作系统的两把剑:1.中断上下文的切换,保存现场和恢复现场2.进程上下文的切换. 三.linux内核源代码的分析: ·arch/目录保存支持 ... 
- Linux内核设计第三周——构造一个简单的Linux系统
		Linux内核设计第三周 ——构造一个简单的Linux系统 一.知识点总结 计算机三个法宝: 存储程序计算机 函数调用堆栈 中断 操作系统两把宝剑: 中断上下文的切换 进程上下文的切换 linux内核 ... 
- 《Linux内核分析》 第三周 构造一个简单的Linux系统MenuOS
		Linux内核分析 第三周 构造一个简单的Linux系统MenuOS 张嘉琪 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/ ... 
- 第三周 构造一个简单的Linux系统MenuOS
		一. Linux内核源代码简介 稳定版内核:Linux-3.18.6 Linux内核源代码的目录结构: arch目录:在Linux内核源代码里占有的比重很大,因为Linux内核支持很多的体系结构, ... 
- 第三周 构造一个简单的Linux系统
		20135331文艺 首先 在上周内容中我们学习了 计算机三个法宝: 1.存储程序计算机 2.函数调用堆栈 3.中断 本周中得知 操作系统两把宝剑: 1.中断上下文的切换:保存现场和恢复现场 2.进程 ... 
- Linux内核分析——第三周学习笔记20135308
		第三周 构造一个简单的Linux系统MenuOS 计算机三个法宝: 1.存储程序计算机 2.函数调用堆栈 3.中断 操作系统两把宝剑: 1.中断上下文的切换:保存现场和恢复现场 2.进程上下文的切换 ... 
- LINUX内核分析第三周学习总结——构造一个简单的Linux系统MenuOS
		LINUX内核分析第三周学习总结——构造一个简单的Linux系统MenuOS 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163. ... 
- 《Linux内核分析》第三周 构建一个简单的Linux系统MenuOS
		[刘蔚然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] WEEK THREE ... 
随机推荐
- MySQL数据库之单双表查询
			单表查询 先创建表 #创建表 create table employee( id int not null unique auto_increment, name varchar(20) not nu ... 
- python全栈开发-面向对象-初识2
			python_17_day 今日主要内容: 1.类空间,对象空间,查询顺序. 2.组合. 1.类空间,对象空间,查询顺序. class Person: animal = '高级动物' soul = ' ... 
- 180718-jar包执行传参使用小结
			jar包执行时传参的使用姿势 虽说我们现在大多不太直接使用jar包运行方式,目前比较主流的是将自己的服务丢在某个容器中(如tomcat,jetty等)运行,比如我之前所属的电商公司,就是将项目打包为w ... 
- TW实习日记:前三天
			今天是2018年7月20号,周五.从周一开始实习到现在,终于想起来要写日记这种东西了,可以记录一下自己这一天所学所做所知也是蛮不错的.先简单总结一下自己的大学生活吧,算是多姿多彩,体验了很多东西.在大 ... 
- hive的内置函数和自定义函数
			一.内置函数 1.一般常用函数 .取整函数 round() 当传入第二个参数则为精度 bround() 银行家舍入法:为5时,前一位为偶则舍,奇则进. .向下取整 floor() .向上取整 ceil ... 
- lxd&openstack-lxd源码剖析
			lxd:https://linuxcontainers.org/lxd/,目标是融入到openstack体系被管理,像虚拟机一样被管理使用.从如下图可知,并非走的是libvirt-lxc路线,而是no ... 
- .NET导出Excel之NPOI
			前段时间研究过微软的Excel导出.table输出Excel,而它们也存在一些弊端: 1.对于微软的Excel导出存在一些弊端,如:需要安装Office软件.速度问题: 2.table输出Excel在 ... 
- 每天一个linux命令集
			linux命令汇总,装载来自: http://www.cnblogs.com/peida/category/309012.html 
- hadoop 中balance 机制
			Hadoop的HDFS集群非常容易出现机器与机器之间磁盘利用率不平衡的情况,比如集群中添加新的数据节点.当HDFS出现不平衡状况的时候,将引发很多问题,比如MR程序无法很好地利用本地计算的优势,机器之 ... 
- 关于jsonp跨域的 实现
			1.实现原理 1.把接口写在 script标签的src 中 这个接口就可以访问(不会存在跨域问题 因为接口在浏览器地址栏是可以访问的 会返回json字符串); 2.直接写不可以 因为正常情 ... 
