Week4 MenuOS的构造

一、上周复习


计算机的三大法宝:
- 存储程序计算机;
- 函数调用堆栈;
- 中断。
操作系统的两把宝剑:
- 中断上下文—保存现场和恢复现场
- 进程上下文




二、Linux内核源代码简介

  • Linux内核的版本号按照A,B,C的方式命名:

    • A代表大幅度转变的内核
    • B代表重大修改的内核
    • C指轻微修改的内核(C是内核的真实版本)
    • D是安全补丁和bug修复

Linux内核源代码的根目录

  • arch

    • arch目录中的代码在Linux内核代码中占比相当庞大
    • arch/x86目录下的代码是需要重点关注的,arch下其他目录可以删掉。
  • block
    • 存放Linux存储体系中关于块设备管理的代码。

      crypto
    • 存放常见的加密算法的C语言代码
  • Documentation
    • 存放一些文档
  • dirvers
    • 驱动目录,里面分门别类地存放了Linux内核支持的所有硬件设备的驱动源代码
  • firmware
    • 固件
  • fs
    • 文件系统,里列出了Linux支持的各种文件系统的实现
  • include
    • 头文件目录,存放公共的(各种CPU体系结构公用的)头文件
  • init(关键目录)
    • init是初始化的意思,存放Linux内核启动时的初始化代码。内核启动相关的基本代码基本都在init目录下,

      main.c 文件中有一个start_kernel函数,初始化Linux内核的起点,这个函数相当于普通c程序的main函数
  • ipc
    • 进程间通信,ipc目录里面是Linux支持的IPC的代码实现
  • kernel目录
    • 存放内核本身需要的一些核心代码文件
  • lib
    • 公用的库文件,里面是一些公用的库函数
  • mm
    • mm是memory management,即内存管理,存放Linux的内存管理代码
  • net
    • 该目录下是网络相关的代码
  • 此外还有一些与声音、安全、脚本、工具相关的目录。

三、构造Linux系统MenuOS

cd LinuxKernel
qemu -kernel linux3.18.6/arch/x86/boot/bzImage --initrd rootfs.img

四、跟踪调试Linux内核的启动过程

qemu -kernel linux3.18.6/arch/x86/boot/bzImage --initrd rootfs.img -S -s

启动gdb

file linux-3.18.6/vmlinux
target remote:1234



五、简单分析start_kernel

1、init/main.c -> stat_kernel

  • start_kernel是一切的起点,start_kernel相当于C语言中的main函数。
  • tart_kernel()是内核的汇编与C语言的交接点,在该函数以前,内核的代码都是用汇编写的,完成一些最基本的初始化与环境设置工作。
  • 在start_kernel()中Linux将完成整个系统的内核初始化。内核初始化的最后一步就是启动init进程,这个所有进程的祖先。

2、一些init函数

(1)、init_task

  • 全局变量init_task,即手工创建的PCB,0号进程初始化,0号进程就是最终的idle。

(2)、初始化一些中断向量 trap_init()

  • 中断向量表的初始化函数,设置了很多中断门

(3)、内存管理模块初始化 mm_init()

(4)调度模块初始化 sched_init()

  • 函数内做了很关键的一步初始化——对0号进程,即idle进程进行初始化。

(5)其它模块初始化 rest_init()

  • 注:内核中并没有线程的概念,这里创建的init是一个任务(进程)。如果把系统当成是一个大进程,那么init进程就相当于大进程中的一个线程,因为内核中的进程调度会为每一个像init进程分配时间片来执行。

六、总结

  • 在init目录下main.c里找到start_kernel函数有一个全局变量init_task,即手工创建的PCB,0号进程即最终的idle进程。
  • 1号进程是所有用户态进程的祖先,2号进程是所有内核线程的祖先
  • 内核启动过程:rest_init()就是一个0号进程,在start_kernel内核一启动时就一直存在;然后这个0号进程就创建了1号进程kernel_init,接下来还创建了其他的一些服务类的内核线程如kthreadd。这样整个系统就启动起来了。

最新文章

  1. Android调用系统相机功能
  2. shell之数值运算
  3. 【59测试】【树】【dp】
  4. Deformity PHP Webshell、Webshell Hidden Learning
  5. HDU 3047
  6. Assembly(程序集) 反射和缓存
  7. STL库list::sort()实现深度解析
  8. NetBSD是个开源到源码的系统
  9. [mysql使用(3)] 使用mysql的时候遇到的一些错误
  10. 正本清源区块链——Caoz
  11. Hibernate之初体验
  12. Ubuntu 14.04 下使用微软的跨平台轻量级开发神器 Visual Studio Code
  13. 解读IEEE 7417的软件体系架构描述的概念模型
  14. java 除法运算只保留整数位的3种方式
  15. Cocos Creator 脚本模板
  16. Python网络爬虫之requests模块(2)
  17. Python+Selenium笔记(五):生成测试报告
  18. 日志收集以及分析:Splunk
  19. Go Revel - Templates(模板)
  20. bzoj 1934 最小割

热门文章

  1. Linq调试实时输出信息扩展方法(摘抄)
  2. DSP未来五大发展趋势
  3. docker自动化脚本
  4. (三)pdf的构成之文件头综述
  5. Java设计模式之委派模式(Dellegate/Dispather)
  6. 如何用navicat导入数据?
  7. Process.Start cmd 参数空格问题解决
  8. 深入剖析Linux IO原理和几种零拷贝机制的实现
  9. Mybatis基于xml的动态sql实现
  10. MQTT协议中的topic