20135201李辰希《Linux内核分析》第三次 构造一个简单的Linux系统OS
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了20135201李辰希《Linux内核分析》第三次 构造一个简单的Linux系统OS相关的知识,希望对你有一定的参考价值。
李辰希 无转载 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
第三周构造一个简单的Linux系统MenuOS
一、Linux内核源代码简介
- 三个法宝和两把宝剑:
三个法宝:存储程序计算机、函数调用堆栈、终断
操作系统的两把宝剑:中断上下文的切换(保存现场和恢复现场)、进程上下文的切换
2.linux内核源代码简介
arch/x86目录下的代码是重点关注的
init目录:内核启动相关的代码基本都在init目录下
init/main.c中start_kernel函数就相当于普通C程序的main函数
fs目录:file system文件系统
ipc目录:进程间通信
kernel目录:Linux内核核心代码在kernel目录中
二.构造一个简单的Linux系统
实验过程
1.使用实验楼的虚拟机打开shell输入
cd LinuxKernel/
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img
2.启动kernel
3.启动gdb调试
4.用水平分割另外打开一个shell窗口之后,进行调试
设置断点(break)
设置完断点之后,输入c命令continue继续执行,函数会停在断点处
输入list指令之后,可以详细地查看断点附近的代码,输入list指令之后,可以详细地查看函数停留的位置
2.简单分析一下start_kernel
init_task即手工创建的,0号进程即最终的idle进程
不管分析内核的哪一部分都会涉及到start_kernel
当系统没有进程需要执行时就调度到idle进程
三.总结
1.总结内核启动过程
kernelthread是0号进程,它创建了1号进程kernelinit,以及它的一些服务的内核线程,这样整个系统及启动起来了。然后init进程会再启动一些进程。
道生一,一生二, 二生(前面0、1和2三个进程), 三生万物(1号进程是所有用户态进程的祖先,2号进程是所有内核线程的祖先)
2.从restinit开始,Linux开始产生进程,因为inittask是静态制造出来的,pid=0,它试图将从最早的汇编代码一直到startkernel的执行都纳入到inittask进程上下文中。在restinit函数中,内核将通过下面的代码产生第一个真正的进程(pid=1),也就是 kernelthread(kernelinit, NULL, CLONEFS | CLONE_SIGHAND);【0号进程创建1号进程】
3.一般分两阶段启动,先是利用initrd的内存文件系统,然后切换到硬盘文件系统继续启动。
initrd文件的功能主要有两个:
1、提供开机必需的但kernel文件(即vmlinuz)没有提供的驱动模块(modules)
2、负责加载硬盘上的根文件系统并执行其中的/sbin/init程序进而将开机过程持续下去
以上是关于20135201李辰希《Linux内核分析》第三次 构造一个简单的Linux系统OS的主要内容,如果未能解决你的问题,请参考以下文章
20135201李辰希 《Linux内核分析》第四周 扒开系统调用的“三层皮”
20135201李辰希 《Linux内核分析》第五周 扒开系统调用的“三层皮”(下)
20135201李辰希《Linux内核分析》第一周 计算机是如何工作的?