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


9

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


2
你不应该知道这一点。您应该想要学习的东西。
alex

Answers:


15

从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():几乎每个内核组件都通过此函数初始化,仅是少数几个。

  • 排程器
  • 记忆区
  • 好友系统分配器
  • IDT
  • SoftIRQ
  • 日期和时间
  • 平板分配器
  • 创建流程1(/sbin/init

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

在里面

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

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

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

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


LXR是读取Linux内核源代码的不错的界面。不错的清单,但是请注意,其中很多是非常依赖于体系结构的(这是PC版本)。
吉尔(Gilles)“所以,别再邪恶了”,2010年

1
  • 看到“解压缩Linux ..”后,内核将立即控制系统硬件。
  • 内核检查并设置图形卡的BIOS寄存器和屏幕输出格式。
  • 内核然后读取BIOS设置,并初始化基本硬件接口。
  • 接下来,内核中的驱动程序将初始化硬件。
  • 然后内核检查分区
  • 然后挂载根文件系统
  • 然后,内核启动init,该init将引导主系统及其所有程序和配置。

0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.