启动
UEFI/BIOS
- 电源初始化后,CPU处于实模式,CPU直接从ROM中执行UEFI/BIOS,ROM会被映射到处理器的内存空间;然而,从ROM中取指令是非常慢的,所以UEFI/BIOS做的第一件事就是把自己从ROM复制到RAM中并解压,然后从RAM中执行。
- BIOS在内存中夹在中断向量表和中断服务程序。
- CPU执行
int 0x19
中断,然后将MBR复制到内存中的指定位置。
- MBR会将自己复制到另外的内存地址,这样做是为了规划内存空间。
Bootloader:Grub
- Stage 1:Stage1存放在MBR中,空间太小,代码无法识别文件系统,用于引导Stage1.5
- Stage1.5:Stage1.5存放在MBR之后的32KB中,可以识别文件系统,从文件系统中引导Stage2
- Stage2:加载Grub配置文件
/boot/grub/grub.conf
,根据配置文件,加载内核和虚拟文件系统
Kernel
- arch/x86/boot/header.S:
_start
:call main
- arch/x86/boot/main.c:
main
:go_to_protected_mode
- arch/x86/boot/pm.c:
go_to_protected_mode
:protected_mode_jump
- arch/x86/boot/pmjump.S:
protected_mode_jump
:jmpl *%eax
- THE LINUX/x86 BOOT PROTOCOL:
eax=0x100000
- arch/x86/boot/compressed/head_32.S/arch/x86/boot/compressed/head_64.S
- ……
- init/main.c:
start_kernel
>rest_init
>kernel_init
Init:Systemd
- init/main.c:
start_kernel
>rest_init
>kernel_init
>try_to_run_init_process
>run_init_process
>kernel_exceve