Linux内核加载过程

以32位x86,bzImge为例

 

grub版本为0.97

 

1、计算机上电

2、0xFFFFFFF0

当cpu检测reset引脚上的信号后

便将指令指针寄存器的值设置为0xfff0

——INTEL 80386 PROGRAMMER'S REFERENCE MANUAL 1986, Chapter 10

此时为实模式,cpu将执行物理地址0xFFFFFFF0处的指令

访址的时候,硬件将该地址映射到BIOS的ROM中

BIOS中的指令将MBR复制到物理地址0x7c00处,并跳转到该处执行

3、0x7C00

MBR中的指令由grub安装而来,为grub-0.97/stage1/stage1.S

stage1将stage2的第1部分grub-0.97/stage2/start.S(512字节)复制到物理地址0x8000处,并跳转到该处执行

stage2将剩余部分grub-0.97/stage2/asm.S复制到物理地址0x8200处,并跳转到该处执行

...

grub-0.97/stage2/boot.c——load_image()函数

将内核映像bzImage的setup部分复制到物理地址0x90000

vmlinux部分复制到物理地址0x100000处

随后跳转到0x90200处执行

4、0x90200

arch/x86/boot/heaer.S——_start => start_of_setup

检查准备实模式堆栈,bss段清0,随后调用arch/x86/boot/main.c——main()函数

main()中使用BIOS中断读取一些硬件信息,如内存信息等

最后调用arch/x86/boot/pm.c——go_to_protected_mode()函数

go_to_protected_mode()设置段描述符,随后调用arch/x86/boot/pmjump.S——protected_mode_jump()函数

protected_mode_jump()置cr0的PE位,开启保护模式

最后跳转到code32_start,对于bzImage即物理地址0x100000,grub复制的bzImage第2部分

5、0x100000

arch/x86/boot/compressed/head_32.S——startup_32

arch/x86/boot/compressed/misc.c——decompress_kernel()解压内核

解压完成后跳转到output

6、LOAD_PHYSICAL_ADDR

根据不同的配置,解压后的代码在物理内存中的起始位置亦不同

arch/x86/kernel/head_32.S——startup_32

设置页表,置cr0的PG位,开启分页

最后跳转到arch/x86/kernel/head32.c——i386_start_kernel()函数

i386_start_kernel()中最后调用start_kernel()

7、start_kernel()

init/main.c——start_kernel()

进入c代码部分

 

 

 

 

详细的注释请参考git://github.com/kernel-digger/linux-2.6.git

错漏之处还望不吝指出

<think>好的,用户问的是Linux内核加载流程。首先,我需要确认用户对Linux启动过程的了解程度。可能用户是刚开始学习操作系统,或者需要深入理解启动过程以便进行调试或开发。 用户之前的问题涉及C++的new操作、Android相机启动流程,现在转向Linux内核加载,可能是在系统开发或嵌入式领域工作,需要全面了解系统启动的各个阶段。 我需要从硬件上电开始,逐步解释每个阶段,包括BIOS/UEFI、引导程序(如GRUB)、内核解压、初始化流程等。同时,用户可能对各个阶段的具体作用和交互感兴趣,比如如何加载驱动、挂载根文件系统。 需要确保术语准确,比如区分vmlinuz、initrd、initramfs等概念。还要注意不同架构(如x86和ARM)之间的差异,但用户可能更关注通用流程,所以可能不需要深入架构特定的部分。 另外,用户可能想知道内核加载过程中的关键步骤,比如如何从引导程序跳转到内核内核如何初始化硬件、加载模块、启动init进程等。可能还需要提到现代系统中systemd的作用,但保持简洁。 需要避免过于技术化的细节,但又要足够专业,确保用户得到清晰的流程概述。最后,根据用户历史,可能需要提供相关问题,如内核模块加载、引导参数配置、启动问题调试等,帮助用户进一步探索。</think>Linux内核加载流程是一个分阶段的复杂过程,涉及硬件初始化、引导程序加载内核自举。以下是其核心流程解析: ``` 1. 硬件上电自检(Power On) ↓ 2. BIOS/UEFI固件启动 ↓ 3. 引导程序(Bootloader)加载 ├─ GRUB2 (x86) / U-Boot (ARM) ├─ 加载/boot分区的vmlinuz和initramfs ↓ 4. 内核解压与自举 ├─ head_64.S入口点执行 ├─ 页表初始化 ├─ 启动汇编代码 -> C语言环境切换 ↓ 5. 核心初始化(init/main.c) ├─ 架构特定初始化(setup_arch()) ├─ slab分配器激活 ├─ PID/时间子系统初始化 ↓ 6. 根文件系统挂载 ├─ 通过initramfs过渡 ├─ 执行real_root_dev=...参数 ↓ 7. 用户空间启动 └─ execve(/sbin/init) → systemd或sysvinit ``` 关键机制说明: 1. **引导参数解析**: ```bash # /proc/cmdline示例 BOOT_IMAGE=/vmlinuz-5.15.0 root=UUID=... ro quiet splash ``` 2. **内核符号重定位**: ```c // 内核加载地址随机化(KASLR) unsigned long kernel_load_address = kaslr_early_init(); ``` 3. **模块化加载流程**: ``` initramfs -> driver_init() -> do_initcalls() ``` 典型调试手段: ```bash # 使用bootparam设置调试参数 Kernel command line: ... debug earlyprintk=serial ```
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值