zoukankan      html  css  js  c++  java
  • 08 | 内核初始化:生意做大了就得成立公司

    总结

    - 内核初始化, 运行 `start_kernel()` 函数(位于 init/main.c), 初始化做三件事
        - 创建样板进程, 及各个模块初始化
        - 创建管理/创建用户态进程的进程
        - 创建管理/创建内核态进程的进程
    ---
    - 创建样板进程,及各个模块初始化
        - 创建第一个进程, 0号进程. `set_task_stack_end_magic(&init_task)` and `struct task_struct init_task = INIT_TASK(init_task)`
        - 初始化中断, `trap_init()`. 系统调用也是通过发送中断进行, 由 `set_system_intr_gate()` 完成.
        - 初始化内存管理模块, `mm_init()`
        - 初始化进程调度模块, `sched_init()`
        - 初始化基于内存的文件系统 rootfs, `vfs_caches_init()`
            - VFS(虚拟文件系统)将各种文件系统抽象成统一接口
        - 调用 `rest_init()` 完成其他初始化工作
    ---
    - 创建管理/创建用户态进程的进程, 1号进程
        - `rest_init()` 通过 `kernel_thread(kernel_init,...)` 创建 1号进程(工作在用户态).
        - 权限管理
            - x86 提供 4个 Ring 分层权限
            - 操作系统利用: Ring0-内核态(访问核心资源); Ring3-用户态(普通程序)
        - 用户态调用系统调用: 用户态-系统调用-保存寄存器-内核态执行系统调用-恢复寄存器-返回用户态
        - 新进程执行 kernel_init 函数, 先运行 ramdisk 的 /init 程序(位于内存中)
            - 首先加载 ELF 文件
            - 设置用于保存用户态寄存器的结构体
            - 返回进入用户态
            - /init 加载存储设备的驱动
         - kernel_init 函数启动存储设备文件系统上的 init
    ---
    - 创建管理/创建内核态进程的进程, 2号进程
        - `rest_init()` 通过 `kernel_thread(kthreadd,...)` 创建 2号进程(工作在内核态).
        - `kthreadd` 负责所有内核态线程的调度和管理

  • 相关阅读:
    杨巧丽 实验十四 团队项目评审&课程学习总结
    201671010448 杨巧丽 实验四附加实验
    201671010448 杨巧丽 《英文文本统计分析》结对项目报告
    201671010448 词频统计软件项目报告
    201671010448 杨巧丽 实验三 作业互评与改进
    实验一 针对《构建之法》一书自己的几个疑惑
    实验十四 团队项目评审&课程学习总结
    201671010453钟红耀英文文本统计分析》结对项目报告
    词频项目
    钟红耀实验三作业互评与改进报告
  • 原文地址:https://www.cnblogs.com/mzyc/p/10716261.html
Copyright © 2011-2022 走看看