20135327郭皓--Linux内核分析第三周 构造一个简单的Linux系统MenuOS

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了20135327郭皓--Linux内核分析第三周 构造一个简单的Linux系统MenuOS相关的知识,希望对你有一定的参考价值。

Linux内核分析第三周  构造一个简单的Linux系统MenuOS

 

前提回顾

1.计算机是如何工作的三个法宝

  1.存储程序计算机

  2.函数调用堆栈

  3.中断

2.操作系统的两把宝剑

  1. 中断上下文的切换
  2. 进程上下文的切换

 

第一讲  Linux内核源代码介绍

技术分享

arch目录包括了所有和体系结构相关的核心代码。它下面的每一个子目录都代表一种Linux支持的体系结构,例如i386就是Intel CPU及与之相兼容体系结构的子目录。PC机一般都基于此目录。

技术分享

init目录包含核心的初始化代码(不是系统的引导代码),有main.c和Version.c两个文件。这是研究核心如何工作的好起点。

 

技术分享

start_kernel函数之前的内容基本都是汇编语言,而从该函数开始内核进入c语言部分,功能则是内核主要功能的初始化。

技术分享

Kernel内核管理的核心代码放在这里。同时与处理器结构相关代码都放在arch/*/kernel目录下。

 

第二讲 实验 构建一个简单的Linux内核

1.使用实验楼的虚拟机打开shell

cd LinuxKernel 

qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img

技术分享

qemu:启动一个虚拟机平台

-kernel:给一个内核,操作系统

-initrd:驱动所需的硬盘

rootfs.img:放一个可执行文件由menuOS源代码编译成的init

技术分享

内核启动完成后进入menu程序支持三个命令help、version和quit

 

2.通过gdb跟踪内核的启动

设置断点在start_kernel

技术分享

 

设置断点在rest_init

技术分享

 

 

总结:

start_kernel到init进程启动:

内核几乎所有模块的初始化都会经过start_kernel来进行

 1 /*init_task即手工创建的PCB,0号进程就是最终的idle进程*/
 2 set_task_stack_end_magic(&init_task);
 3 ........
 4 /*初始化中断向量*/
 5 trap_init();
 6 /*内存管理模块初始化*/
 7 mm_init();
 8 /*调度模块初始化*/
 9 sched_init();
10 ....
11 /*其他初始化*/
12 rest_init()

 

技术分享

进程启动过程图(来自http://img.blog.csdn.net/20140405154332828?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhneGh1YWE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

rest_init()最后执行cpu_startup_entry();cpu_startup_entry会调用cpu_idle_loop(), 在cpu_idle_loop()里面有个while(1)的循环一直执行,作为idle进程,pid是0号,此进程会一直执行下去,并且在系统没有任何需要执行的进程时,调度到此进程。 
Linux内核的启动在宏观上来看,就是start_kernel()来进行各种初始化工作,最终执行到rest_init()来初始化0号进程和1号用户态的进程。然后操作系统就运行起来了。

 

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

 

以上是关于20135327郭皓--Linux内核分析第三周 构造一个简单的Linux系统MenuOS的主要内容,如果未能解决你的问题,请参考以下文章

20135327郭皓--Linux内核分析第六周 进程的描述和进程的创建

20135327郭皓——Linux内核分析第二周 操作系统是如何工作的

20135327郭皓--读书笔记一

20135327--linux内核分析 实践二

Linux内核分析——第三周学习笔记20135308

Linux内核分析(第三周)