《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
内核源码三个个重要目录
README
构造一个简单的Linux 系统 MenuOs
cd LinuxKernel/ qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img
内核启动 → 加载根文件系统(可执行文件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.6/vmlinux # 在gdb界面中targe remote之前加载符号表 (gdb)target remote:1234 # 建立gdb和gdbserver之间的连接,按c 让qemu上的Linux继续运行 (gdb)break start_kernel # 断点的设置可以在target remote之前,也可以在之后
系统重新启动到start_kernel这个位置
系统执行到init
Kthreadd用内核线程管理系统资源,当系统没有进程需要执行时就调度到idle进程
整个内核的启动过程整体上可看作rest_init()这
一个0号进程,在start_kernel函数的尾部被调用。
这个0号进程就创建了1号进程kernel_init
,接下来还创建了其他的一些服务类的内核线程如kthreadd。这样整个系统就启动起来了。
构建一个简单的Linux系统 MenuOs —— start_kernel到init进程(20135304刘世鹏)
原文:http://www.cnblogs.com/L20135304/p/5272481.html