将 linux 内核映像加载到 RAM 后会发生什么

Ren*_*h G 9 linux boot kernel

我只是想知道在启动过程后将 linux 内核映像加载到 RAM 后发生的活动流程。

wag*_*wag 15

从 Linux 2.6 开始:

核心

加载到 RAM 后,内核执行以下功能。

setup()

  1. 在 RAM 中建立一个表来描述物理内存的布局。
  2. 设置键盘重复延迟和速率。
  3. 初始化视频适配卡。
  4. 用硬盘参数初始化磁盘控制器。
  5. 检查 IBM 微通道总线。
  6. 检查 PS/2 定位设备(总线鼠标)。
  7. 检查高级电源管理 (APM) 支持。
  8. 如果支持,在 RAM 中建立一个表来描述可用的硬盘。
  9. 如果内核映像在 RAM 中加载的较低,请将其移至较高的位置。
  10. 设置 A20 引脚(古代 8088 微处理器的兼容性黑客)。
  11. 设置临时中断描述符表 (IDT) 和临时全局描述符表 (GDT)。
  12. 重置浮点单元 (FPU)。
  13. 重新编程可编程中断控制器 (PIC)。
  14. 从真实模式切换到保护模式。

startup_32()

  1. 初始化分段寄存器和临时堆栈。
  2. 清除寄存器中的所有位eflags
  3. 用零填充未初始化数据的区域。
  4. 调用decompress_kernel()以解压缩内核映像。

startup_32() (同名,其他功能):

  1. 初始化最终分段寄存器。
  2. bss用零填充段。
  3. 初始化临时内核页表。
  4. 启用分页。
  5. 为进程 0 设置内核模式堆栈。
  6. 再次清除寄存器中的所有位eflags
  7. 用空中断处理程序填充 IDT。
  8. 用系统参数初始化第一个页面框架。
  9. 确定处理器的型号。
  10. 使用 GDT 和 IDT 的地址初始化寄存器。

start_kernel(): 几乎每个内核组件都被这个函数初始化,这些只是少数。

  • 调度器
  • 记忆区
  • 伙伴系统分配器
  • IDT
  • 软中断请求
  • 日期和时间
  • Slab 分配器
  • 创建进程 1 ( /sbin/init)

完整的“列表”可在linux/init/main.c的源中找到

在里面

Init 启动所有必要的用户进程以使系统进入所需状态,此例程高度依赖于分配和调用的运行级别。

runlevel在控制台中键入,这将为您提供系统的当前运行级别。

查看/etc/rcX.d/(或/etc/rc.d/rcX.d/),将 X 替换为您的运行级别。
这些是按执行优先级排序的符号链接。S01....意味着,这个脚本很早就开始了,而S99....在启动过程的最后运行。该KXX....符号链接做的关机顺序相同的,但。

通常,这些脚本处理磁盘、网络、日志记录、设备控制、特殊驱动程序、环境和许多其他所需的序列。