From 84fbc6dd7cdaff903526ecfe32e824de7c4564ed Mon Sep 17 00:00:00 2001 From: Song Shuai Date: Mon, 24 Apr 2023 22:15:08 +0800 Subject: [PATCH 1/5] add 20230417-riscv-linux-uefi-boot-1.md Signed-off-by: Song Shuai --- articles/20230417-riscv-linux-uefi-boot-1.md | 487 ++++++++++++++++++ .../images/riscv_uefi/riscv-edk2-boot.png | Bin 0 -> 149553 bytes 2 files changed, 487 insertions(+) create mode 100644 articles/20230417-riscv-linux-uefi-boot-1.md create mode 100644 articles/images/riscv_uefi/riscv-edk2-boot.png diff --git a/articles/20230417-riscv-linux-uefi-boot-1.md b/articles/20230417-riscv-linux-uefi-boot-1.md new file mode 100644 index 0000000..9c74d4f --- /dev/null +++ b/articles/20230417-riscv-linux-uefi-boot-1.md @@ -0,0 +1,487 @@ +> Corrector: [TinyCorrect](https://gitee.com/tinylab/tinycorrect) v0.1 - [spaces pangu]
+> Author: sugarfillet
+> Date: 2023/04/17
+> Revisor: Falcon falcon@tinylab.org
+> Project: [RISC-V Linux 内核剖析](https://gitee.com/tinylab/riscv-linux)
+> Proposal: [RISC-V UEFI 启动流程分析与 EDK2 移植](https://gitee.com/tinylab/riscv-linux/issues/I64FSG)
+> Sponsor: PLCT Lab, ISCAS + +# RISC-V Linux UEFI boot process 1 + +## 前言 + +现阶段 RISC-V 主要专注于嵌入式领域,供学习和开发用的评估板一般是单板计算机的形式(Single Board Computer),软件方面基本上是依赖半导体厂商发布完整的 SDK,在 bootloader 这方面轻量级的 U-Boot 成为了首选。随着厂商不断提高 RISC-V 的硬件性能,将不可避免地向上进入台式机甚至是服务器领域。届时,RISC-V 需要面对一个成熟的、分散的、玩家众多的和重度依赖生态的市场。而 UEFI 是市场给出的选择和答案,RISC-V 也必须遵守。 + +本文结合 RISC-V 架构对 UEFI 的启动过程进行简单介绍,并重点分析 RISC-V Linux 中的 UEFI 启动相关实现。 + +*说明* + - Linux 版本采用 v6.3 + - UEFI 标准采用 [2.10][1] 版本文档 + - edk2 版本采用 `edk2-stable202302` 分支 + +## 构建 RISC-V EDK2 实验环境 + +EDK2 作为 UEFI 标准的开源实现,主要包括以下三个代码仓库: + +- [edk2][5]:edk2 主分支 +- [edk2-platforms][6]:edk2 的平台支持分支 +- [edk2-non-osi][7]: 不兼容 edk2 和 edk2-platform license 的分支 + +在构建 RISC-V edk2 实验环境过程中,主要用到前两个仓库:可通过第一个仓库构建 Qemu virt 的 edk2 镜像 ([参考][2]),也可结合第二仓库构建 Qemu sifive_u (HiFiveUnleashedBoard) 的 edk2 镜像 ([参考][3]),这里以 Qemu virt 为例,列出几个关键步骤: + +```sh +## ... 构建 Qemu virt edk2 镜像 +build -a RISCV64 --buildtarget RELEASE -p OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc -t GCC5 + +## 构建 Linux 、rootfs 、efi.img + +## 通过 pflash1 指定 edk2 镜像,启动 Qemu +qemu-system-riscv64 -nographic \ +-drive file=Build/RiscVVirtQemu/RELEASE_GCC5/FV/RISCV_VIRT.fd,if=pflash,format=raw,unit=1 \ +-machine virt -m 2G \ +-drive file=buildroot/output/images/rootfs.ext2,format=raw,id=hd0 -device virtio-blk-device,drive=hd0 \ +-drive file=efi.img,format=raw,id=hd1 -device virtio-blk-device,drive=hd1 + +## 进入 EFI Shell 执行 linux +Shell> fs0:\Image root=/dev/vda console=ttyS0 rootwait earlycon=uart8250,mmio,0x10000000 +``` + +## RISC-V EDK2 启动流程简介 + +RISC-V 架构的 edk2 移植的基本思路是基于 edk2 项目现有的启动流程以及构建环境,将 OpenSbi 编译为库并链接到 SEC 模块以充分利用 OpenSbi 进行平台的初始化。这里基于 UEFI 启动的七个启动阶段对 RISC-V 的实现做简单介绍(详见 edk2-platform 的 `Platform/RISC-V/PlatformPkg/Readme.md`)。 + +![riscv-edk2-boot.png](images/riscv_uefi/riscv-edk2-boot.png) + +- SEC 阶段 + + 处理系统上电或重启,执行 ResetVector 代码;创建临时内存;提供安全信任链的根;传送系统参数到下一阶段。 + + RISC-V: SEC 阶段调用 sbi_init 执行 OpenSbi 的初始化,之后以 NextAddr 和 NextMode 跳转到 PEI 阶段。其中 SEC 以及 Sbi 运行在 M-mode,而之后的阶段(PEI/DXE/BDS)则运行在 NextMode 指定的 S-mode (OEM 可通过相关的 PCD 设置(PcdPeiCorePrivilegeMode 或者 PcdDxeCorePrivilegeMode 指定后续阶段运行在其他模式) + +- PEI 阶段 + + 此阶段依次执行 PEIM (PEI Module) 进行平台的初始化,将需要传递给 DXE 的信息组成 HOB(Handoff Block) 表,最终将控制权转交给 DXE。 + + RISC-V: PEI 默认运行在 S-mode,如果需要运行 SEC 阶段的 PEI protocol interface (PPI) 代码,则要在该阶段早期安装 PPI 并通过 PlatformSecPpiLib 库来避免模式保护限制。 + + PEI 通过 RiscVFirmwareContextLib 库访问 OpenSbi 固件上下文 -- EFI_RISCV_OPENSBI_FIRMWARE_CONTEXT。 + + ```c + typedef struct { + UINT64 BootHartId; + VOID *PeiServiceTable; // PEI Service table // 向上以 PeiServiceTablePointerOpensbi 库提供访问 + UINT64 FlattenedDeviceTree; // Pointer to Flattened Device tree + UINT64 SecPeiHandOffData; // This is EFI_SEC_PEI_HAND_OFF passed to PEI Core. + EFI_RISCV_FIRMWARE_CONTEXT_HART_SPECIFIC *HartSpecific[RISC_V_MAX_HART_SUPPORTED]; // Hart 信息(拓展支持、厂商信息、模式切换方法(HartSwitchMode)) + } EFI_RISCV_OPENSBI_FIRMWARE_CONTEXT; + ``` + + PEI 驱动可通过 PEI OpenSBI PPI 调用 SBI 服务。 + +- DXE 阶段 + + 该阶段执行系统初始化工作,为后续 UEFI Application 和操作系统提供 UEFI 系统表、启动服务和运行时服务。 + + RISC-V: DXE 默认运行在 S-mode,DXE 驱动可通过 DXE OpenSBI protocol 调用 SBI 服务。 + +- BDS 阶段 + + 此阶段枚举每个启动设备,并执行启动策略(由全局 NVRAM 变量指定,运行时可修改)。如果 BDS 启动失败,系统会重新调用 DXE 派遣器,再次进入寻找启动设备的流程。 + + RISC-V: BDS 阶段必须要在将系统控制权移交给 S-mode 的 OS、OS loader、UEFI Application 之前切换到 S-mode。 + +- TSL 阶段 + + 此阶段为 OS loader(比如:grub、Linux EFI Boot Stub)执行的第一阶段,在这个阶段系统资源还是被 UEFI 所控制,直到 OS loader 执行 `BS.ExitBootServices()` 退出 Boot Service 进入 Runtime 阶段。 + + RISC-V:此阶段为 Linux 内核的 EFI Boot Stub 处理流程,我们放在后文详细介绍。 + +- RT 阶段 + + UEFI 各种系统资源被转移到 OS loader,启动服务不能再使用,仅保留运行时服务供操作系统使用。 + + RISC-V: 此阶段涉及 Linux 内核的 UEFI 运行时的初始化流程,我们放在后文详细介绍。 + +- AL 阶段 + + 在 RT 阶段,如果系统遇到灾难性错误,系统固件需要提供错误处理和灾难恢复机制,这种机制运行在 AL(AferLife)阶段。UEFI 和 UEFI PI 标准都没有定义此阶段的行为和规范。 + +## UEFI Linux 启动过程 + +### UEFI 内核镜像 + +UEFI Boot Manager 用于加载并执行 PE 格式的 UEFI 镜像,UEFI 镜像分为三类 UEFI Application、UEFI boot service drivers、UEFI runtime drivers,体现在 PE 头的 "Subsystem" 字段,三者的主要区别在于镜像加载时分配的内存空间不同(详见后文关于 UEFI 内存映射表的描述)。另外 PE 头的 "Machine" 字段表示该镜像可运行的平台,edk2 中 `MdePkg/Library/BasePeCoffLib/RiscV/PeCoffLoaderEx.c` 就定义了对 `EFI_IMAGE_MACHINE_RISCV64` 类镜像的处理函数。 + +```c +// BaseTools/Source/C/Include/IndustryStandard/PeImage.h : 22 + +// PE32+ Subsystem type for EFI images +#define EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION 10 +#define EFI_IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER 11 +#define EFI_IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER 12 + +// PE32+ Machine type for EFI images +#define EFI_IMAGE_MACHINE_IA32 0x014c +#define EFI_IMAGE_MACHINE_IA64 0x0200 +#define EFI_IMAGE_MACHINE_EBC 0x0EBC +#define EFI_IMAGE_MACHINE_x64 0x8664 +#define EFI_IMAGE_MACHINE_ARMTHUMB_MIXED 0x01C2 +#define EFI_IMAGE_MACHINE_AARCH64 0xAA64 +#define EFI_IMAGE_MACHINE_RISCV32 0x5032 +#define EFI_IMAGE_MACHINE_RISCV64 0x5064 +#define EFI_IMAGE_MACHINE_RISCV128 0x5128 +#define EFI_IMAGE_MACHINE_LOONGARCH32 0x6232 +#define EFI_IMAGE_MACHINE_LOONGARCH64 0x6264 +``` + +在 UEFI Application 中有一类特殊的应用 - UEFI OS Loader,顾名思义,此应用是用来加载操作系统的,其被 Boot Manager 加载并执行,如果成功加载 OS,调用 `EFI_BOOT_SERVICES.ExitBootServices()` 结束 Boot Services 并将系统控制权转移给 OS,OS 继而可以使用 UEFI 提供的 Runtime Services。比如:grub 其在 EFI 分区存放的 grubx86.efi 就是一个 UEFI OS Loader, 通过 file 命令可以看到它是一个格式为 PE32+ 的 EFI Application。 + +```bash +$file /boot/efi/EFI/boot/grubx64.efi +/boot/efi/EFI/boot/grubx64.efi: PE32+ executable (EFI application) x86-64 (stripped to external PDB), for MS Windows +``` + +在“构建 RISC-V EDK2 实验环境”一节中,我们可以在 UEFI Shell 中直接运行内核镜像 -- Image,难道 Image 也是一个 UEFI Boot Loader 么? + +是的,Linux 内核提供 `CONFIG_EFI_STUB` 选项用于将内核镜像封装为 PE 镜像,当固件加载并执行此镜像时会跳转到镜像中定义的入口地址,继而执行与 OS Loader 相似的功能,并最终跳转到正式内核入口 `_start`,这一部分代码称之为 EFI Boot Stub。我们接下来,看下 UEFI 内核镜像是如何构建的: + +在 `arch/riscv/kernel/head.S` 中 `_start` 使用 `_HEAD` 修饰,声明其定义在 `.head.text` 节中,此节的开头部分按照 `struct riscv_image_header` 布局,其中: + +`riscv_image_header.{code0,code1)` 以 64 位对齐,如果开启 `CONFIG_EFI`,填充 `c.li s4,-13` 指令和 `j _start_kernel`。其中 `c.li` 指令编码为 16 位的 '0x5a4d',此值对应 `MZ_MAGIC`,使得该节经过链接以及 objcopy 可生成开头为 "MZ" 魔数的 PE 镜像。 + +```c + +// arch/riscv/include/asm/image.h : 55 + +struct riscv_image_header { + u32 code0; + u32 code1; + u64 text_offset; + ... + u32 res3; +}; + +// arch/riscv/kernel/head.S : 21 + +__HEAD +ENTRY(_start) +#ifdef CONFIG_EFI + c.li s4,-13 // #define MZ_MAGIC 0x5a4d + j _start_kernel +#else + j _start_kernel + .word 0 +#endif + .balign 8 + + // ... +#ifdef CONFIG_EFI + .word pe_head_start - _start // riscv_image_header.rev3 +pe_head_start: + __EFI_PE_HEADER +#else + .word 0 +#endif + + // ... +``` + +`riscv_image_header.rev3` 为最后的成员,存储 PE 头与 _start 的偏移,并在其后追加 PE 头 `__EFI_PE_HEADER`。`__EFI_PE_HEADER` 定义在 `arch/riscv/kernel/efi-header.S` 文件中,按照 PE 镜像相关结构进行布局,这里摘录几个关键的点进行介绍: + +- `coff_header.Machine` 定义为 `IMAGE_FILE_MACHINE_RISCV64` 或者 `IMAGE_FILE_MACHINE_RISCV32`,此值与前面介绍的 UEFI 镜像中的 "Machine" 字段相对应,在 edk2 中定义为 `EFI_IMAGE_MACHINE_RISCV64` 和 `EFI_IMAGE_MACHINE_RISCV32` + +- `extra_header_fields.Subsystem` 定义为 `IMAGE_SUBSYSTEM_EFI_APPLICATION`,表明此镜像为 EFI Application 类型的 UEFI 镜像,此值在 edk2 中定义为 `EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION` + +- `optional_header.AddressOfEntryPoint` 定义为 `__efistub_efi_pe_entry - _start`,表明此镜像被加载后并执行的入口函数为 `efi_pe_entry`(`__efi_stub_` 前缀为 EFI Boot Stub 相关代码 objcopy 时所添加) + +```c + +// arch/riscv/kernel/efi-header.S : 10 + + .macro __EFI_PE_HEADER + .long PE_MAGIC +coff_header: +#ifdef CONFIG_64BIT + .short IMAGE_FILE_MACHINE_RISCV64 // Machine +#else + .short IMAGE_FILE_MACHINE_RISCV32 // Machine +#endif + +optional_header: +#ifdef CONFIG_64BIT + .short PE_OPT_MAGIC_PE32PLUS // PE32+ format +#else + .short PE_OPT_MAGIC_PE32 // PE32 format +#endif + + .long __efistub_efi_pe_entry - _start // AddressOfEntryPoint + +extra_header_fields: + //... + .short IMAGE_SUBSYSTEM_EFI_APPLICATION // Subsystem + +// ./drivers/firmware/efi/libstub/Makefile : 149 + +STUBCOPY_FLAGS-$(CONFIG_RISCV) += --prefix-alloc-sections=.init \ + --prefix-symbols=__efistub_ +STUBCOPY_RELOC-$(CONFIG_RISCV) := R_RISCV_HI20 +``` + +### EFI Boot Stub efi_pe_entry + +上节中介绍到,在 UEFI Shell 中直接执行的 UEFI 内核镜像是一个 PE 格式的 UEFI Application(准确说是一个 UEFI OS Loader),其被加载后执行的入口函数为 `efi_pe_entry`(也可理解为是 EFI Boot Stub 的入口),此函数执行 OS Loader 相关的任务,并最终跳转到正式内核的入口 `_start`。 + +`efi_pe_entry` 作为 UEFI 镜像的入口函数,遵守 UEFI 标准中 EFI 镜像入口点 -- "EFI_IMAGE_ENTRY_POINT" 的接口定义,此接口的第一个参数 `ImageHandle` 是固件为当前镜像创建的句柄,在入口函数的后续流程中可通过 `EFI_LOADED_IMAGE_PROTOCOL` 获取当前镜像的一些信息;第二个参数 `SystemTable` 为系统表,这个参数主要包含以下信息: + +- 控制台的标准输入输出、错误输出 (ConsoleInHandle/ConsoleOutHandle/StandardErrorHandle) +- Boot Services / Runtime 服务表 (BootServices/RuntimeServices),后续分析中会大量用到 Boot Services 提供的服务 +- 配置表 (ConfigurationTable),比如:ACPI, SMBIOS、设备树 等等 + +```c +// MdePkg/Include/Uefi/UefiSpec.h : 1975 + +typedef +EFI_STATUS +(EFIAPI *EFI_IMAGE_ENTRY_POINT) ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ); + +typedef struct { + EFI_TABLE_HEADER Hdr; + CHAR16 *FirmwareVendor; + UINT32 FirmwareRevision; + EFI_HANDLE ConsoleInHandle; + EFI_SIMPLE_TEXT_INPUT_PROTOCOL *ConIn; + EFI_HANDLE ConsoleOutHandle; + EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *ConOut; + EFI_HANDLE StandardErrorHandle; + EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *StdErr; + EFI_RUNTIME_SERVICES *RuntimeServices; + EFI_BOOT_SERVICES *BootServices; + UINTN NumberOfTableEntries; + EFI_CONFIGURATION_TABLE *ConfigurationTable; +} EFI_SYSTEM_TABLE; +``` + +`efi_pe_entry()` 函数执行如下步骤: + +调用 `BS.HandleProtocol()` 接口获取当前 UEFI 镜像到 `image` 变量;`efi_handle_cmdline` 函数可通过 `image->load_options` 获取 UEFI Shell 中指定的内核命令行参数。 + +`handle_kernel_image()` 调用 `efi_relocate_kernel` 进行内核的重定位:调用 `BS.AllocatePages(EFI_ALLOCATE_ADDRESS)` 在 `EFI_LOADER_DATA` 内存空间为内核镜像分配内存,分配的起始地址为 2M(if 64bit),分配大小为 `_end - start` 即内核镜像大小,并逐字拷贝内核镜像,需要注意的是这里没有拷贝 bss 相关段。如果给定的起始地址不满足条件,则会调用 `efi_low_alloc_above()` 在 UEFI 内存映射表的 `EFI_LOADER_DATA` 空间找到尽可能小的地址进行内存分配。 + +```c +// drivers/firmware/efi/libstub/efi-stub-entry.c + +efi_status_t __efiapi efi_pe_entry(efi_handle_t handle, efi_system_table_t *systab) + + WRITE_ONCE(efi_system_table, systab); + + // get image by BS.HandleProtocol(handle,EFI_LOADED_IMAGE_PROTOCOL,) + efi_bs_call(handle_protocol, handle, &loaded_image_proto, (void *)&image); + + // 处理 EFI 应用的命令行 + efi_handle_cmdline(image, &cmdline_ptr); + + // kernel 重定位 + handle_kernel_image(&image_addr, &image_size, &reserve_addr, &reserve_size, image, handle); // relocate kernel + kernel_size = _edata - _start; + *image_addr = (unsigned long)_start; + *image_size = kernel_size + (_end - _edata); // efi kernel size + + efi_relocate_kernel(image_addr, kernel_size, *image_size, preferred_addr, efi_get_kimg_min_align(), 0x0); + efi_bs_call(allocate_pages, EFI_ALLOCATE_ADDRESS, EFI_LOADER_DATA, nr_pages, &efi_addr); + memcpy((void *)new_addr, (void *)cur_image_addr, image_size); + image_addr = efi_addr or new_addr; // update image_addr + + efi_stub_common(handle, image, image_addr, cmdline_ptr); +``` + +`efi_pe_entry()` 在对内核镜像进行重定位后,调用 `efi_stub_common()` 访问必要的 UEFI 接口执行一些简单的初始化任务,最终调用 `efi_boot_kernel()` 启动正式内核: + +- `check_platform_features()` 通过 `RISCV_EFI_BOOT_PROTOCOL_GUID` 协议设置 `hartid`,如果失败则通过配置表中的 FDT 的 "chosen" 节点的 "boot-hartid" 属性获取(可通过平台级的 `PcdBootHartId` 进行配置) + +- `setup_graphics()` 通过 `EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID` 协议获取显示相关信息 + +- `efi_load_initrd()` 加载 initrd + + initrd 一般有两个来源,固件提供(比如:qemu 命令行指定、或者通过 UEFI Shell 的 initrd 命令指定)以及 Linux 命令行指定。第一种情况下,执行 `efi_load_initrd_dev_path()` 访问 `LINUX_EFI_INITRD_MEDIA_GUID` 配置表来获取;第二种情况下,执行 `efi_load_initrd_cmdline()` 调用 `efi_open_file` 来获取。之后,在 `EFI_LOADER_DATA` 中为其分配内存空间,并将 initrd 以 `LINUX_EFI_INITRD_MEDIA_GUID` 安装到配置表中。 + +- `efi_random_get_seed()` 通过 `EFI_RNG_PROTOCOL_GUID` 获取随机源,并将其以 `LINUX_EFI_RANDOM_SEED_TABLE_GUID` 安装到配置表中 + +- `install_memreserve_table()` 安装 `LINUX_EFI_MEMRESERVE_TABLE_GUID` 配置表 + +```c +// drivers/firmware/efi/libstub/efi-stub.c : 287 + +efi_stub_common(handle, image, image_addr, cmdline_ptr); + + check_platform_features(); // set `hartid` by RISCV_EFI_BOOT_PROTOCOL_GUID + + setup_graphics(); // get struct screen_info by EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID + + efi_load_initrd() // loaded initrd + efi_load_initrd_dev_path() + efi_load_initrd_cmdline() + + efi_random_get_seed() // EFI_RNG_PROTOCOL random bytes saved as a configuration table + + efi_novamap // 此变量表示代表是否支持为 RT 设置虚拟地址,后文做详细介绍 + + install_memreserve_table() // BS.InstallConfigurationTable LINUX_EFI_MEMRESERVE_TABLE_GUID + + efi_boot_kernel(handle, image, image_addr, cmdline_ptr); +``` + +### EFI Boot Stub efi_boot_kernel + +`efi_boot_kernel()` 主要执行两个函数 -- `allocate_new_fdt_and_exit_boot()`、`efi_enter_kernel()`。 + +`allocate_new_fdt_and_exit_boot()` 函数最终会调用 `BS.ExitBootServices()` 接口结束所有的 UEFI Boot Services,但在这个过程中有两个额外的任务需要处理: + +第一个是与 dtb 相关的处理:dtb 与 initrd 类似有两个来源,一个是固件提供(比如:Qemu 提供给 edk2 的 dtb),还有一个是通过 Linux 命令行提供的。前者从配置表 `DEVICE_TREE_GUID` 中获取,后者通过 `efi_load_dtb()` 走 UEFI 文件接口来获取。之后为 dtb 分配内存,并执行 `update_fdt()` 函数在 dtb 的 chosen 节点中创建如下几个 chosen 变量,配合后续的 `update_fdt_memmap()` 函数对其进行设置。这几个变量会在 EFI Boot Stub 跳转到正式内核后以 dtb 的形式提供,而正式内核则解析这些变量继而执行相应的初始化。 + +- `bootargs` + + 存放命令行参数,传递给正式内核进行解析 + +- `linux,uefi-system-table` + + 存放系统表,正式内核可通过系统表获取 ACPI/INITRD/SMBIOS 等配置表信息并执行对应的初始化,也可通过系统表获取到 UEFI Runtime 服务表。相关内容会在后文详细介绍。 + +- `linux,uefi-mmap-start`, `linux,uefi-mmap-size`, `linux,uefi-mmap-desc-size`, `linux,uefi-mmap-desc-ver` + + 存放 UEFI 内存映射,正式内核可通过 UEFI 内存映射表了解物理内存布局,从而更新 memblock 内存分配器。 + + edk2 中以内存描述符 -- `EFI_MEMORY_DESCRIPTOR` 构成的链表描述 UEFI 内存映射表,并对外提供 `EFI_BOOT_SERVICES.GetMemoryMap()` 接口获取内存映射表。在执行之后的 `efi_exit_boot_services()` 过程中会调用此接口并通过 `update_fdt_memmap()` 函数对相关的 chosen 变量进行更新。相关结构定义如下: + +```c +// MdePkg/Include/Uefi/UefiSpec.h : 160 + +typedef struct { + UINT32 Type; // enum EFI_MEMORY_TYPE eg: EfiLoaderCode、EfiLoaderData、EfiBootServicesCode、EfiBootServicesData .. + EFI_PHYSICAL_ADDRESS PhysicalStart; // 物理内存起始地址 + EFI_VIRTUAL_ADDRESS VirtualStart; // 虚拟地址起始地址 + UINT64 NumberOfPages; // 内存空间大小 + UINT64 Attribute; // 内存属性 eg: Memory cacheability attribute、Physical memory protection attribute、Runtime memory attribute + } EFI_MEMORY_DESCRIPTOR; + +typedef +EFI_STATUS +(EFIAPI \*EFI_GET_MEMORY_MAP) ( + IN OUT UINTN *MemoryMapSize, // 整个内存映射表的大小 + OUT EFI_MEMORY_DESCRIPTOR *MemoryMap, // 内存映射表 + OUT UINTN *MapKey, // 固件返回的内存映射 key 值 + OUT UINTN *DescriptorSize, // 内存描述符的大小 + OUT UINT32 *DescriptorVersion // 内存描述符的版本 -- EFI_MEMORY_DESCRIPTOR_VERSION = 1 + ); +``` + +`allocate_new_fdt_and_exit_boot()` 函数还有一个任务就是与 Runtime Services 相关的处理: + +在 UEFI 标准中定义 `EFI_RT_PROPERTIES_TABLE` 结构来表示 `EFI_RT_PROPERTIES_TABLE_GUID` 配置表,其关键成员 `RuntimeServicesSupported` 用来表示 Runtime 所支持的服务,该成员的 `EFI_RT_SUPPORTED_SET_VIRTUAL_ADDRESS_MAP` 标志位表示是否支持为 Runtime 服务设置虚拟地址。在 `efi_stub_common` 阶段会对此标志位进行检查并保存到 `efi_novamap` 变量中。 + +```c +// MdePkg/Include/Guid/RtPropertiesTable.h : 28 + +typedef struct { + UINT16 Version; + UINT16 Length; + UINT32 RuntimeServicesSupported; +} EFI_RT_PROPERTIES_TABLE; + +typedef +EFI_STATUS +SetVirtualAddressMap ( + IN UINTN MemoryMapSize, + IN UINTN DescriptorSize, + IN UINT32 DescriptorVersion, + IN EFI_MEMORY_DESCRIPTOR *VirtualMap // runtime_map + ); +``` + +`allocate_new_fdt_and_exit_boot()` 函数对 `efi_novamap` 进行判断,如果支持虚拟地址设置,则在 `EFI_LOADER_DATA` 空间分配 UEFI 内存映射大小的内存,保存在 `struct exit_boot_struct` 实例的 `runtime_map` 中。在执行之后的 `efi_exit_boot_services()` 函数过程中,会调用 `efi_get_virtmap()` 遍历 UEFI 内存映射表,如果为 `EFI_MEMORY_RUNTIME` 类型的内存描述符,则以 `phys_addr + EFI_RT_VIRTUAL_OFFSET` 设置其 `virt_addr`(线性映射),最后将此描述符拷贝到 `runtime_map` 中,并更新其计数 `runtime_entry_count`。 + +`efi_exit_boot_services()` 结尾处调用 `BS.ExitBootServices()` 接口结束所有的 UEFI Boot Services,在此接口成功返回后,调用 `RT.SetVirtualAddressMap()` 接口,从而固件中的所有运行时服务都采用虚拟地址进行访问。 + +```c +// drivers/firmware/efi/libstub/fdt.c : 184 + +struct exit_boot_struct { + struct efi_boot_memmap *boot_memmap; // UEFI 内存映射表 + efi_memory_desc_t *runtime_map; // 已设置虚拟地址的 EFI_MEMORY_RUNTIME 类型的内存描述符链表 + int runtime_entry_count; // runtime_map 表数目 + void *new_fdt_addr; // 分配的 fdt 地址 +}; + +struct efi_boot_memmap { // 对应 EFI_GET_MEMORY_MAP 接口 + unsigned long map_size; + unsigned long desc_size; + u32 desc_ver; + unsigned long map_key; + unsigned long buff_size; + efi_memory_desc_t map[]; +}; + +// drivers/firmware/efi/libstub/fdt.c : 343 + +efi_boot_kernel(void *handle, efi_loaded_image_t *image, unsigned long kernel_addr, char *cmdline_ptr); + + allocate_new_fdt_and_exit_boot(handle, image, &fdt_addr, cmdlinetr); + + // 创建 p->runtime_map in LOADER_DATA + !efi_novamap && efi_alloc_virtmap(&priv.runtime_map, &desc_size, &desc_ver); + + // 处理 fdt + efi_load_dtb(image, &fdt_addr, &fdt_size); // same as efi_load_initrd + + efi_allocate_pages(MAX_FDT_SIZE, new_fdt_addr, ULONG_MAX); + update_fdt((void *)fdt_addr, fdt_size,...)) // 添加 chosen 变量 + priv.new_fdt_addr = (void *)*new_fdt_addr; + + // 更新 fdt,退出 Boot Services,设置 RT 为虚拟地址 + + efi_exit_boot_services(handle, &priv, exit_boot_func) + efi_get_memory_map(&map, true); // BS.GetMemoryMemmep + exit_boot_func(map,priv) + p->boot_memmap = map; // struct exit_boot_struct p; + + efi_get_virtmap(map->map, map->map_size, map->desc_size, p->runtime_map, &p->runtime_entry_count); + in->virt_addr = in->phys_addr + EFI_RT_VIRTUAL_OFFSET // RISC-V EFI_RT_VIRTUAL_OFFSET = 0 + + update_fdt_memmap(p->new_fdt_addr, map) + + efi_bs_call(exit_boot_services, handle, map->map_key); // BS.ExitBootServices + // RT.SetVirtualAddressMap() : Changes the runtime addressing mode of EFI firmware from physical to virtual + efi_system_table->runtime->set_virtual_address_map(priv.runtime_entry_count * desc_size, desc_size, desc_ver, priv.runtime_map); + + efi_enter_kernel(kernel_addr, fdt_addr, fdt_totalsize((void fdt_addr)); +``` + +`efi_boot_kernel()` 函数最后调用 `efi_enter_kernel()`,清空 `satp` 以关闭 MMU,以 `hartid` 和 `fdt` 为参数调用 `_start`。 + +```c +// drivers/firmware/efi/libstub/riscv.c : 97 + +// entrypoint 就是 efi_relocate_kernel 阶段返回的 _start 加载地址 +efi_enter_kernel(unsigned long entrypoint, unsigned long fdt, unsigned long fdt_size); + csr_write(CSR_SATP, 0); + jump_kernel(hartid, fdt); +``` + +## 小结 + +Linux EFI Boot Stub 作为一种 UEFI OS Loader 在 UEFI 的 TSL 阶段调用 Boot Services 接口为正式内核准备 系统表、UEFI 内存映射表、命令行参数,并在退出 Boot Services 后,又为 Runtime Services 设置虚拟地址,最终跳转到正式内核。那么正式内核又将如何处理 EFI Boot Stub 传递的数据呢?且看下文分解。 + +## 参考资料 + +- [UEFI 标准][1] +- [OpenSBI/U-Boot/UEFI 简介][4] + +[1]: https://uefi.org/specs/UEFI/2.10/index.html +[2]: https://github.com/vlsunil/riscv-uefi-edk2-docs/wiki/RISC-V-Qemu-Virt-support +[3]: https://github.com/riscv-admin/riscv-uefi-edk2-docs +[4]: https://tinylab.org/riscv-uefi-part1/ +[5]: http://github.com/tianocore/edk2 +[6]: https://github.com/tianocore/edk2-platforms.git +[7]: https://github.com/tianocore/edk2-non-osi diff --git a/articles/images/riscv_uefi/riscv-edk2-boot.png b/articles/images/riscv_uefi/riscv-edk2-boot.png new file mode 100644 index 0000000000000000000000000000000000000000..7a8a6e04f83b5c11565a68c2fde174e0548be22a GIT binary patch literal 149553 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

4cce__royY&GsAsKLmON+|qoBULB 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

X?@d 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 Axc~qF literal 0 HcmV?d00001 -- Gitee From 24c7c245041f8dbb02a4c64459d968ca78fa557a Mon Sep 17 00:00:00 2001 From: Song Shuai Date: Mon, 24 Apr 2023 22:22:16 +0800 Subject: [PATCH 2/5] add 20230421-riscv-linux-uefi-boot-2.md Signed-off-by: Song Shuai --- articles/20230421-riscv-linux-uefi-boot-2.md | 278 +++++++++++++++++++ 1 file changed, 278 insertions(+) create mode 100644 articles/20230421-riscv-linux-uefi-boot-2.md diff --git a/articles/20230421-riscv-linux-uefi-boot-2.md b/articles/20230421-riscv-linux-uefi-boot-2.md new file mode 100644 index 0000000..357ffcf --- /dev/null +++ b/articles/20230421-riscv-linux-uefi-boot-2.md @@ -0,0 +1,278 @@ +> Corrector: [TinyCorrect](https://gitee.com/tinylab/tinycorrect) v0.1 - [spaces header toc codeinline pangu epw]
+> Author: sugarfillet
+> Date: 2023/04/21
+> Revisor: Falcon falcon@tinylab.org
+> Project: [RISC-V Linux 内核剖析](https://gitee.com/tinylab/riscv-linux)
+> Proposal: [RISC-V UEFI 启动流程分析与 EDK2 移植](https://gitee.com/tinylab/riscv-linux/issues/I64FSG)
+> Sponsor: PLCT Lab, ISCAS + +# RISC-V Linux UEFI boot process 2 + +## 前言 + +上文对 RISC-V Linux 的 EFI Boot Stub 进行了介绍,它给正式内核传递了不少的信息。本文趁热打铁,继续分析正式内核的 UEFI 初始化相关流程。 + +*说明* + - Linux 版本采用 v6.3 + +## UEFI 初始化 -- efi_init + +Linux EFI Boot Stub 以 `boothardid` 和修改了 `chosen` 变量的 fdt 跳转到 `_start` 启动正式内核。正式内核在 `setup_arch()` 阶段调用 `efi_init()` 进行 EFI 的初始化。整体来看,`efi_init()` 的主要工作有两个,一个是对 UEFI 系统表的处理,包括运行时服务的保存、配置表的解析和初步处理;还有一个是把从 UEFI Boot Stub 传递过来的 UEFI 内存映射表交接给 memblock。此函数的关键过程按序分析如下: + +`efi_get_fdt_params()` 函数以 `dt_params` 全局变量匹配 fdt 中的 `chosen` 变量,保存内存映射表信息到 `struct efi_memory_map_data` 实例中,并返回 UEFI 系统表的物理地址。 + +`efi_memmap_init_early()` 函数重新以 `struct efi_memory_map` 结构保存内存映射表,其中 `map` 成员为映射表的虚拟地址,通过 `early_memremap()` 函数在 fixed-mapping 中创建页表映射,最终记录到 `efi.memap` 全局结构中。 + +```c +// include/linux/efi.h : 547 + +struct efi_memory_map_data { + phys_addr_t phys_map; + unsigned long size; + unsigned long desc_version; + unsigned long desc_size; + unsigned long flags; +}; + +struct efi_memory_map { + phys_addr_t phys_map; + void *map; + void *map_end; + int nr_map; + unsigned long desc_version; + unsigned long desc_size; + unsigned long flags; +}; +``` + +```c +// drivers/firmware/efi/fdtparams.c : 35 + +static __initconst const struct { + const char path[17]; + u8 paravirt; + const char params[PARAMCOUNT][26]; +} dt_params[] = { + + .path = "/chosen", + .params = { // <-----------26-----------> + [SYSTAB] = "linux,uefi-system-table", + [MMBASE] = "linux,uefi-mmap-start", + [MMSIZE] = "linux,uefi-mmap-size", + [DCSIZE] = "linux,uefi-mmap-desc-size", + [DCVERS] = "linux,uefi-mmap-desc-ver", + } +} + +// drivers/firmware/efi/efi-init.c :199 + +efi_init() + // Grab UEFI information placed in FDT by stub + efi_system_table = efi_get_fdt_params(&data); // struct efi_memory_map_data * data + return systab; + + efi_memmap_init_early(&data) + struct efi_memory_map map; + map.map = early_memremap(data->phys_map, data->size); // 内存映射表的虚拟地址 + set_bit(EFI_MEMMAP, &efi.flags); // we use EFI memory map + efi.memmap = map +``` + +`uefi_init()` 函数用于处理 UEFI 系统表,保存运行时服务到 `efi.runtime`;调用 `efi_config_parse_tables()` 函数以 `common_tables` 为参照,保存配置表到对应的变量中进行部分初步处理,比如: + +- `LINUX_EFI_INITRD_MEDIA_GUID` 表保存到 initrd 变量中,initrd 地址和大小分别保存到 `phys_initrd_start`、`phys_initrd_size` +- `EFI_RT_PROPERTIES_TABLE_GUID` 表代表 UEFI 运行时所支持的服务,通过 `rt_prop` 进一步更新到 `efi.runtime_supported_mask` +- `LINUX_EFI_MEMRESERVE_TABLE_GUID` 表代 UEFI 所保留的物理内存空间,调用 `memblock_reserve()` 接口将其更新到 `memblock.reserved` 中 + +而其他的一些变量,比如 `efi.acpi*` 则在 `setup_arch()` 的后续流程 `acpi_boot_table_init()` 中处理。 + +```c +efi_init() + // drivers/firmware/efi/efi-init.c : 78 + uefi_init(efi_system_table) + systab = early_memremap_ro(efi_system_table // remap systable + set_bit(EFI_BOOT, &efi.flags); + set_bit(EFI_64BIT, &efi.flags); + + efi.runtime = systab->runtime; + + config_tables = early_memremap_ro(efi_to_phys(systab->tables), table_size); // remap conftable + efi_config_parse_tables(config_tables, systab->nr_tables, efi_arch_tables); + match_config_table(guid, table, common_tables) // 解析 common_tables (ACPI/SMBIOS/ESRT/INITRD/MEMRESERVE) + set_bit(EFI_CONFIG_TABLES, &efi.flags); + + // 处理 efi_rng_seed mem_reserve rt_prop initrd ... + + // set the reserved memory in the memblock.reserved + memblock_reserve(prsv, struct_size(rsv, entry, rsv->size)); + +static const efi_config_table_type_t common_tables[] __initconst = { + {ACPI_20_TABLE_GUID, &efi.acpi20, "ACPI 2.0" }, + {ACPI_TABLE_GUID, &efi.acpi, "ACPI" }, + {SMBIOS_TABLE_GUID, &efi.smbios, "SMBIOS" }, + {SMBIOS3_TABLE_GUID, &efi.smbios3, "SMBIOS 3.0" }, + {EFI_SYSTEM_RESOURCE_TABLE_GUID, &efi.esrt, "ESRT" }, + {EFI_MEMORY_ATTRIBUTES_TABLE_GUID, &efi_mem_attr_table, "MEMATTR" }, + {LINUX_EFI_RANDOM_SEED_TABLE_GUID, &efi_rng_seed, "RNG" }, + // ... + {LINUX_EFI_MEMRESERVE_TABLE_GUID, &mem_reserve, "MEMRESERVE" }, + {LINUX_EFI_INITRD_MEDIA_GUID, &initrd, "INITRD" }, + {EFI_RT_PROPERTIES_TABLE_GUID, &rt_prop, "RTPROP" }, + // ... +} +``` + +`reserve_regions()` 函数首先清空从 dtb 中构建的 memblock,之后遍历 UEFI 内存描述表 (efi.memmap),对于在 [MIN_MEMBLOCK_ADDR,MAX_MEMBLOCK_ADDR] 范围内的内存执行 `memblock_add()` 添加到 `memblock.memory` 类型中,并对那些不可用的内存(比如:用于 Runtime Services 的内存、用于特殊目的的内存 `EFI_MEMORY_SP` 等等)调用 `memblock_mark_nomap()` 设置其内存区域(memblock region)标志位为 `MEMBLOCK_NOMAP`,此标志位表示此内存区域不用于内存映射。 + +`efi_init()` 继续执行从 UEFI 内存映射表到 memblock 的交接工作,篇幅有限,这里不一一列举: + +- `early_init_dt_check_for_usable_mem_range()` 函数解析 dtb 中的 `linux,usable-memory-range` 节点,并修饰 memblock,此节点描述用于内核 kdump 的内存范围 +- `efi_find_mirror()` 函数根据 UEFI 内存标志位 `EFI_MEMORY_MORE_RELIABLE` 处理高可靠内存,调用 `memblock_mark_mirror()` 设置 `MEMBLOCK_MIRROR` 标志位 +- `init_screen_info()` 函数处理 UEFI 屏幕信息 `struct screen_info` 的物理地址 `screen_info.lfb_base`,在 memblock 中设置为 `MEMBLOCK_NOMAP` + +```c +efi_init() + //drivers/firmware/efi/efi-init.c : 155 + + reserve_regions() + // discard memblock which originated from memory nodes in the DT + memblock_dump_all(); && memblock_remove(0, PHYS_ADDR_MAX); + + for_each_efi_memory_desc(md) + early_init_dt_add_memory_arch() + memblock_add(md->phys_addr, size); + !is_usable_memory(md) && memblock_mark_nomap() // nomap some ram + + early_init_dt_check_for_usable_mem_range() // 处理 linux,usable-memory-range + efi_find_mirror() // 处理高可靠内存 EFI_MEMORY_MORE_RELIABLE + efi_esrt_init() // Reserving ESRT space in memblock.reserved + efi_mokvar_table_init(); // 处理 EFI MOK config table + memblock_reserve(data.phys_map & PAGE_MASK, PAGE_ALIGN(data.size + (data.phys_map & ~PAGE_MASK))); // 设置 UEFI 内存映射表到 memblock.reserved + init_screen_info() // 处理 screen_info_table +``` + +## UEFI 运行时服务 + +### UEFI 运行时服务初始化 + +`riscv_enable_runtime_services()` 为 RISC-V 架构下 UEFI Runtime Services 初始化函数,主要执行如下流程: + +对于 UEFI 内存映射表的内存映射,存在两个版本:一个是调用 `efi_memmap_init_early()` 以 fixed-mapping 空间进行早期映射,另一个调用 `efi_memmap_init_late()` 在 vmalloc 空间进行后期映射。两个函数都调用 `__efi_memmap_init()` 函数,以传入的参数中是否有 `EFI_MEMMAP_LATE` 标志为条件分别调用 `early_memremap()`, `memremap()`。 + +在 `efi_init()` 阶段完成早期映射,考虑到 fixed-mapping 空间的稀缺性,在当前阶段调用 `efi_memmap_unmap()` 解除早期映射,并调用 `efi_memmap_init_late()` 对 UEFI 内存映射表进行后期映射。 + +`efi_virtmap_init` 对 `efi_mm` 进行初始化,首先为其分配页目录项,之后遍历 UEFI 内存映射表,对 `EFI_MEMORY_RUNTIME` 类型的内存描述符,执行 `efi_create_mapping(&efi_mm, md)` 创建 `md->virt_addr` 到 `md->phys_addr` 的页表映射(这里的虚拟地址 `md->virt_addr` 正是在 EFI Boot Stub 基于 `EFI_RT_VIRTUAL_OFFSET` 计算的);最后调用 `efi_memattr_apply_permissions()` 基于 UEFI 内存属性配置表 -- `efi_mem_attr_table` 对虚拟地址进行权限设置。如果设置了 `efi.debug` 命令行选项,可以看到这样的输出: + +``` +[ 0.115472] Remapping and enabling EFI services. +[ 0.122078] efi: memattr: Processing EFI Memory Attributes table: +[ 0.122844] efi: memattr: 0x0000ffe3d000-0x0000ffe8dfff [Runtime Code|RUN| | | | |XP| | | | | | | | ] +[ 0.124471] efi: memattr: 0x0000ffe8e000-0x0000ffe8ffff [Runtime Code|RUN| | | | | | | |RO| | | | | ] +[ 0.125622] efi: memattr: 0x0000ffe90000-0x0000ffe92fff [Runtime Code|RUN| | | | |XP| | | | | | | | ] +[ 0.126453] efi: memattr: 0x0000ffe93000-0x0000ffe95fff [Runtime Code|RUN| | | | | | | |RO| | | | | ] +... +``` + +`efi_native_runtime_setup()` 函数负责对 `efi` 变量中的 Runtime Services 函数进行设置,比如:设置 `efi.get_time = virt_efi_get_time`),而其他的模块(比如:rtc-efi -- `drivers/rtc/rtc-efi.c`)则可通过 `efi.get_time` 来获取固件提供的时间。 + +```c +// drivers/firmware/efi/riscv-runtime.c : 66 + +early_initcall(riscv_enable_runtime_services); + +riscv_enable_runtime_services() + + efi_memmap_unmap(); + early_memunmap(efi.memmap.map, size); // clear the early EFI memmap + efi.memmap.map = NULL; + clear_bit(EFI_MEMMAP, &efi.flags); + + // EFI map 有两个初始化 + // 早期初始化(efi_init/efi_memmap_init_early -> early_memremap)使用稀缺的 fixmap 空间 + // 后期初始化(efi_memmap_init_late -> memremap)使用 vmalloc 空间 + efi_memmap_init_late(efi.memmap.phys_map, mapsize) + + // Remapping and enabling EFI services + efi_virtmap_init() + + efi_mm.pgd = pgd_alloc(&efi_mm); + for_each_efi_memory_desc(md) + if (md->attribute & EFI_MEMORY_RUNTIME) efi_create_mapping(&efi_mm, md); + for (i = 0; i < md->num_pages; i++) + create_pgd_mapping(mm->pgd, md->virt_addr + i * PAGE_SIZE, md->phys_addr + i * PAGE_SIZE, PAGE_SIZE, prot); + + efi_memattr_apply_permissions(&efi_mm, efi_set_mapping_permissions) + tbl = memremap(efi_mem_attr_table, tbl_size, MEMREMAP_WB); // 映射内存属性表 + efi_set_mapping_permissions(mm, &md, has_bti); // print EFI memmap attr table + apply_to_page_range(mm, md->virt_addr, md->num_pages << EFI_PAGE_SHIFT, set_permissions, md); // 对 vm 设置权限,底层实现为设置 pte_val(pte) + + efi_native_runtime_setup() // efi.get_time = virt_efi_get_time // efi.reset_system = virt_efi_reset_system + set_bit(EFI_RUNTIME_SERVICES, &efi.flags); +``` + +### UEFI 运行时服务函数 + +我们以获取系统时间函数 -- `virt_efi_get_time()` 为例进行分析,此函数内部使用 `efi_queue_work` 宏,此宏对传入的参数保存到 `struct efi_runtime_work efi_rts_work` 全局变量中,同时保存当前运行时服务 ID 到 `efi_rts_work.efi_rts_id`,并以 `efi_call_rts` 函数初始化工作 `struct work_struct &efi_rts_work.work`,插入工作队列 `efi_rts_wq`,之后等待工作队列函数释放 `&efi_rts_work.efi_rts_comp` 完成变量。 + +`efi_call_rts` 函数根据保存的运行时服务 ID 调用对应的运行时服务,并释放完成变量。运行时服务的调用过程分为三个阶段: + +1. `arch_efi_call_virt_setup()` 以 `efi_mm.pgd` 设置内核根页目录项,并调用 `efi_virtmap_load` 切换当前进程的内存上下文为 `efi_mm` +2. `arch_efi_call_virt(efi.runtime, get_time, args)` 调用 UEFI 提供的运行时服务 `efi.runtime.get_time()` +3. `arch_efi_call_virt_teardown()` 调用 `efi_virtmap_unload()` 恢复进程的内存上下文 + +关键代码摘录如下: + +```c +// include/linux/efi.h : 1249 + +struct efi_runtime_work { + void *arg1; + void *arg2; + void *arg3; + void *arg4; + void *arg5; + efi_status_t status; + struct work_struct work; + enum efi_rts_ids efi_rts_id; + struct completion efi_rts_comp; +}; + +// drivers/firmware/efi/runtime-wrappers.c : 253 + +static efi_status_t virt_efi_get_time(efi_time_t *tm, efi_time_cap_t *tc) + status = efi_queue_work(EFI_GET_TIME, tm, tc, NULL, NULL, NULL); // + init_completion(&efi_rts_work.efi_rts_comp); + INIT_WORK(&efi_rts_work.work, efi_call_rts); + efi_rts_work.arg1 = _arg1; + //... + efi_rts_work.efi_rts_id = _rts; + if (queue_work(efi_rts_wq, &efi_rts_work.work)) + wait_for_completion(&efi_rts_work.efi_rts_comp); + +// drivers/firmware/efi/runtime-wrappers.c : 174 + +void efi_call_rts(struct work_struct *work) + + switch (efi_rts_work.efi_rts_id) { + case EFI_GET_TIME: + status = efi_call_virt(get_time, (efi_time_t *)arg1, (efi_time_cap_t *)arg2); + efi_call_virt_pointer(efi.runtime, f, args) + + arch_efi_call_virt_setup() + sync_kernel_mappings(efi_mm.pgd); + efi_virtmap_load(); // switch_mm + + arch_efi_call_virt(efi.runtime,f,args) + // call efi.runtime.get_time + arch_efi_call_virt_teardown() +``` + +## 小结 + +本文介绍了 RISC-V Linux 正式内核在启动阶段从 UEFI 内存映射表到 memblock 分配器的交接过程、UEFI 配置表的部分解析过程,以及 UEFI 运行时服务的初始化和调用过程,希望对你有帮助。 + +## 参考资料 + +- [memblock 内存分配器原理和代码分析][1] + +[1]: https://tinylab.org/riscv-memblock/ -- Gitee From ae97bd82f11d9026be1d0469f447845a516e11be Mon Sep 17 00:00:00 2001 From: Song Shuai Date: Wed, 26 Apr 2023 17:28:28 +0800 Subject: [PATCH 3/5] riscv-linux-uefi-boot-2.md: take the advices in pr 660 --- articles/20230421-riscv-linux-uefi-boot-2.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/articles/20230421-riscv-linux-uefi-boot-2.md b/articles/20230421-riscv-linux-uefi-boot-2.md index 357ffcf..ccb61d6 100644 --- a/articles/20230421-riscv-linux-uefi-boot-2.md +++ b/articles/20230421-riscv-linux-uefi-boot-2.md @@ -19,6 +19,10 @@ Linux EFI Boot Stub 以 `boothardid` 和修改了 `chosen` 变量的 fdt 跳转到 `_start` 启动正式内核。正式内核在 `setup_arch()` 阶段调用 `efi_init()` 进行 EFI 的初始化。整体来看,`efi_init()` 的主要工作有两个,一个是对 UEFI 系统表的处理,包括运行时服务的保存、配置表的解析和初步处理;还有一个是把从 UEFI Boot Stub 传递过来的 UEFI 内存映射表交接给 memblock。此函数的关键过程按序分析如下: +> `memblock` 是内核启动初期用于管理内存的机制,主要将可用、保留以及不可用的物理内存进行划分和管理,后续会移交管理权给伙伴系统。 +> +> Linux 维护一个 `struct memblock memblock` 实体,其中 `memblock.memory` 描述了 `memblock` 管理的可用内存,`memblock.reserved` 描述了 `memblock` 管理的预留内存 + `efi_get_fdt_params()` 函数以 `dt_params` 全局变量匹配 fdt 中的 `chosen` 变量,保存内存映射表信息到 `struct efi_memory_map_data` 实例中,并返回 UEFI 系统表的物理地址。 `efi_memmap_init_early()` 函数重新以 `struct efi_memory_map` 结构保存内存映射表,其中 `map` 成员为映射表的虚拟地址,通过 `early_memremap()` 函数在 fixed-mapping 中创建页表映射,最终记录到 `efi.memap` 全局结构中。 @@ -161,7 +165,7 @@ efi_init() 在 `efi_init()` 阶段完成早期映射,考虑到 fixed-mapping 空间的稀缺性,在当前阶段调用 `efi_memmap_unmap()` 解除早期映射,并调用 `efi_memmap_init_late()` 对 UEFI 内存映射表进行后期映射。 -`efi_virtmap_init` 对 `efi_mm` 进行初始化,首先为其分配页目录项,之后遍历 UEFI 内存映射表,对 `EFI_MEMORY_RUNTIME` 类型的内存描述符,执行 `efi_create_mapping(&efi_mm, md)` 创建 `md->virt_addr` 到 `md->phys_addr` 的页表映射(这里的虚拟地址 `md->virt_addr` 正是在 EFI Boot Stub 基于 `EFI_RT_VIRTUAL_OFFSET` 计算的);最后调用 `efi_memattr_apply_permissions()` 基于 UEFI 内存属性配置表 -- `efi_mem_attr_table` 对虚拟地址进行权限设置。如果设置了 `efi.debug` 命令行选项,可以看到这样的输出: +`efi_virtmap_init` 对 `efi_mm` 进行初始化,首先为其分配页目录项,之后遍历 UEFI 内存映射表,对 `EFI_MEMORY_RUNTIME` 类型的内存描述符,执行 `efi_create_mapping(&efi_mm, md)` 创建 `md->virt_addr` 到 `md->phys_addr` 的页表映射(这里的虚拟地址 `md->virt_addr` 正是在 EFI Boot Stub 基于 `EFI_RT_VIRTUAL_OFFSET` 计算的);最后调用 `efi_memattr_apply_permissions()` 基于 UEFI 内存属性配置表 -- `efi_mem_attr_table` 对虚拟地址进行权限设置。如果设置了 `efi=debug` 命令行选项,可以看到这样的输出: ``` [ 0.115472] Remapping and enabling EFI services. -- Gitee From 2cf7570382749c567f8b5621b74ce3bd266386f4 Mon Sep 17 00:00:00 2001 From: Song Shuai Date: Thu, 27 Apr 2023 10:51:09 +0800 Subject: [PATCH 4/5] riscv-linux-uefi-boot-1.md: take the advices in pr 660 --- articles/20230417-riscv-linux-uefi-boot-1.md | 24 ++++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/articles/20230417-riscv-linux-uefi-boot-1.md b/articles/20230417-riscv-linux-uefi-boot-1.md index 9c74d4f..f5e37cb 100644 --- a/articles/20230417-riscv-linux-uefi-boot-1.md +++ b/articles/20230417-riscv-linux-uefi-boot-1.md @@ -27,15 +27,15 @@ EDK2 作为 UEFI 标准的开源实现,主要包括以下三个代码仓库: - [edk2-platforms][6]:edk2 的平台支持分支 - [edk2-non-osi][7]: 不兼容 edk2 和 edk2-platform license 的分支 -在构建 RISC-V edk2 实验环境过程中,主要用到前两个仓库:可通过第一个仓库构建 Qemu virt 的 edk2 镜像 ([参考][2]),也可结合第二仓库构建 Qemu sifive_u (HiFiveUnleashedBoard) 的 edk2 镜像 ([参考][3]),这里以 Qemu virt 为例,列出几个关键步骤: +在构建 RISC-V edk2 实验环境过程中,主要用到前两个仓库:可通过第一个仓库构建 QEMU virt 的 edk2 镜像 ([参考][2]),也可结合第二仓库构建 QEMU sifive_u (HiFiveUnleashedBoard) 的 edk2 镜像 ([参考][3]),这里以 QEMU virt 为例,列出几个关键步骤: ```sh -## ... 构建 Qemu virt edk2 镜像 +## ... 构建 QEMU virt edk2 镜像 build -a RISCV64 --buildtarget RELEASE -p OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc -t GCC5 ## 构建 Linux 、rootfs 、efi.img -## 通过 pflash1 指定 edk2 镜像,启动 Qemu +## 通过 pflash1 指定 edk2 镜像,启动 QEMU qemu-system-riscv64 -nographic \ -drive file=Build/RiscVVirtQemu/RELEASE_GCC5/FV/RISCV_VIRT.fd,if=pflash,format=raw,unit=1 \ -machine virt -m 2G \ @@ -48,7 +48,7 @@ Shell> fs0:\Image root=/dev/vda console=ttyS0 rootwait earlycon=uart8250,mmio,0x ## RISC-V EDK2 启动流程简介 -RISC-V 架构的 edk2 移植的基本思路是基于 edk2 项目现有的启动流程以及构建环境,将 OpenSbi 编译为库并链接到 SEC 模块以充分利用 OpenSbi 进行平台的初始化。这里基于 UEFI 启动的七个启动阶段对 RISC-V 的实现做简单介绍(详见 edk2-platform 的 `Platform/RISC-V/PlatformPkg/Readme.md`)。 +RISC-V 架构的 edk2 移植的基本思路是基于 edk2 项目现有的启动流程以及构建环境,将 OpenSBI 编译为库并链接到 SEC 模块以充分利用 OpenSBI 进行平台的初始化。这里基于 UEFI 启动的七个启动阶段对 RISC-V 的实现做简单介绍(详见 edk2-platform 的 `Platform/RISC-V/PlatformPkg/Readme.md`)。 ![riscv-edk2-boot.png](images/riscv_uefi/riscv-edk2-boot.png) @@ -56,15 +56,15 @@ RISC-V 架构的 edk2 移植的基本思路是基于 edk2 项目现有的启动 处理系统上电或重启,执行 ResetVector 代码;创建临时内存;提供安全信任链的根;传送系统参数到下一阶段。 - RISC-V: SEC 阶段调用 sbi_init 执行 OpenSbi 的初始化,之后以 NextAddr 和 NextMode 跳转到 PEI 阶段。其中 SEC 以及 Sbi 运行在 M-mode,而之后的阶段(PEI/DXE/BDS)则运行在 NextMode 指定的 S-mode (OEM 可通过相关的 PCD 设置(PcdPeiCorePrivilegeMode 或者 PcdDxeCorePrivilegeMode 指定后续阶段运行在其他模式) + RISC-V: SEC 阶段调用 `sbi_init` 执行 OpenSBI 的初始化,之后以 NextAddr 和 NextMode 跳转到 PEI 阶段。其中 SEC 以及 OpenSBI 运行在 M-mode,而之后的阶段(PEI/DXE/BDS)则运行在 NextMode 指定的 S-mode (OEM 可通过相关的 PCD 设置 `PcdPeiCorePrivilegeMode` 或者 `PcdDxeCorePrivilegeMode` 指定 PEI/DXE 阶段运行在其他模式) - PEI 阶段 此阶段依次执行 PEIM (PEI Module) 进行平台的初始化,将需要传递给 DXE 的信息组成 HOB(Handoff Block) 表,最终将控制权转交给 DXE。 - RISC-V: PEI 默认运行在 S-mode,如果需要运行 SEC 阶段的 PEI protocol interface (PPI) 代码,则要在该阶段早期安装 PPI 并通过 PlatformSecPpiLib 库来避免模式保护限制。 + RISC-V: PEI 运行在 `PcdPeiCorePrivilegeMode` 默认指定的 S-mode,如果需要运行 SEC 阶段的 PEI protocol interface (PPI) 代码,则要在该阶段早期安装 PPI 并通过 PlatformSecPpiLib 库来避免模式保护限制。 - PEI 通过 RiscVFirmwareContextLib 库访问 OpenSbi 固件上下文 -- EFI_RISCV_OPENSBI_FIRMWARE_CONTEXT。 + PEI 通过 RiscVFirmwareContextLib 库访问 OpenSBI 固件上下文 -- EFI_RISCV_OPENSBI_FIRMWARE_CONTEXT。 ```c typedef struct { @@ -82,7 +82,7 @@ RISC-V 架构的 edk2 移植的基本思路是基于 edk2 项目现有的启动 该阶段执行系统初始化工作,为后续 UEFI Application 和操作系统提供 UEFI 系统表、启动服务和运行时服务。 - RISC-V: DXE 默认运行在 S-mode,DXE 驱动可通过 DXE OpenSBI protocol 调用 SBI 服务。 + RISC-V: DXE 运行在 `PcdDxeCorePrivilegeMode` 默认指定的 S-mode,DXE 驱动可通过 DXE OpenSBI protocol 调用 OpenSBI 服务。 - BDS 阶段 @@ -186,7 +186,7 @@ pe_head_start: // ... ``` -`riscv_image_header.rev3` 为最后的成员,存储 PE 头与 _start 的偏移,并在其后追加 PE 头 `__EFI_PE_HEADER`。`__EFI_PE_HEADER` 定义在 `arch/riscv/kernel/efi-header.S` 文件中,按照 PE 镜像相关结构进行布局,这里摘录几个关键的点进行介绍: +`riscv_image_header.res3` 为最后的成员,存储 PE 头与 _start 的偏移,并在其后追加 PE 头 `__EFI_PE_HEADER`。`__EFI_PE_HEADER` 定义在 `arch/riscv/kernel/efi-header.S` 文件中,按照 PE 镜像相关结构进行布局,这里摘录几个关键的点进行介绍: - `coff_header.Machine` 定义为 `IMAGE_FILE_MACHINE_RISCV64` 或者 `IMAGE_FILE_MACHINE_RISCV32`,此值与前面介绍的 UEFI 镜像中的 "Machine" 字段相对应,在 edk2 中定义为 `EFI_IMAGE_MACHINE_RISCV64` 和 `EFI_IMAGE_MACHINE_RISCV32` @@ -305,7 +305,7 @@ efi_status_t __efiapi efi_pe_entry(efi_handle_t handle, efi_system_table_t *syst - `efi_load_initrd()` 加载 initrd - initrd 一般有两个来源,固件提供(比如:qemu 命令行指定、或者通过 UEFI Shell 的 initrd 命令指定)以及 Linux 命令行指定。第一种情况下,执行 `efi_load_initrd_dev_path()` 访问 `LINUX_EFI_INITRD_MEDIA_GUID` 配置表来获取;第二种情况下,执行 `efi_load_initrd_cmdline()` 调用 `efi_open_file` 来获取。之后,在 `EFI_LOADER_DATA` 中为其分配内存空间,并将 initrd 以 `LINUX_EFI_INITRD_MEDIA_GUID` 安装到配置表中。 + initrd 一般有两个来源,固件提供(比如:QEMU 命令行指定、或者通过 UEFI Shell 的 initrd 命令指定)以及 Linux 命令行指定。第一种情况下,执行 `efi_load_initrd_dev_path()` 访问 `LINUX_EFI_INITRD_MEDIA_GUID` 配置表来获取;第二种情况下,执行 `efi_load_initrd_cmdline()` 调用 `efi_open_file` 来获取。之后,在 `EFI_LOADER_DATA` 中为其分配内存空间,并将 initrd 以 `LINUX_EFI_INITRD_MEDIA_GUID` 安装到配置表中。 - `efi_random_get_seed()` 通过 `EFI_RNG_PROTOCOL_GUID` 获取随机源,并将其以 `LINUX_EFI_RANDOM_SEED_TABLE_GUID` 安装到配置表中 @@ -339,7 +339,7 @@ efi_stub_common(handle, image, image_addr, cmdline_ptr); `allocate_new_fdt_and_exit_boot()` 函数最终会调用 `BS.ExitBootServices()` 接口结束所有的 UEFI Boot Services,但在这个过程中有两个额外的任务需要处理: -第一个是与 dtb 相关的处理:dtb 与 initrd 类似有两个来源,一个是固件提供(比如:Qemu 提供给 edk2 的 dtb),还有一个是通过 Linux 命令行提供的。前者从配置表 `DEVICE_TREE_GUID` 中获取,后者通过 `efi_load_dtb()` 走 UEFI 文件接口来获取。之后为 dtb 分配内存,并执行 `update_fdt()` 函数在 dtb 的 chosen 节点中创建如下几个 chosen 变量,配合后续的 `update_fdt_memmap()` 函数对其进行设置。这几个变量会在 EFI Boot Stub 跳转到正式内核后以 dtb 的形式提供,而正式内核则解析这些变量继而执行相应的初始化。 +第一个是与 dtb 相关的处理:dtb 与 initrd 类似有两个来源,一个是固件提供(比如:QEMU 提供给 edk2 的 dtb),还有一个是通过 Linux 命令行提供的。前者从配置表 `DEVICE_TREE_GUID` 中获取,后者通过 `efi_load_dtb()` 走 UEFI 文件接口来获取。之后为 dtb 分配内存,并执行 `update_fdt()` 函数在 dtb 的 chosen 节点中创建如下几个 chosen 变量,配合后续的 `update_fdt_memmap()` 函数对其进行设置。这几个变量会在 EFI Boot Stub 跳转到正式内核后以 dtb 的形式提供,而正式内核则解析这些变量继而执行相应的初始化。 - `bootargs` @@ -368,7 +368,7 @@ typedef struct { typedef EFI_STATUS -(EFIAPI \*EFI_GET_MEMORY_MAP) ( +(EFIAPI *EFI_GET_MEMORY_MAP) ( IN OUT UINTN *MemoryMapSize, // 整个内存映射表的大小 OUT EFI_MEMORY_DESCRIPTOR *MemoryMap, // 内存映射表 OUT UINTN *MapKey, // 固件返回的内存映射 key 值 -- Gitee From 68a0877bbe3c754f269c37962b6c6bb6f2d82c89 Mon Sep 17 00:00:00 2001 From: Song Shuai Date: Fri, 28 Apr 2023 11:49:08 +0800 Subject: [PATCH 5/5] riscv-linux-uefi-boot--md: take the advices from falcon in pr 660 Signed-off-by: Song Shuai --- articles/20230417-riscv-linux-uefi-boot-1.md | 52 +++++++++++++++++--- articles/20230421-riscv-linux-uefi-boot-2.md | 4 +- 2 files changed, 47 insertions(+), 9 deletions(-) diff --git a/articles/20230417-riscv-linux-uefi-boot-1.md b/articles/20230417-riscv-linux-uefi-boot-1.md index f5e37cb..4ad910d 100644 --- a/articles/20230417-riscv-linux-uefi-boot-1.md +++ b/articles/20230417-riscv-linux-uefi-boot-1.md @@ -1,4 +1,4 @@ -> Corrector: [TinyCorrect](https://gitee.com/tinylab/tinycorrect) v0.1 - [spaces pangu]
+> Corrector: [TinyCorrect](https://gitee.com/tinylab/tinycorrect) v0.1 - [spaces toc]
> Author: sugarfillet
> Date: 2023/04/17
> Revisor: Falcon falcon@tinylab.org
@@ -6,7 +6,7 @@ > Proposal: [RISC-V UEFI 启动流程分析与 EDK2 移植](https://gitee.com/tinylab/riscv-linux/issues/I64FSG)
> Sponsor: PLCT Lab, ISCAS -# RISC-V Linux UEFI boot process 1 +# RISC-V Linux 内核 UEFI 启动过程分析(Part1)—— 构建、加载与启动内核 ## 前言 @@ -29,20 +29,58 @@ EDK2 作为 UEFI 标准的开源实现,主要包括以下三个代码仓库: 在构建 RISC-V edk2 实验环境过程中,主要用到前两个仓库:可通过第一个仓库构建 QEMU virt 的 edk2 镜像 ([参考][2]),也可结合第二仓库构建 QEMU sifive_u (HiFiveUnleashedBoard) 的 edk2 镜像 ([参考][3]),这里以 QEMU virt 为例,列出几个关键步骤: +### 编译 QEMU virt edk2 + +执行如下命令构建 RISC-V QEMU virt 的 edk2 镜像,最终生成 `Build/RiscVVirtQemu/RELEASE_GCC5/FV/RISCV_VIRT.fd` 文件。 + +> 注意:需要对 edk2 镜像文件的大小进行调整以解决后续 QEMU 启动过程中有关 pflash 的报错 + ```sh -## ... 构建 QEMU virt edk2 镜像 +git clone --recurse-submodule git@github.com:tianocore/edk2.git + +export WORKSPACE=`pwd` +export GCC5_RISCV64_PREFIX=/usr/bin/riscv64-linux-gnu- +export PACKAGES_PATH=$WORKSPACE/edk2 +export EDK_TOOLS_PATH=$WORKSPACE/edk2/BaseTools +source edk2/edksetup.sh +make -C edk2/BaseTools clean +make -C edk2/BaseTools +make -C edk2/BaseTools/Source/C +source edk2/edksetup.sh BaseTools build -a RISCV64 --buildtarget RELEASE -p OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc -t GCC5 -## 构建 Linux 、rootfs 、efi.img +truncate -s 32M Build/RiscVVirtQemu/RELEASE_GCC5/FV/RISCV_VIRT.fd +``` + +### 制作 efi.img + +提前编译好 RISC-V Linux 内核镜像文件 `arch/riscv/boot/Image`,并使用如下命令保存内核镜像到 `efi.img` 中。 -## 通过 pflash1 指定 edk2 镜像,启动 QEMU +```sh +fallocate -l 512M efi.img +sgdisk -n 1:34: -t 1:EF00 efi.img +sudo losetup -fP efi.img +loopdev=`losetup -j efi.img | awk -F: '{print $1}'` +efi_part="$loopdev"p1 +sudo mkfs.msdos $efi_part +mkdir -p /tmp/mnt +sudo mount $efi_part /tmp/mnt/ +sudo cp linux/arch/riscv/boot/Image /tmp/mnt/ +sudo umount /tmp/mnt +sudo losetup -D $loopdev +``` + +### 启动 QEMU + +提前编译好 RISC-V rootfs 镜像文件,比如:`buildroot/output/images/rootfs.ext2`,执行如下命令启动 Qemu。之后在 EFI Shell 执行内核镜像。 + +```sh qemu-system-riscv64 -nographic \ -drive file=Build/RiscVVirtQemu/RELEASE_GCC5/FV/RISCV_VIRT.fd,if=pflash,format=raw,unit=1 \ -machine virt -m 2G \ -drive file=buildroot/output/images/rootfs.ext2,format=raw,id=hd0 -device virtio-blk-device,drive=hd0 \ -drive file=efi.img,format=raw,id=hd1 -device virtio-blk-device,drive=hd1 -## 进入 EFI Shell 执行 linux Shell> fs0:\Image root=/dev/vda console=ttyS0 rootwait earlycon=uart8250,mmio,0x10000000 ``` @@ -471,7 +509,7 @@ efi_enter_kernel(unsigned long entrypoint, unsigned long fdt, unsigned long fdt_ ## 小结 -Linux EFI Boot Stub 作为一种 UEFI OS Loader 在 UEFI 的 TSL 阶段调用 Boot Services 接口为正式内核准备 系统表、UEFI 内存映射表、命令行参数,并在退出 Boot Services 后,又为 Runtime Services 设置虚拟地址,最终跳转到正式内核。那么正式内核又将如何处理 EFI Boot Stub 传递的数据呢?且看下文分解。 +Linux EFI Boot Stub 作为一种 UEFI OS Loader 在 UEFI 的 TSL 阶段调用 Boot Services 接口为正式内核准备系统表、UEFI 内存映射表、命令行参数,并在退出 Boot Services 后,又为 Runtime Services 设置虚拟地址,最终跳转到正式内核。那么正式内核又将如何处理 EFI Boot Stub 传递的数据呢?且看下文分解。 ## 参考资料 diff --git a/articles/20230421-riscv-linux-uefi-boot-2.md b/articles/20230421-riscv-linux-uefi-boot-2.md index ccb61d6..d0787e9 100644 --- a/articles/20230421-riscv-linux-uefi-boot-2.md +++ b/articles/20230421-riscv-linux-uefi-boot-2.md @@ -6,7 +6,7 @@ > Proposal: [RISC-V UEFI 启动流程分析与 EDK2 移植](https://gitee.com/tinylab/riscv-linux/issues/I64FSG)
> Sponsor: PLCT Lab, ISCAS -# RISC-V Linux UEFI boot process 2 +# RISC-V Linux 内核 UEFI 启动过程分析(Part2):内核侧 UEFI 支持 ## 前言 @@ -273,7 +273,7 @@ void efi_call_rts(struct work_struct *work) ## 小结 -本文介绍了 RISC-V Linux 正式内核在启动阶段从 UEFI 内存映射表到 memblock 分配器的交接过程、UEFI 配置表的部分解析过程,以及 UEFI 运行时服务的初始化和调用过程,希望对你有帮助。 +本文介绍了 RISC-V Linux 内核在加载并启动后的 UEFI 初始化流程,包括从 UEFI 内存映射表到 memblock 分配器的交接过程、UEFI 配置表的部分解析过程,以及 UEFI 运行时服务的初始化和调用过程,希望对你有帮助。 ## 参考资料 -- Gitee