• 2020-2021-1 20209313 《Linux内核原理与分析》第四周作业


    实验一 实验楼实验

    实验要求:

    • 使用gdb跟踪调试内核从start_kernel到init进程启动
    • 分析从start_kernel到init进程启动的过程

    在实验楼环境运行与重新编译

    1. 测试文件系统

    2. 冻结内核

    3、分析:gdb跟踪调试断点

    启动过程分析

    来源:https://blog.csdn.net/u013291303/article/details/61643673

    第一步:完成硬件系统初始化后,访问内核软件系统接口start_kernel()

    第二步:start_kernel()顺序执行初始化模块,创建0号进程init

    1、init_task中保存了一个进程的所有基本信息,如进程状态,栈起始地址,进程号pid等,pid=0
    init_task,其在文件linux-3.18.6/init/init_task.c中定义如下:
    struct task_struct init_task = INIT_TASK(init_task);

    内核的初始化程序在start_kernel这个函数中,可以在线查看这些代码: start_kernel。通过阅读start_kernel代码,可以大致了解到内核在初始化的时候,做了以下工作:
    1)lockdep_init():初始化内核依赖关系表,初始化hash表
    2)boot_init_stack_canary():为栈增加保护机制,预防一些缓冲区溢出之类的攻击
    3)tick_init():初始化内核时钟系统
    4)boot_cpu_init():激活当前CPU
    5)setup_arch():对不同体系结构的CPU设置不同的参数、选项等
    6)trap_init():初始化硬件中断,函数中设置了很多中断门
    7)mm_init():建立内核的内存分配器
    8)sched_init():初始化任务调度
    9)init_IRQ():中断向量的初始化
    …….
    n)rest_init():剩下的初始化工作,

    第三步:创建1号进程

    从rest_init开始,产生第一个1号进程:
    kernel_thread(kernel_init, NULL, CLONE_FS);
    其中kernel_thread()的源码在文件linux-3.18.6/kernel/fork.c中定义,通过execve()执行磁盘文件上的init程序。而init程序是用户态程序的1号进程,从而实现了内核态向用户态的转化。

    第四步:0号进程的转变

    在linux-3.18.6/init/main.c文件中看rest_init()函数的代码如下:

    static noinline void __init_refok rest_init(void)
    {
    int pid;
    rcu_scheduler_starting();
    //很重要,创建一个内核线程init,PID=1,创建好了,但不能去调度它
    kernel_thread(kernel_init, NULL, CLONE_FS);
    numa_default_policy();
    //很重要,创建第二个内核线程,PID=2,负责管理和调度其它内核线程。
    pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES);
    rcu_read_lock();
    kthreadd_task = find_task_by_pid_ns(pid, &init_pid_ns);
    rcu_read_unlock();
    complete(&kthreadd_done);
    init_idle_bootup_task(current);
    schedule_preempt_disabled();
    cpu_startup_entry(CPUHP_ONLINE);
    }

    总结

    阐明自己对“Linux系统启动过程”的理解,尤其是idle进程、1号进程是怎么来的。
    rest_init()创建了1号进程,init_idle_bootup_task(current)创建idle
    0号进程在fork了1号进程并且做了其余的启动工作之后,转化成为了idle进程。完成其使命,并一直处于内核态中无限循环。

    实验二 MenuOS扩展

    内容

    1. git clone https://github.com/mengning/menu.git 下载menu代码,
    2. 增加一个hello的命令,输出“hello 你的学号”
    3. 重新制作文件系统,并用qmenu运行测试。
    4. 上方提交hello相关代码的链接
    5. 下方附件提交测试截图

    操作

    1. hello代码

    2. 重新制作文件系统

    3. qmenu运行测试

  • 相关阅读:
    PHP连接FTP服务的简单实现
    Map遍历
    线程的互斥与同步
    Java中Collections.sort()排序详解
    Echarts的赋值,设置数据
    JSON和GSON的使用
    发送邮箱验证
    java中获取服务器的IP和端口
    一个题目涉及到的50个Sql语句
    JAVA面试题二
  • 原文地址:https://www.cnblogs.com/assignment/p/13892281.html
Copyright © 2020-2023  润新知