2019-2020-20199303《Linux内核原理与分析》第四周作业

构造一个简单的Linux内核

Linux是一种开源电脑操作系统内核,它是一个用C语言写成。主要子系统:
1.系统调用接口
2.进程管理
3.内存管理
4.虚拟文件系统

qemu是一个开源模拟处理器,在实验中

cd LinuxKernel/
qemu -kernel  linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img

qemu需要创建窗口,它在纯命令系统下无法工作,需要使用图形化界面的虚拟机。qemu仿真kernel,bzImage是vmLinux经过gzip压缩后的文件,此即为压缩后的内核镜像。vmLinux是编译出来最原始的ELF文件。如下图所示的即是使用实验楼的虚拟机搭建环境调试的过程:

打开另一个shell窗口,启动gdb进行断点调试,如图所示:

设置断点在start_kerenl()和 rest_init()处,按c继续执行,结果如图所示:

start_kernel()相当于c语言的main函数,是除了汇编语言的程序执行的起点
start_kernel()几乎涉及了内核的所有模块:
trap_init():中断向量的初始化
mm_init():内存管理的初始化
sched_init(): 调度模块的初始化
init_task()(0号进程),是进程描述符,使用宏进行初始化,而后对其他模块进行初始化
代码如下:
asmlinkage __visible void __init start_kernel(void)
{
char *command_line;
char *after_dashes;

    /*
     *Need to run as early as possible, to initialize the
     *lockdep hash:
     */
    lockdep_init();
    set_task_stack_end_magic(&init_task);
    smp_setup_processor_id();
    debug_objects_early_init();
    
	/*
   	 *Set up the initial canary ASAP
	 */
	boot_init_early();

    local_irg_disable();
	early_boot_irgs_disabled=TRUE;
}  

总结:0号进程在创建init进程后调用cpu_idle(),而后一号线程负责执行内核的部分初始化工作及进行系统配置

posted @ 2019-10-06 18:49  20199303吕建文  阅读(132)  评论(1编辑  收藏  举报