zoukankan      html  css  js  c++  java
  • 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和其他的一些服务进程。

  • 相关阅读:
    安装Docker-Compose
    Docker微容器Alpine Linux
    Linux 常用命令
    如何定制博客园的个人空间
    Elasticsearch入门之从零开始安装ik分词器
    Elasticsearch入门实践
    写在2017年的总结
    开源ETL工具之Kettle介绍
    常用Java数据库连接池
    细说shiro之七:缓存
  • 原文地址:https://www.cnblogs.com/20199305yizihan/p/11622187.html
Copyright © 2011-2022 走看看