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

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

时间:2016-03-13 00:36:36      阅读:319      评论:0      收藏:0      [点我收藏+]

标签:

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

标签:

原文地址:http://www.cnblogs.com/20135327leme/p/5270854.html

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