1.下载linux-3.18.6的内核源码,并且编译
cd ~/LinuxKernel/ wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.18.6.tar.xzxz -d linux-3.18.6.tar.xztar -xvf linux-3.18.6.tarcd linux-3.18.6make i386_defconfig make# 一般要编译很长时间,少则20分钟多则数小时
2.制作根文件系统
cd ~/LinuxKernel/
mkdir rootfs
git clone https://github.com/mengning/menu.git
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
3.启动MenuOS
cd ~/LinuxKernel/
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img-s-S
(gdb)file linux-3.18.6/vmlinux# 在gdb界面中targe remote之前加载符号表
(gdb)target remote:1234# 建立gdb和gdbserver之间的连接,按c 让qemu上的Linux继续运行
(gdb)breakstart_kernel# 断点的设置可以在target remote之前,也可以在之后
调试运行之后做出一下分析:
asmlinkage __visiblevoid__init start_kernel(void) {
set_task_stack_end_magic(&init_task);/*init_task即手工创建的PCB,0号进程就是最终的idle进程*/
trap_init();/*初始化中断向量*/
mm_init();/*内存管理模块初始化*/
sched_init();/*调度模块初始化*/
rest_init()/* 是0号进程,并且创建了1号进程,并创建了一些其他的服务进程,会一直驻留内存*/}
其中最重要的功能如上面代码所示,分别创建0号进程,初始化中断向量,初始化内存管理模块,初始化调度模块。
0号进程常驻内存,创建一号进程和其他服务进程,而其他的模块初始化为以后的程序运行打下基础。