zoukankan      html  css  js  c++  java
  • 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(),而后一号线程负责执行内核的部分初始化工作及进行系统配置

  • 相关阅读:
    【菜鸟笔记】记一次django无法正常在ie和edge浏览器渲染html页面
    1024快乐
    闯越自动签到demo版补充说明
    调用pythonnmap实现扫描局域网存活主机
    python 爬虫豆瓣top250
    基于python3.7的一个闯越自动签到脚本demo版
    记录一个用于Demo演示的Docker镜像的实现步骤
    Netty实现Http客户端【支持https请求】 harara
    Java 8 Stream 使用 harara
    SHA256算法原理和代码实现(java) harara
  • 原文地址:https://www.cnblogs.com/besti-20199303/p/11628068.html
Copyright © 2011-2022 走看看