|sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextEnglish}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget/arch/riscv/bootmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget#/translations/zh_TW/arch/riscv/bootmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget#/translations/it_IT/arch/riscv/bootmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget#/translations/ja_JP/arch/riscv/bootmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget#/translations/ko_KR/arch/riscv/bootmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hPortuguese (Brazilian)}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget#/translations/pt_BR/arch/riscv/bootmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget#/translations/sp_SP/arch/riscv/bootmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageChinese (Simplified)uh1h hh _documenthsourceNlineNubhcomment)}(h SPDX-License-Identifier: GPL-2.0h]h SPDX-License-Identifier: GPL-2.0}hhsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1hhhhhhP/var/lib/git/docbuild/linux/Documentation/translations/zh_CN/arch/riscv/boot.rsthKubhnote)}(hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。h]h paragraph)}(hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。h]hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hh5Documentation/translations/zh_CN/disclaimer-zh_CN.rsthKhhubah}(h]h ]h"]h$]h&]uh1hhhhhhhhNubh field_list)}(hhh](hfield)}(hhh](h field_name)}(hOriginalh]hOriginal}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhKubh field_body)}(h"Documentation/arch/riscv/boot.rst h]h)}(h!Documentation/arch/riscv/boot.rsth]h!Documentation/arch/riscv/boot.rst}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1hhhubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(h翻译h]h翻译}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhKubj)}(h'龙进 Jin Long h]h)}(h&龙进 Jin Long h](h龙进 Jin Long <}(hj4hhhNhNubh reference)}(hlongjin@dragonos.orgh]hlongjin@dragonos.org}(hj>hhhNhNubah}(h]h ]h"]h$]h&]refurimailto:longjin@dragonos.orguh1j<hj4ubh>}(hj4hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj0ubah}(h]h ]h"]h$]h&]uh1hhjubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubeh}(h]h ]h"]h$]h&]uh1hhhhhhhhKubhsection)}(hhh](htitle)}(h!RISC-V内核启动要求和限制h]h!RISC-V内核启动要求和限制}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1johjlhhhhhK ubh)}(hhh](h)}(hhh](h)}(hAuthorh]hAuthor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhKubj)}(h(Alexandre Ghiti h]h)}(hjh](hAlexandre Ghiti <}(hjhhhNhNubj=)}(halexghiti@rivosinc.comh]halexghiti@rivosinc.com}(hjhhhNhNubah}(h]h ]h"]h$]h&]refurimailto:alexghiti@rivosinc.comuh1j<hjubh>}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1hhjubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hhh](h)}(hDateh]hDate}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhKubj)}(h 23 May 2023 h]h)}(h 23 May 2023h]h 23 May 2023}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1hhjubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h]h ]h"]h$]h&]uh1hhjlhhhhhKubh)}(hX这份文档描述了RISC-V内核对引导加载程序和固件的期望,以及任何开发者在接触 早期启动过程时必须牢记的约束。在这份文档中, ``早期启动过程`` 指的是在最 终虚拟映射设置之前运行的任何代码。h](h这份文档描述了RISC-V内核对引导加载程序和固件的期望,以及任何开发者在接触 早期启动过程时必须牢记的约束。在这份文档中, }(hjhhhNhNubhliteral)}(h``早期启动过程``h]h早期启动过程}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhD 指的是在最 终虚拟映射设置之前运行的任何代码。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjlhhubjk)}(hhh](jp)}(h!内核预加载的要求和限制h]h!内核预加载的要求和限制}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1johjhhhhhKubh)}(hBRISC-V内核对引导加载程序和平台固件有以下要求:h]hBRISC-V内核对引导加载程序和平台固件有以下要求:}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubjk)}(hhh](jp)}(h寄存器状态h]h寄存器状态}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1johj:hhhhhKubh)}(hRISC-V内核期望:h]hRISC-V内核期望:}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj:hhubh block_quote)}(h^* ``$a0`` 应包含当前核心的hartid。 * ``$a1`` 应包含内存中设备树的地址。 h]h bullet_list)}(hhh](h list_item)}(h)``$a0`` 应包含当前核心的hartid。h]h)}(hjhh](j)}(h``$a0``h]h$a0}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjubh" 应包含当前核心的hartid。}(hjjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjfubah}(h]h ]h"]h$]h&]uh1jdhjaubje)}(h0``$a1`` 应包含内存中设备树的地址。 h]h)}(h/``$a1`` 应包含内存中设备树的地址。h](j)}(h``$a1``h]h$a1}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh( 应包含内存中设备树的地址。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK hjubah}(h]h ]h"]h$]h&]uh1jdhjaubeh}(h]h ]h"]h$]h&]bullet*uh1j_hhhKhj[ubah}(h]h ]h"]h$]h&]uh1jYhhhKhj:hhubeh}(h]id2ah ]h"]寄存器状态ah$]h&]uh1jjhjhhhhhKubjk)}(hhh](jp)}(hCSR 寄存器状态h]hCSR 寄存器状态}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1johjhhhhhK#ubh)}(hRISC-V内核期望:h]hRISC-V内核期望:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK%hjhhubjZ)}(h;* ``$satp = 0``: 如果存在MMU,必须将其禁用。 h]j`)}(hhh]je)}(h9``$satp = 0``: 如果存在MMU,必须将其禁用。 h]h)}(h8``$satp = 0``: 如果存在MMU,必须将其禁用。h](j)}(h ``$satp = 0``h]h $satp = 0}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh+: 如果存在MMU,必须将其禁用。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK'hjubah}(h]h ]h"]h$]h&]uh1jdhjubah}(h]h ]h"]h$]h&]jjuh1j_hhhK'hjubah}(h]h ]h"]h$]h&]uh1jYhhhK'hjhhubeh}(h]csrah ]h"]csr 寄存器状态ah$]h&]uh1jjhjhhhhhK#ubjk)}(hhh](jp)}(h为常驻固件保留的内存h]h为常驻固件保留的内存}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1johj'hhhhhK*ubh)}(hRISC-V内核在直接映射中不能映射任何常驻内存或用PMPs保护的内存, 因此固件必须根据设备树规范 和/或 UEFI规范正确标记这些区域。h]hRISC-V内核在直接映射中不能映射任何常驻内存或用PMPs保护的内存, 因此固件必须根据设备树规范 和/或 UEFI规范正确标记这些区域。}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK,hj'hhubeh}(h]id3ah ]h"]为常驻固件保留的内存ah$]h&]uh1jjhjhhhhhK*ubjk)}(hhh](jp)}(h内核的位置h]h内核的位置}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1johjNhhhhhK0ubh)}(hRISC-V内核期望被放置在PMD边界(对于rv64为2MB对齐,对于rv32为4MB对齐)。 请注意,如果不是这样,EFI stub 将重定位内核。h]hRISC-V内核期望被放置在PMD边界(对于rv64为2MB对齐,对于rv32为4MB对齐)。 请注意,如果不是这样,EFI stub 将重定位内核。}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK2hjNhhubeh}(h]id4ah ]h"]内核的位置ah$]h&]uh1jjhjhhhhhK0ubjk)}(hhh](jp)}(h 硬件描述h]h 硬件描述}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1johjuhhhhhK6ubh)}(h:固件可以将设备树或ACPI表传递给RISC-V内核。h]h:固件可以将设备树或ACPI表传递给RISC-V内核。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK8hjuhhubh)}(h设备树可以直接从前一阶段通过$a1寄存器传递给内核,或者在使用UEFI启动时, 可以通过EFI配置表传递。h]h设备树可以直接从前一阶段通过$a1寄存器传递给内核,或者在使用UEFI启动时, 可以通过EFI配置表传递。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK:hjuhhubh)}(hACPI表通过EFI配置表传递给内核。在这种情况下,EFI stub 仍然会创建一个 小的设备树。请参阅下面的"EFI stub 和设备树"部分,了解这个设备树的详细 信息。h]hACPI表通过EFI配置表传递给内核。在这种情况下,EFI stub 仍然会创建一个 小的设备树。请参阅下面的”EFI stub 和设备树”部分,了解这个设备树的详细 信息。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK=hjuhhubeh}(h]id5ah ]h"] 硬件描述ah$]h&]uh1jjhjhhhhhK6ubjk)}(hhh](jp)}(h 内核入口h]h 内核入口}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1johjhhhhhKBubh)}(h6在SMP系统中,有两种方法可以进入内核:h]h6在SMP系统中,有两种方法可以进入内核:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKDhjhhubj`)}(hhh](je)}(hX``RISCV_BOOT_SPINWAIT``:固件在内核中释放所有的hart,一个hart赢 得抽奖并执行早期启动代码,而其他的hart则停在那里等待初始化完成。这种 方法主要用于支持没有SBI HSM扩展和M模式RISC-V内核的旧固件。h]h)}(hX``RISCV_BOOT_SPINWAIT``:固件在内核中释放所有的hart,一个hart赢 得抽奖并执行早期启动代码,而其他的hart则停在那里等待初始化完成。这种 方法主要用于支持没有SBI HSM扩展和M模式RISC-V内核的旧固件。h](j)}(h``RISCV_BOOT_SPINWAIT``h]hRISCV_BOOT_SPINWAIT}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh:固件在内核中释放所有的hart,一个hart赢 得抽奖并执行早期启动代码,而其他的hart则停在那里等待初始化完成。这种 方法主要用于支持没有SBI HSM扩展和M模式RISC-V内核的旧固件。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKFhjubah}(h]h ]h"]h$]h&]uh1jdhjhhhhhNubje)}(h``有序启动``:固件只释放一个将执行初始化阶段的hart,然后使用SBI HSM 扩展启动所有其他的hart。有序启动方法是启动RISC-V内核的首选启动方法, 因为它可以支持CPU热插拔和kexec。 h]h)}(h``有序启动``:固件只释放一个将执行初始化阶段的hart,然后使用SBI HSM 扩展启动所有其他的hart。有序启动方法是启动RISC-V内核的首选启动方法, 因为它可以支持CPU热插拔和kexec。h](j)}(h``有序启动``h]h 有序启动}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh:固件只释放一个将执行初始化阶段的hart,然后使用SBI HSM 扩展启动所有其他的hart。有序启动方法是启动RISC-V内核的首选启动方法, 因为它可以支持CPU热插拔和kexec。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKIhjubah}(h]h ]h"]h$]h&]uh1jdhjhhhhhNubeh}(h]h ]h"]h$]h&]j-uh1j_hhhKFhjhhubeh}(h]id6ah ]h"] 内核入口ah$]h&]uh1jjhjhhhhhKBubjk)}(hhh](jp)}(hUEFIh]hUEFI}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1johj5hhhhhKNubjk)}(hhh](jp)}(hUEFI 内存映射h]hUEFI 内存映射}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1johjFhhhhhKQubh)}(hU使用UEFI启动时,RISC-V内核将只使用EFI内存映射来填充系统内存。h]hU使用UEFI启动时,RISC-V内核将只使用EFI内存映射来填充系统内存。}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKShjFhhubh)}(hXUEFI固件必须解析 ``/reserved-memory`` 设备树节点的子节点,并遵守设备 树规范,将这些子节点的属性( ``no-map`` 和 ``reusable`` )转换为其正 确的EFI等价物(参见设备树规范v0.4-rc1的"3.5.4/reserved-memory和 UEFI"部分)。h](hUEFI固件必须解析 }(hjehhhNhNubj)}(h``/reserved-memory``h]h/reserved-memory}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjeubhZ 设备树节点的子节点,并遵守设备 树规范,将这些子节点的属性( }(hjehhhNhNubj)}(h ``no-map``h]hno-map}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjeubh 和 }(hjehhhNhNubj)}(h ``reusable``h]hreusable}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjeubhx )转换为其正 确的EFI等价物(参见设备树规范v0.4-rc1的”3.5.4/reserved-memory和 UEFI”部分)。}(hjehhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKUhjFhhubeh}(h]id7ah ]h"]uefi 内存映射ah$]h&]uh1jjhj5hhhhhKQubjk)}(hhh](jp)}(hRISCV_EFI_BOOT_PROTOCOLh]hRISCV_EFI_BOOT_PROTOCOL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1johjhhhhhK[ubh)}(h使用UEFI启动时,EFI stub 需要引导hartid以便将其传递给 ``$a1`` 中的 RISC-V内核。EFI stub使用以下方法之一获取引导hartid:h](hG使用UEFI启动时,EFI stub 需要引导hartid以便将其传递给 }(hjhhhNhNubj)}(h``$a1``h]h$a1}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhL 中的 RISC-V内核。EFI stub使用以下方法之一获取引导hartid:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK]hjhhubj`)}(hhh](je)}(h/``RISCV_EFI_BOOT_PROTOCOL`` (**首选**)。h]h)}(hjh](j)}(h``RISCV_EFI_BOOT_PROTOCOL``h]hRISCV_EFI_BOOT_PROTOCOL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh (}(hjhhhNhNubhstrong)}(h **首选**h]h首选}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh)。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK`hjubah}(h]h ]h"]h$]h&]uh1jdhjhhhhhNubje)}(h9``boot-hartid`` 设备树子节点(**已弃用**)。 h]h)}(h8``boot-hartid`` 设备树子节点(**已弃用**)。h](j)}(h``boot-hartid``h]h boot-hartid}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubh 设备树子节点(}(hj"hhhNhNubj)}(h **已弃用**h]h 已弃用}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubh)。}(hj"hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKahjubah}(h]h ]h"]h$]h&]uh1jdhjhhhhhNubeh}(h]h ]h"]h$]h&]jj,uh1j_hhhK`hjhhubh)}(hq任何新的固件都必须实现 ``RISCV_EFI_BOOT_PROTOCOL``,因为基于设备树 的方法现已被弃用。h](h"任何新的固件都必须实现 }(hj\hhhNhNubj)}(h``RISCV_EFI_BOOT_PROTOCOL``h]hRISCV_EFI_BOOT_PROTOCOL}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubh4,因为基于设备树 的方法现已被弃用。}(hj\hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKchjhhubeh}(h]riscv-efi-boot-protocolah ]h"]riscv_efi_boot_protocolah$]h&]uh1jjhj5hhhhhK[ubeh}(h]uefiah ]h"]uefiah$]h&]uh1jjhjhhhhhKNubeh}(h]id1ah ]h"]!内核预加载的要求和限制ah$]h&]uh1jjhjlhhhhhKubjk)}(hhh](jp)}(h早期启动的要求和约束h]h早期启动的要求和约束}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1johjhhhhhKgubh)}(h6RISC-V内核的早期启动过程遵循以下约束:h]h6RISC-V内核的早期启动过程遵循以下约束:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKihjhhubjk)}(hhh](jp)}(hEFI stub 和设备树h]hEFI stub 和设备树}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1johjhhhhhKlubh)}(h使用UEFI启动时,EFI stub 会用与arm64相同的参数补充(或创建)设备树, 这些参数在Documentation/arch/arm/uefi.rst中的 "UEFI kernel supporton ARM"段落中有描述。h]h使用UEFI启动时,EFI stub 会用与arm64相同的参数补充(或创建)设备树, 这些参数在Documentation/arch/arm/uefi.rst中的 “UEFI kernel supporton ARM”段落中有描述。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKnhjhhubeh}(h]efi-stubah ]h"]efi stub 和设备树ah$]h&]uh1jjhjhhhhhKlubjk)}(hhh](jp)}(h虚拟映射安装h]h虚拟映射安装}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1johjhhhhhKsubh)}(h?在RISC-V内核中,虚拟映射的安装分为两步进行:h]h?在RISC-V内核中,虚拟映射的安装分为两步进行:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKuhjhhubhenumerated_list)}(hhh](je)}(hXA``setup_vm()`` 在 ``early_pg_dir`` 中安装一个临时的内核映射,这 允许发现系统内存。 此时只有内核文本/数据被映射。在建立这个映射时, 不能进行分配(因为系统内存还未知),所以``early_pg_dir``页表是静 态分配的(每个级别只使用一个表)。 h]h)}(hX@``setup_vm()`` 在 ``early_pg_dir`` 中安装一个临时的内核映射,这 允许发现系统内存。 此时只有内核文本/数据被映射。在建立这个映射时, 不能进行分配(因为系统内存还未知),所以``early_pg_dir``页表是静 态分配的(每个级别只使用一个表)。h](j)}(h``setup_vm()``h]h setup_vm()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 在 }(hjhhhNhNubj)}(h``early_pg_dir``h]h early_pg_dir}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhX 中安装一个临时的内核映射,这 允许发现系统内存。 此时只有内核文本/数据被映射。在建立这个映射时, 不能进行分配(因为系统内存还未知),所以``early_pg_dir``页表是静 态分配的(每个级别只使用一个表)。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKwhjubah}(h]h ]h"]h$]h&]uh1jdhjhhhhhNubje)}(hXJ``setup_vm_final()`` 在 ``swapper_pg_dir`` 中创建最终的内核映 射,并利用发现的系统内存 创建线性映射。在建立这个映射时,内核可以 分配内存,但不能直接访问它(因为直接映射还不存在),所以它使用fixmap 区域的临时映射来访问新分配的页表级别。 h]h)}(hXI``setup_vm_final()`` 在 ``swapper_pg_dir`` 中创建最终的内核映 射,并利用发现的系统内存 创建线性映射。在建立这个映射时,内核可以 分配内存,但不能直接访问它(因为直接映射还不存在),所以它使用fixmap 区域的临时映射来访问新分配的页表级别。h](j)}(h``setup_vm_final()``h]hsetup_vm_final()}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubh 在 }(hj:hhhNhNubj)}(h``swapper_pg_dir``h]hswapper_pg_dir}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubhX 中创建最终的内核映 射,并利用发现的系统内存 创建线性映射。在建立这个映射时,内核可以 分配内存,但不能直接访问它(因为直接映射还不存在),所以它使用fixmap 区域的临时映射来访问新分配的页表级别。}(hj:hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK|hj6ubah}(h]h ]h"]h$]h&]uh1jdhjhhhhhNubeh}(h]h ]h"]h$]h&]enumtypearabicprefixhsuffix.uh1jhjhhhhhKwubh)}(hXh为了让 ``virt_to_phys()`` 和 ``phys_to_virt()`` 能够正确地将直接 映射地址转换为物理地址,它们需要知道DRAM的起始位置。这发生在步骤1之后, 就在步骤2安装直接映射之前(参见arch/riscv/mm/init.c中的 ``setup_bootmem()`` 函数)。在安装最终虚拟映射之前使用这些宏时必须 仔细检查。h](h 为了让 }(hjyhhhNhNubj)}(h``virt_to_phys()``h]hvirt_to_phys()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyubh 和 }(hjyhhhNhNubj)}(h``phys_to_virt()``h]hphys_to_virt()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyubh 能够正确地将直接 映射地址转换为物理地址,它们需要知道DRAM的起始位置。这发生在步骤1之后, 就在步骤2安装直接映射之前(参见arch/riscv/mm/init.c中的 }(hjyhhhNhNubj)}(h``setup_bootmem()``h]hsetup_bootmem()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyubhV 函数)。在安装最终虚拟映射之前使用这些宏时必须 仔细检查。}(hjyhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h]id9ah ]h"]虚拟映射安装ah$]h&]uh1jjhjhhhhhKsubjk)}(hhh](jp)}(h!通过fixmap进行设备树映射h]h!通过fixmap进行设备树映射}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1johjhhhhhKubh)}(hX由于 ``reserved_mem`` 数组是用 ``setup_vm()`` 建立的虚拟地址初始化 的,并且与``setup_vm_final()``建立的映射一起使用,RISC-V内核使用 fixmap区域来映射设备树。这确保设备树可以通过两种虚拟映射访问。h](h由于 }(hjhhhNhNubj)}(h``reserved_mem``h]h reserved_mem}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 数组是用 }(hjhhhNhNubj)}(h``setup_vm()``h]h setup_vm()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 建立的虚拟地址初始化 的,并且与``setup_vm_final()``建立的映射一起使用,RISC-V内核使用 fixmap区域来映射设备树。这确保设备树可以通过两种虚拟映射访问。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h]fixmapah ]h"]!通过fixmap进行设备树映射ah$]h&]uh1jjhjhhhhhKubjk)}(hhh](jp)}(h Pre-MMU执行h]h Pre-MMU执行}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1johjhhhhhKubh)}(h在建立第一个虚拟映射之前,需要运行一些代码。这些包括第一个虚拟映射的安装本身, 早期替代方案的修补,以及内核命令行的早期解析。这些代码必须非常小心地编译,因为:h]h在建立第一个虚拟映射之前,需要运行一些代码。这些包括第一个虚拟映射的安装本身, 早期替代方案的修补,以及内核命令行的早期解析。这些代码必须非常小心地编译,因为:}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubj`)}(hhh](je)}(h``-fno-pie``:这对于使用``-fPIE``的可重定位内核是必需的,否则,任何对 全局符号的访问都将通过 GOT进行,而GOT只是虚拟地重新定位。h]h)}(h``-fno-pie``:这对于使用``-fPIE``的可重定位内核是必需的,否则,任何对 全局符号的访问都将通过 GOT进行,而GOT只是虚拟地重新定位。h](j)}(h ``-fno-pie``h]h-fno-pie}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubh:这对于使用``-fPIE``的可重定位内核是必需的,否则,任何对 全局符号的访问都将通过 GOT进行,而GOT只是虚拟地重新定位。}(hj6hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj2ubah}(h]h ]h"]h$]h&]uh1jdhj/hhhhhNubje)}(h``-mcmodel=medany``:任何对全局符号的访问都必须是PC相对的,以避免在设 置MMU之前发生任何重定位。h]h)}(h``-mcmodel=medany``:任何对全局符号的访问都必须是PC相对的,以避免在设 置MMU之前发生任何重定位。h](j)}(h``-mcmodel=medany``h]h-mcmodel=medany}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubho:任何对全局符号的访问都必须是PC相对的,以避免在设 置MMU之前发生任何重定位。}(hj\hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjXubah}(h]h ]h"]h$]h&]uh1jdhj/hhhhhNubje)}(hT*所有* 的仪表化功能也必须被禁用(包括KASAN,ftrace和其他)。 h]h)}(hS*所有* 的仪表化功能也必须被禁用(包括KASAN,ftrace和其他)。h](hemphasis)}(h*所有*h]h所有}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhK 的仪表化功能也必须被禁用(包括KASAN,ftrace和其他)。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj~ubah}(h]h ]h"]h$]h&]uh1jdhj/hhhhhNubeh}(h]h ]h"]h$]h&]jj,uh1j_hhhKhjhhubh)}(h由于使用来自不同编译单元的符号需要用这些标志编译该单元,我们建议尽可能不要使用 外部符号。h]h由于使用来自不同编译单元的符号需要用这些标志编译该单元,我们建议尽可能不要使用 外部符号。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h]pre-mmuah ]h"] pre-mmu执行ah$]h&]uh1jjhjhhhhhKubeh}(h]id8ah ]h"]早期启动的要求和约束ah$]h&]uh1jjhjlhhhhhKgubeh}(h]risc-vah ]h"]!risc-v内核启动要求和限制ah$]h&]uh1jjhhhhhhhK ubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(joN generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerjerror_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourcehnj _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}nameids}(jjjjjjj$j!jKjHjrjojjj2j/jjjjjj~jjjjjjj j jju nametypes}(jjjj$jKjrjj2jjjjjjj juh}(jjljjjj:j!jjHj'jojNjjuj/jjj5jjFj~jjjjjjjj jjju footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}jK sRparse_messages]transform_messages] transformerN include_log]4Documentation/translations/zh_CN/arch/riscv/boot.rst(NNNNta decorationNhhub.