构建一个简单的Linux系统 MenuOs —— start_kernel到init进程


作者:刘世鹏20135304

《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

Linux内核代码简介

内核源码三个个重要目录

  • arch占有代码量最大,支持不同cpu的源代码,arch/x86目录下的代码是我们关注的重点
  • init,内核启动相关的代码基本都在init目录下,init/main.c中start_kernel是整个内核启动的起点

  • Kernel目录下是Linux内核的核心代码所在

README

  • 介绍了什么是Linux
  • Linux能在哪些硬件上运行
  • 文档说明
  • 怎样安装内核源代码
  • make mrproper 把中间代码清理干净
  • make allnoconfig把所有的可选项都关闭了,可以运行的很快


实验过程

构造一个简单的Linux 系统 MenuOs

cd LinuxKernel/
qemu -kernel linux-3.18./arch/x86/boot/bzImage -initrd rootfs.img
  • qemu 启动虚拟机
  • kernel指明内核文件名
  • initrd指明根文件系统

内核启动 → 加载根文件系统(可执行文件init被启动了)

使用GDB跟踪调试内核的方法

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

关于-s和-S选项的说明:

-S freeze CPU at startup (use ’c’ to start execution)在cpu初始化之前冻结起来
-s shorthand for 在-gdb tcp::1234端口上创建一个gdb server

此时虚拟机处于冻结状态

另开一个shell窗口
设置gdb断点

(gdb)file linux-3.18./vmlinux # 在gdb界面中targe remote之前加载符号表
(gdb)target remote: # 建立gdb和gdbserver之间的连接,按c 让qemu上的Linux继续运行
(gdb)break start_kernel # 断点的设置可以在target remote之前,也可以在之后

系统重新启动到start_kernel这个位置

系统执行到init


分析start_kernel的执行过程

  • start_kernel函数是Linux内核的入口。
  • start_kernel()是内核的汇编与C语言的交接点,在该函数以前,内核的代码都是用汇编写的,完成一些最基本的初始化与环境设置工作。
  • 不管分析内核那一部分都会涉及到start_kernel,因为几乎所有模块在初始化时都会调用它
  • init_task 为全局变量,即手工创建的pcb。 0号进程即最终的idle进程
  • trap_init()初始化一些中断向量


Kthreadd用内核线程管理系统资源,当系统没有进程需要执行时就调度到idle进程


四、总结

整个内核的启动过程整体上可看作rest_init()这一个0号进程,在start_kernel函数的尾部被调用。这个0号进程就创建了1号进程kernel_init,接下来还创建了其他的一些服务类的内核线程如kthreadd。这样整个系统就启动起来了。

最新文章

  1. ajax获取数据的形象比喻,助于理解记忆
  2. 链表原地反转Demo
  3. jQuery和Ajax的使用(杂记)
  4. “惊群”,看看nginx是怎么解决它的
  5. Java命令行实用工具jps和jstat
  6. BZOJ1345: [Baltic2007]序列问题Sequence
  7. Object Storage(Swift)安装过程——Havana
  8. 【转】通过Navicat for MySQL远程连接的时候报错mysql 1130的解决方法
  9. js 中 字符串的转换
  10. android在view.requestFocus(0)返回false的解决办法
  11. Ubuntu下errno值
  12. Jquery_基础(一) 常用方法与选择器
  13. haproxy的丰富特性简介
  14. 如何查看tomcat的支持的jdk、servlet、jsp的版本
  15. Python课程第五天作业
  16. Android Tools 开发工具库开源项目总结
  17. delegate的Invoke和BeginInvoke方法
  18. windows环境下pycharm如何设置Linux编码
  19. taro之React Native 端开发研究
  20. 转:手把手教你如何玩转Solr(包含项目实战)

热门文章

  1. Js跨域、父级窗口执行JS赋值、取值,更改元素
  2. 【WebService】快速构建WebService示例
  3. Bettercap的安装和使用嗅探WIFI
  4. 解决Chrome关联Html文件图标显示为空白
  5. 【BZOJ2946】[Poi2000]公共串 后缀数组+二分
  6. [css]演示:纯CSS实现的右侧底部简洁悬浮效果
  7. Unity3D笔记十 游戏元素
  8. Mybatis框架插件PageHelper的使用
  9. AWR之-enq TX - row lock contention的性能故障-转
  10. 第1章 1.8计算机网络概述--OSI参考模型和网络排错