1.bios引导
摁下电源,cpu上电,加载固化在ROM中的bios程序到内存中运行,bios加载MBR(磁盘第一个扇区)中的bootloader(grub)程序,bootlodar加载os。

MBR中的内容是boot.image,运行boot.image会自动执行到core.image中的第一个扇区,然后core.img读取grub.cfg,生成菜单界面,等待用户选择加载项,选择后会加载对应操作系统内核和initrd镜像,并将控制权转移到内核,启动操作系统。

Linux开机启动过程(1):内核引导过程_real-mode setup code of the kernel.-CSDN博客
以上链接也讲了bios引导到grub,再到os的过程,讲的很详细
中文版链接:引导 - 内核解压缩 - 《Linux 内核揭秘(中文版)》 - 书栈网 · BookStack

2.uefi引导
摁下电源,cpu上电,加载固化在ROM中的uefi程序到内存中运行,uefi启动后,GUID 分区表就会被识别,之后 EFI 系统就会通过 *.efi(如bootx64.efi) 文件启动 Boot Loader 程序加载操作系统内核。(GUID 分区表就被识别后,之后 EFI 系统读取全局 NVRAM 变量,启动 Boot Loader 程序(根据启动顺序加载 efi 可执行文件),efi 会加载操作系统内核。)

加载Nvram:读取BOOT.CSV/BOOTX64.CSV文件,处理NVRAM启动项
由于NVRAM设置shimx64.efi为入口点,系统会先加载ubuntu/shimx64.efi,其中init_grub函数负责加载fbx64.efi、mmx64.efi模块,提供图形显示和内存管理的支持,然后再加载并启动grubx64.efi。加载这些模块的过程是通过调用UEFI固件提供的LoadImage和StartImage函数实现的。LoadImage函数用于加载模块文件,而StartImage函数用于启动模块文件中的代码。
grubx64.efi读取grub.cfg,处理引导配置信息,等用户选择指定的启动项后或使用默认启动项,加载操作系统内核和initrd,并将控制权转交给内核。

上述StartImage会调用到内核中的efi_pe_entry函数。
关于efi_pe_entry的来源,调用流程:linux内核启动流程分析 - efi_pe_entry

BIOS 与 UEFI 引导流程 - LARRY1024 - 博客园
Linux Grub2原理学习 - Edvison's Blog
对于arch/x86/boot/header.S文件:主要是构建内核头(pe头等)
arch/x86/boot/compressed/head_64.S文件:主要是解压内核(extract_kernel),切换到长模式,跳转到内核(efi_main获取startup_32运行地址,计算 startup_64 地址)

943

被折叠的 条评论
为什么被折叠?



