码迷,mamicode.com
首页 > 系统相关 > 详细

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

时间:2016-03-13 15:41:24      阅读:219      评论:0      收藏:0      [点我收藏+]

标签:

李辰希 无转载 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 

 

第三周构造一个简单的Linux系统MenuOS

一、Linux内核源代码简介

  1. 三个法宝和两把宝剑:

       三个法宝:存储程序计算机、函数调用堆栈、终断

       操作系统的两把宝剑:中断上下文的切换(保存现场和恢复现场)、进程上下文的切换

 

     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

标签:

原文地址:http://www.cnblogs.com/20135201lcx2/p/5271950.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!