1 .. SPDX-License-Identifier: GPL-2.0 2 .. include:: ../../disclaimer-zh_CN.rst 3 4 :Original: Documentation/arch/riscv/boot.rst 5 6 :翻译: 7 8 龙进 Jin Long <longjin@dragonos.org> 9 10 ======================== 11 RISC-V内核启动要求和限制 12 ======================== 13 14 :Author: Alexandre Ghiti <alexghiti@rivosinc.co 15 :Date: 23 May 2023 16 17 这份文档描述了RISC-V内核对引导加 18 早期启动过程时必须牢记的约束。 19 终虚拟映射设置之前运行的任何代 20 21 内核预加载的要求和限制 22 ====================== 23 24 RISC-V内核对引导加载程序和平台固 25 26 寄存器状态 27 ---------- 28 29 RISC-V内核期望: 30 31 * ``$a0`` 应包含当前核心的hartid。 32 * ``$a1`` 应包含内存中设备树的地 33 34 CSR 寄存器状态 35 -------------- 36 37 RISC-V内核期望: 38 39 * ``$satp = 0``: 如果存在MMU,必须 40 41 为常驻固件保留的内存 42 -------------------- 43 44 RISC-V内核在直接映射中不能映射任 45 因此固件必须根据设备树规范 和/ 46 47 内核的位置 48 ---------- 49 50 RISC-V内核期望被放置在PMD边界(对 51 请注意,如果不是这样,EFI stub 将 52 53 硬件描述 54 -------- 55 56 固件可以将设备树或ACPI表传递给RIS 57 58 设备树可以直接从前一阶段通过$a1 59 可以通过EFI配置表传递。 60 61 ACPI表通过EFI配置表传递给内核。在 62 小的设备树。请参阅下面的"EFI stub 63 信息。 64 65 内核入口 66 -------- 67 68 在SMP系统中,有两种方法可以进入 69 70 - ``RISCV_BOOT_SPINWAIT``:固件在内核中 71 得抽奖并执行早期启动代码,而 72 方法主要用于支持没有SBI HSM扩展 73 - ``有序启动``:固件只释放一个将 74 扩展启动所有其他的hart。有序启 75 因为它可以支持CPU热插拔和kexec。 76 77 UEFI 78 ---- 79 80 UEFI 内存映射 81 ~~~~~~~~~~~~~ 82 83 使用UEFI启动时,RISC-V内核将只使用 84 85 UEFI固件必须解析 ``/reserved-memory`` 86 树规范,将这些子节点的属性( ``n 87 确的EFI等价物(参见设备树规范v0.4 88 UEFI"部分)。 89 90 RISCV_EFI_BOOT_PROTOCOL 91 ~~~~~~~~~~~~~~~~~~~~~~~ 92 93 使用UEFI启动时,EFI stub 需要引导har 94 RISC-V内核。EFI stub使用以下方法之 95 96 - ``RISCV_EFI_BOOT_PROTOCOL`` (**首选**) 97 - ``boot-hartid`` 设备树子节点(**已 98 99 任何新的固件都必须实现 ``RISCV_EFI_ 100 的方法现已被弃用。 101 102 早期启动的要求和约束 103 ==================== 104 105 RISC-V内核的早期启动过程遵循以下 106 107 EFI stub 和设备树 108 ----------------- 109 110 使用UEFI启动时,EFI stub 会用与arm64 111 这些参数在Documentation/arch/arm/uefi.rst 112 "UEFI kernel supporton ARM"段落中有描述 113 114 虚拟映射安装 115 ------------ 116 117 在RISC-V内核中,虚拟映射的安装分 118 119 1. ``setup_vm()`` 在 ``early_pg_dir`` 中安 120 允许发现系统内存。 此时只有 121 不能进行分配(因为系统内存还 122 态分配的(每个级别只使用一个 123 124 2. ``setup_vm_final()`` 在 ``swapper_pg_dir`` 125 射,并利用发现的系统内存 创 126 分配内存,但不能直接访问它( 127 区域的临时映射来访问新分配的 128 129 为了让 ``virt_to_phys()`` 和 ``phys_to_vir 130 映射地址转换为物理地址,它们需 131 就在步骤2安装直接映射之前(参见 132 ``setup_bootmem()`` 函数)。在安装最 133 仔细检查。 134 135 通过fixmap进行设备树映射 136 ------------------------ 137 138 由于 ``reserved_mem`` 数组是用 ``setup_v 139 的,并且与``setup_vm_final()``建立的 140 fixmap区域来映射设备树。这确保设 141 142 Pre-MMU执行 143 ----------- 144 145 在建立第一个虚拟映射之前,需要 146 早期替代方案的修补,以及内核命 147 148 - ``-fno-pie``:这对于使用``-fPIE``的 149 全局符号的访问都将通过 GOT进行 150 - ``-mcmodel=medany``:任何对全局符号 151 置MMU之前发生任何重定位。 152 - *所有* 的仪表化功能也必须被禁 153 154 由于使用来自不同编译单元的符号 155 外部符号。
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.