相关知识点

1.arch目录

占据相当庞大的空间,X86目录下代码需要重点关注。

2.init目录

内核启动的相关代码基本都在此目录下,内含MAIN.C,文件中START_KERNEL是整个LINUX内核的起点。

3.kernel

后跟文件名,Linux内核的核心代码在kernel目录中。可以使用make modules进行编译,make install进行安装。

4.fs目录

filesystem 文件系统

5.补充

①.编译内核的目的:为了生成符号表.内核符号表就是在内核内部函数或变量中可供外部引用的函数和变量的符号表.

②.ipc/:进程通信

③.lib/:公用库文件

④.make mrproper:清理中间代码

⑤.README:介绍了什么是Linux,Linux能够在哪些硬件上运行,如何安装内核源代码等

实验:跟踪分析Linux内核的启动过程

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

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

注:qemu:启动一个虚拟机平台;rootfs.img:放一个可执行文件由menuOS源代码编译成的init;-initrd:驱动所需的硬盘。



输入help,可以发现系统支持三个命令help、version和quit。

使用gdb跟踪调试内核

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

- S是指在CPU初始化之前(刚启动的时候)将其冻结
- s是指在1234这个端口上创建的gdb server

另开一个shell窗口

使用水平分割的方法

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

可以设置断点(break),格式为:break [函数名](此时系统还是被冻结而并没有启动的);



设置完断点之后,输入c命令continue继续执行,函数会停在断点处。输入list指令之后,可以详细地查看断点附近的代码:





将断点设置到rest_init



详细分析start_kernel

在init目录下main.c里找到start_kernel函数,不管分析内核的哪一部分都会涉及到start_kernel,都会在init初始化。

trap_init():初始化一些中断向量,管理硬件中断

set_intr_gate:设置中断门

set_system_trap_gate:系统陷阱门SYSCALL VECTOR。

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

sched_init():调度模块初始化

init_process(): 一号进程,默认的

rest_init():kernel_init:创建1号进程第一个用户态进程;init_process,1号进程,找默认路径下的程序作为1号进程;kthreadd:内核线程,用来管理系统资源;这也就是Linux系统中的1号进程,是第一个用户态进程,默认是根目录下的一个程序;如果根目录下没有这个进程,系统会寻找其他的默认进程作为1号进程,当系统没有进程需要执行时就调度到idle进程。

Linux系统启动过程的理解

道生一,一生二,二生三,三生万物。

从按下电源那一刻,就会开始了BIOS自检。基本输入输出系统,可以视为是一个永久地记录在ROM中的一个软件,是操作系统输入输出管理系统的一部分。 BIOS的功能由两部分组成,分别是POST码和Runtime服务。POST阶段完成后它将从存储器中被清除,而Runtime服务会被一直保留,用于目标操作系统的启动。接下来就到了系统引导,分别是lilo\grub进行引导。再之后是启动内核,也就是本次学习的重点。内核启动过程包括start_kernel之前和之后,之前全部是做初始化的汇编指令,之后开始C代码的操作系统初始化,最后执行第一个用户态进程init。一般分两阶段启动,先是利用initrd的内存文件系统,然后切换到硬盘文件系统继续启动。initrd文件的功能主要有两个:1、提供开机必需的但kernel文件(即vmlinuz)没有提供的驱动模块(modules)。2、负责加载硬盘上的根文件系统并执行其中的/sbin/init程序进而将开机过程持续下去。最后再初始化系统,就正常启动了LINUX系统。

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

最新文章

  1. PC虚拟现实应用的性能分析与优化:从CPU角度切入
  2. IOS中block和代理
  3. Canvas实现文字散粒子化
  4. BNUOJ 51279[组队活动 Large](cdq分治+FFT)
  5. Block的简单使用
  6. PLSQL 的简单命令之二
  7. win8 修改msconfig 里面的"引导高级选项" 最大内存后 BSOD的解决方案
  8. lintcode:合并区间
  9. Android中获取应用程序(包)的信息----PackageManager
  10. hdu1521:排列组合---指数型母函数
  11. 构建一个maven聚合类型的横向可扩展项目
  12. Java开发笔记(九)赋值运算符及其演化
  13. Model First 开发方式
  14. mysql分组排序取最大值所在行,类似hive中row_number() over partition by
  15. Bash控制结构
  16. 修改ThinkPHP缓存为Memcache的方法
  17. Python学习---Django误删除sql表后,如何创建数据
  18. CF821 B. Okabe and Banana Trees 简单数学
  19. WebStorm 2016激活
  20. EF – 7.一对多关联

热门文章

  1. spark任务调度和资源分配
  2. Nginx反向代理及简单负载均衡配置
  3. python第四十课——构造函数
  4. Wannafly挑战赛27
  5. [2018-12-15] Hello World!
  6. Python中__init__()方法注意点
  7. Qt Creator无法debug,报错:The selected debugger may be inappropriate for the inferior. Examining symbols and setting breakpoints by file name and line number may fail. The inferior is in the Portable ...
  8. [转]System.DllNotFoundException: 无法加载 DLL“*.dll”: 内存位置访问无效。 (异常来自 HRESULT:0x800703E6)
  9. WinForm中Component Class、User Control及Custom Control的区别和使用
  10. 模拟T1数字number