一、构造一个简单的Linux系统MenuOS
输入以下指令并执行
cd ~/LinuxKernel/
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img
执行结果
二、使用gdb跟踪调试Linux内核的方法
1.使用 gdb 跟踪调试内核
输入指令
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S
执行结果
2.另开一个 shell 窗口,设置一个断点
另开一个shell窗口,执行指令
gdb
(gdb)file linux-3.18.6/vmlinux
(gdb)target remote:1234
(gdb)break start_kernel
执行结果
3.按c系统开始执行到断点处暂停
此时执行到start_kernel的位置
使用list命令,可以看到start_kernel上下的代码 在rest_init处设置断点 使用list命令
三、分析 start_kernel 函数的执行过程
asmlinkage __visible void __init start_kernel(void)
{
lockdep_init();
set_task_stack_end_magic(&init_task);
smp_setup_processor_id();
trap_init();
mm_init();
sched_init();
rest_init();
}
四、总结
1.对“Linux 系统启动过程”的理解
0号进程是手工创建的,它的任务就是在CPU的队列中没有进程的时候一直执行,在有进程的时候切换到新进程,而后被设置为空闲状态。start_kernel最后一部分是第一个用户态进程PID=1的正式生成,就是rest_init(),这个进程是系统的1号进程,这个时候0号进程会被设置成idle进程。它从系统启动之后就一直存在。它创建了1号进程 kernel_init 和其他进程。这样系统就启动起来了。总体来说,init_task 核心相当于一个 while(1) 的循环,当没有进程在运作时,0号进程在运作,在循环中它将会调用 schedule 函数以便在运行队列中有新进程加入时切换到该新进程上。
2.Linux内核目录
1、arch目录包括了所有和体系结构相关的核心代码。它下面的每一个子目录都代表一种Linux支持的体系结构。 2、COPYING目录下是GPL版权申明。 3、CREDITS目录下是光荣榜。对Linux做出过很大贡献的一些人的信息。 4、documentation目录下是一些文档,没有内核代码,是对每个目录作用的具体说明。 5、drivers目录中是系统中所有的设备驱动程序。 6、fs目录存放Linux支持的文件系统代码和各种类型的文件操作代码。 7、include目录包括编译核心所需要的大部分头文件。 8、init目录包含核心的初始化代码(不是系统的引导代码),有main.c和Version.c两个文件。 9、ipc目录包含了核心进程间的通信代码。 10、Kernel内核管理的核心代码,此目录下的文件实现了大多数linux系统的内核函数,其中最重要的文件当属sched.c;同时与处理器结构相关代码都放在archlib/目录下。 11、MAINTAINERS目录存放了维护人员列表,对当前版本的内核各部分都有谁负责。 12、Makefile目录第一个Makefile文件。用来组织内核的各模块,记录了个模块间的相互这间的联系和依托关系,编译时使用。 13、mm目录包含了所有独立于 cpu 体系结构的内存管理代码。 14、modules目录存放了已建好的、可动态加载的模块文件目录,是个空目录,用于存放编译时产生的模块目标文件。 15、net目录里是核心的网络部分代码,其每个子目录对应于网络的一个方面。 16、ReadMe目录里是核心及其编译配置方法简单介绍 17、REPORTING-BUGS目录里是有关报告Bug 的一些内容 18、Rules.make目录里是各种Makefilemake所使用的一些共同规则 19、scripts目录包含用于配置核心的脚本文件等。
|