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

MenuOS的构造

一.Linux源代码的关键目录

  • block:存放块设备管理代码;

  • crypto:存放常见加密算法的C语言代码;

  • Documentation:存放一些文档;

  • drivers:驱动目录;

  • firmware:固件;

  • fs:文件系统;

  • include:头文件目录;

  • init:存放Linux内核启动时的初始化代码;

  • Kernel:存放内核本身需要的一些核心代码文件;

  • lib:公用的库文件;

  • mm:存放Linux的内存管理代码;

  • net:存放网络相关的代码;

二.构造一个简单的Linux内核

(1)使用以下指令来搭建MenuOS

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

(2)使用GDB来跟踪调试Linux内核的启动过程

使用GDB追踪调试时需要加两个参数,一个是-s(在1234端口上创建了一个gdb-server),

一个是-S(CPU初始化之前冻结起来)。

  • 用以下命令把内核启动一下,可观察到它被冻结
 qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S

  • 再打开一个水平分割的窗口,启动gdb,把内核加载进来,建立连接
    在start_kernel和rest_init两处设置断点,可按“c”继续执行

  • start_kernel()部分代码

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();
                .............

        /* Do the rest non-__init'ed, we're now alive */
        rest_init();
 }

三.总结

start_kernel中最后一句为rest_init,内核启动完成后,有一个call_cpu_idle,当系统没有进程

需要执行时就调用idle进程;rest_init是0号进程,它创建了1号进程init和其他的一些服务进程。

原文地址:https://www.cnblogs.com/20199305yizihan/p/11622187.html