曹朋辉
原创作品转载请注明出处
《Linux内核分析》MOOC课程
计算机有三个法宝:
- 存储程序计算机
- 函数调用堆栈
- 中断
操作系统两把宝剑:
- 中断上下文的切换-保存现场、恢复现场
- 进程上下文的切换
Linux内核代码目录结构(部分)
arch -CPU相关
x86/ (关心 )
fs -file system
init - (重要)
-main.c
-start_kernel()
ipc -进程间通信
kernel - (关键)
lib
mm -memery management
net
先来看看menu os启动后的样子
这个字符menu os还是挺好看的,如果直接在显示器全屏显示效果应该更好
好了接下来继续做实验,用GDB跟踪Linux启动过程,步骤如下
0 搭建menu OS
# 下载内核源代码编译内核
cd ~/LinuxKernel/
wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.18.6.tar.xz
xz -d linux-3.18.6.tar.xz
tar -xvf linux-3.18.6.tar
cd linux-3.18.6
make i386_defconfig
make # 一般要编译很长时间,少则20分钟多则数小时
# 制作根文件系统
cd ~/LinuxKernel/
mkdir rootfs
git clone https://github.com/mengning/menu.git # 如果被墙,可以使用附件menu.zip
cd menu
gcc -o init linktable.c menu.c test.c -m32 -static –lpthread
cd ../rootfs
cp ../menu/init ./
find . | cpio -o -Hnewc |gzip -9 > ../rootfs.img
# 启动MenuOS系统
cd ~/LinuxKernel/
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img
# 重新配置编译Linux使之携带调试信息
1. 在原来配置的基础上,make menuconfig选中如下选项重新配置Linux,使之携带调试信息
2.
kernel hacking—>
[*] compile the kernel with debug info
3. make重新编译(时间较长)
1 启动Linux内核并冻结
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选项
2 打开一个新的终端对内核的启动过程进行跟踪分析
(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
分析:
trap_init
中断相关
mm_init
内存管理模块
sched_init
调度模块
rest_init
0号进程
kernel_init
1号进程
在大概熟悉了start_kernel的代码之后,我们便可以使用gdb对其做进一步跟踪分析。