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

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

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

答案1

从 Linux 2.6 开始:

核心

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

setup():

  1. 在 RAM 中构建一个表来描述物理内存的布局。
  2. 设置键盘重复延迟和速率。
  3. 初始化视频适配器卡。
  4. 使用硬盘参数初始化磁盘控制器。
  5. 检查 IBM Micro Channel 总线。
  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():几乎每个内核组件都由该函数初始化,这些只是其中的一小部分。

  • 调度程序
  • 内存区域
  • 好友系统分配器
  • 离子交换技术
  • 软IRQ
  • 日期和时间
  • 板坯分配器
  • 创建进程1 ( /sbin/init)

完整的“列表”可在以下来源获得:linux/init/main.c

在里面

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

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

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

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

答案2

  • 当你看到“Uncompressing Linux..”时,内核就接管了系统硬件的控制。
  • 内核检查并设置显卡的BIOS寄存器和屏幕输出格式。
  • 然后内核读取BIOS设置,并初始化基本硬件接口。
  • 接下来内核中的驱动程序初始化硬件。
  • 然后内核检查分区
  • 然后挂载根文件系统
  • 然后内核启动 init,它启动主系统及其所有程序和配置。

答案3

引导加载程序通过内核命令行(如果有)跳转到映像入口点,内核处理其余的事情。

相关内容