您的位置:首页 > 运维架构 > Linux

20135201李辰希《Linux内核分析》第三次 构造一个简单的Linux系统OS

2016-03-13 14:30 453 查看
李辰希 无转载 《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_kernelinit_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程序进而将开机过程持续下去

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: