Linux内核分析第三周学习总结

Linux内核源码简介

arch/

该目录中包含和硬件体系结构相关的代码,每种平台占一个相应的目录。
和32位PC相关的代码存放在x86目录下。
每种平台至少包含3个子目录:kernel(存放支持体系结构特有的特征实现)、lib(存放体系结构特有的对通用函数的实现)、mm(存放体系结构特有的内存管理程序的实现),除了这3个子目录之外,大多数体系结构在必要的情况下还有一个boot子目录,包含了在这种硬件平台上启动内核所使用的部分或全部平台特有代码。

init/

内核启动相关代码 -> main.c
Linux内核启动初始化的起点就位于main.c中的函数start_kernel,相当于普通程序的main函数。

kernel/

存放linux内核最核心的代码,用于实现系统的核心模块,包括进程管理、进程调度器、中断处理、系统时钟管理、同步机制等。
该目录中的代码实现这些核心模块的主体框架,独立于具体的平台和系统架构。
核心模块与平台相关的代码放在arch/中。

构造一个简单的Linux系统

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

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

cd LinuxKernel/
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img
内核启动完成后进入menu程序(《软件工程C编码实践篇》的课程项目),支持三个命令help、version和quit,您也可以添加更多的命令,对选修过《软件工程C编码实践篇》的童鞋应该是a piece of cake.

使用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)
-s shorthand for -gdb tcp::1234 若不想使用1234端口,则可以使用-gdb tcp:xxxx来取代-s选项
另开一个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之前,也可以在之后

总结

init/main.c ->stat_kernel
是linux内核的入口。

参考资料

http://mooc.study.163.com/learn/USTC-1000029000?tid=2001214000#/learn/content?type=detail&id=2001400011&cid=2001388025
http://www.cnblogs.com/hyq20135317/p/5260671.html#3377323

posted on 2016-03-13 13:17  20135237朱国庆  阅读(182)  评论(0编辑  收藏  举报