我只是想知道启动过程后将 Linux 内核映像加载到 RAM 中后发生的活动流程。
答案1
从 Linux 2.6 开始:
核心
加载到RAM后,内核执行以下功能。
setup()
:
- 在 RAM 中构建一个表来描述物理内存的布局。
- 设置键盘重复延迟和速率。
- 初始化视频适配器卡。
- 使用硬盘参数初始化磁盘控制器。
- 检查 IBM Micro Channel 总线。
- 检查 PS/2 指点设备(总线鼠标)。
- 检查高级电源管理 (APM) 支持。
- 如果支持,请在 RAM 中构建一个表来描述可用的硬盘。
- 如果内核映像在 RAM 中加载较低,请将其移至较高位置。
- 设置 A20 引脚(针对古老 8088 微处理器的兼容性修改)。
- 设置临时中断描述符表(IDT)和临时全局描述符表(GDT)。
- 重置浮点单元 (FPU)。
- 对可编程中断控制器 (PIC) 重新编程。
- 从实模式切换到保护模式。
startup_32()
:
- 初始化分段寄存器和临时堆栈。
- 清除
eflags
寄存器中的所有位。 - 用零填充未初始化数据的区域。
- 调用
decompress_kernel()
解压缩内核映像。
startup_32()
(同名,其他功能):
- 初始化最终分段寄存器。
- 用零填充
bss
段。 - 初始化临时内核页表。
- 启用分页。
- 为进程 0 设置内核模式堆栈。
- 再次清除
eflags
寄存器中的所有位。 - 用空中断处理程序填充 IDT。
- 使用系统参数初始化第一页框。
- 确定处理器的型号。
- 使用 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
引导加载程序通过内核命令行(如果有)跳转到映像入口点,内核处理其余的事情。