.. SPDX-License-Identifier: GPL-2.0 .. include:: ../../disclaimer-zh_CN.rst :Original: Documentation/arch/riscv/boot.rst :翻译: 龙进 Jin Long <longjin@dragonos.org> ======================== RISC-Vå†…æ ¸å¯åŠ¨è¦æ±‚å’Œé™åˆ¶ ======================== :Author: Alexandre Ghiti <alexghiti@rivosinc.com> :Date: 23 May 2023 这份文档æè¿°äº†RISC-Vå†…æ ¸å¯¹å¼•å¯¼åŠ è½½ç¨‹åºå’Œå›ºä»¶çš„æœŸæœ›ï¼Œä»¥åŠä»»ä½•å¼€å‘者在接触 早期å¯åŠ¨è¿‡ç¨‹æ—¶å¿…é¡»ç‰¢è®°çš„çº¦æŸã€‚在这份文档ä¸ï¼Œ ``早期å¯åŠ¨è¿‡ç¨‹`` 指的是在最 ç»ˆè™šæ‹Ÿæ˜ å°„è®¾ç½®ä¹‹å‰è¿è¡Œçš„任何代ç 。 å†…æ ¸é¢„åŠ è½½çš„è¦æ±‚å’Œé™åˆ¶ ====================== RISC-Vå†…æ ¸å¯¹å¼•å¯¼åŠ è½½ç¨‹åºå’Œå¹³å°å›ºä»¶æœ‰ä»¥ä¸‹è¦æ±‚: 寄å˜å™¨çŠ¶æ€ ---------- RISC-Vå†…æ ¸æœŸæœ›ï¼š * ``$a0`` 应包å«å½“剿 ¸å¿ƒçš„hartid。 * ``$a1`` 应包å«å†…å˜ä¸è®¾å¤‡æ ‘的地å€ã€‚ CSR 寄å˜å™¨çŠ¶æ€ -------------- RISC-Vå†…æ ¸æœŸæœ›ï¼š * ``$satp = 0``: 如果å˜åœ¨MMU,必须将其ç¦ç”¨ã€‚ 为常驻固件ä¿ç•™çš„å†…å˜ -------------------- RISC-Vå†…æ ¸åœ¨ç›´æŽ¥æ˜ å°„ä¸ä¸èƒ½æ˜ å°„ä»»ä½•å¸¸é©»å†…å˜æˆ–用PMPsä¿æŠ¤çš„å†…å˜ï¼Œ å› æ¤å›ºä»¶å¿…é¡»æ ¹æ®è®¾å¤‡æ ‘规范 å’Œ/或 UEFI规范æ£ç¡®æ ‡è®°è¿™äº›åŒºåŸŸã€‚ å†…æ ¸çš„ä½ç½® ---------- RISC-Vå†…æ ¸æœŸæœ›è¢«æ”¾ç½®åœ¨PMD边界(对于rv64为2MB对é½ï¼Œå¯¹äºŽrv32为4MB对é½ï¼‰ã€‚ 请注æ„ï¼Œå¦‚æžœä¸æ˜¯è¿™æ ·ï¼ŒEFI stub å°†é‡å®šä½å†…æ ¸ã€‚ 硬件æè¿° -------- 固件å¯ä»¥å°†è®¾å¤‡æ ‘或ACPIè¡¨ä¼ é€’ç»™RISC-Vå†…æ ¸ã€‚ è®¾å¤‡æ ‘å¯ä»¥ç›´æŽ¥ä»Žå‰ä¸€é˜¶æ®µé€šè¿‡$a1寄å˜å™¨ä¼ é€’ç»™å†…æ ¸ï¼Œæˆ–è€…åœ¨ä½¿ç”¨UEFIå¯åŠ¨æ—¶ï¼Œ å¯ä»¥é€šè¿‡EFIé…ç½®è¡¨ä¼ é€’ã€‚ ACPI表通过EFIé…ç½®è¡¨ä¼ é€’ç»™å†…æ ¸ã€‚åœ¨è¿™ç§æƒ…况下,EFI stub ä»ç„¶ä¼šåˆ›å»ºä¸€ä¸ª å°çš„è®¾å¤‡æ ‘ã€‚è¯·å‚阅下é¢çš„"EFI stub å’Œè®¾å¤‡æ ‘"éƒ¨åˆ†ï¼Œäº†è§£è¿™ä¸ªè®¾å¤‡æ ‘çš„è¯¦ç»† ä¿¡æ¯ã€‚ å†…æ ¸å…¥å£ -------- 在SMP系统ä¸ï¼Œæœ‰ä¸¤ç§æ–¹æ³•å¯ä»¥è¿›å…¥å†…æ ¸ï¼š - ``RISCV_BOOT_SPINWAIT``ï¼šå›ºä»¶åœ¨å†…æ ¸ä¸é‡Šæ”¾æ‰€æœ‰çš„hart,一个hartèµ¢ 得抽奖并执行早期å¯åЍ代ç ,而其他的hart则åœåœ¨é‚£é‡Œç‰å¾…åˆå§‹åŒ–完æˆã€‚è¿™ç§ æ–¹æ³•ä¸»è¦ç”¨äºŽæ”¯æŒæ²¡æœ‰SBI HSM扩展和M模å¼RISC-Vå†…æ ¸çš„æ—§å›ºä»¶ã€‚ - ``有åºå¯åЍ``:固件åªé‡Šæ”¾ä¸€ä¸ªå°†æ‰§è¡Œåˆå§‹åŒ–阶段的hart,然åŽä½¿ç”¨SBI HSM 扩展å¯åŠ¨æ‰€æœ‰å…¶ä»–çš„hart。有åºå¯åŠ¨æ–¹æ³•æ˜¯å¯åЍRISC-Vå†…æ ¸çš„é¦–é€‰å¯åŠ¨æ–¹æ³•ï¼Œ å› ä¸ºå®ƒå¯ä»¥æ”¯æŒCPUçƒæ’拔和kexec。 UEFI ---- UEFI å†…å˜æ˜ å°„ ~~~~~~~~~~~~~ 使用UEFIå¯åŠ¨æ—¶ï¼ŒRISC-Vå†…æ ¸å°†åªä½¿ç”¨EFIå†…å˜æ˜ å°„æ¥å¡«å……系统内å˜ã€‚ UEFIå›ºä»¶å¿…é¡»è§£æž ``/reserved-memory`` è®¾å¤‡æ ‘èŠ‚ç‚¹çš„å节点,并éµå®ˆè®¾å¤‡ æ ‘è§„èŒƒï¼Œå°†è¿™äº›å节点的属性( ``no-map`` å’Œ ``reusable`` )转æ¢ä¸ºå…¶æ£ 确的EFIç‰ä»·ç‰©ï¼ˆå‚è§è®¾å¤‡æ ‘规范v0.4-rc1çš„"3.5.4/reserved-memoryå’Œ UEFI"部分)。 RISCV_EFI_BOOT_PROTOCOL ~~~~~~~~~~~~~~~~~~~~~~~ 使用UEFIå¯åŠ¨æ—¶ï¼ŒEFI stub 需è¦å¼•导hartidä»¥ä¾¿å°†å…¶ä¼ é€’ç»™ ``$a1`` ä¸çš„ RISC-Vå†…æ ¸ã€‚EFI stub使用以下方法之一获å–引导hartid: - ``RISCV_EFI_BOOT_PROTOCOL`` (**首选**)。 - ``boot-hartid`` è®¾å¤‡æ ‘å节点(**已弃用**)。 任何新的固件都必须实现 ``RISCV_EFI_BOOT_PROTOCOL``ï¼Œå› ä¸ºåŸºäºŽè®¾å¤‡æ ‘ 的方法现已被弃用。 早期å¯åŠ¨çš„è¦æ±‚å’Œçº¦æŸ ==================== RISC-Vå†…æ ¸çš„æ—©æœŸå¯åŠ¨è¿‡ç¨‹éµå¾ªä»¥ä¸‹çº¦æŸï¼š EFI stub å’Œè®¾å¤‡æ ‘ ----------------- 使用UEFIå¯åŠ¨æ—¶ï¼ŒEFI stub 会用与arm64相åŒçš„傿•°è¡¥å……ï¼ˆæˆ–åˆ›å»ºï¼‰è®¾å¤‡æ ‘ï¼Œ è¿™äº›å‚æ•°åœ¨Documentation/arch/arm/uefi.rstä¸çš„ "UEFI kernel supporton ARM"段è½ä¸æœ‰æè¿°ã€‚ è™šæ‹Ÿæ˜ å°„å®‰è£… ------------ 在RISC-Vå†…æ ¸ä¸ï¼Œè™šæ‹Ÿæ˜ 射的安装分为两æ¥è¿›è¡Œï¼š 1. ``setup_vm()`` 在 ``early_pg_dir`` ä¸å®‰è£…ä¸€ä¸ªä¸´æ—¶çš„å†…æ ¸æ˜ å°„ï¼Œè¿™ å…许å‘现系统内å˜ã€‚ æ¤æ—¶åªæœ‰å†…æ ¸æ–‡æœ¬/æ•°æ®è¢«æ˜ å°„ã€‚åœ¨å»ºç«‹è¿™ä¸ªæ˜ å°„æ—¶ï¼Œ ä¸èƒ½è¿›è¡Œåˆ†é…ï¼ˆå› ä¸ºç³»ç»Ÿå†…å˜è¿˜æœªçŸ¥ï¼‰ï¼Œæ‰€ä»¥``early_pg_dir``é¡µè¡¨æ˜¯é™ æ€åˆ†é…的(æ¯ä¸ªçº§åˆ«åªä½¿ç”¨ä¸€ä¸ªè¡¨ï¼‰ã€‚ 2. ``setup_vm_final()`` 在 ``swapper_pg_dir`` ä¸åˆ›å»ºæœ€ç»ˆçš„å†…æ ¸æ˜ å°„ï¼Œå¹¶åˆ©ç”¨å‘çŽ°çš„ç³»ç»Ÿå†…å˜ åˆ›å»ºçº¿æ€§æ˜ å°„ã€‚åœ¨å»ºç«‹è¿™ä¸ªæ˜ å°„æ—¶ï¼Œå†…æ ¸å¯ä»¥ 分é…内å˜ï¼Œä½†ä¸èƒ½ç›´æŽ¥è®¿é—®å®ƒï¼ˆå› ä¸ºç›´æŽ¥æ˜ å°„è¿˜ä¸å˜åœ¨ï¼‰ï¼Œæ‰€ä»¥å®ƒä½¿ç”¨fixmap åŒºåŸŸçš„ä¸´æ—¶æ˜ å°„æ¥è®¿é—®æ–°åˆ†é…的页表级别。 为了让 ``virt_to_phys()`` å’Œ ``phys_to_virt()`` 能够æ£ç¡®åœ°å°†ç›´æŽ¥ æ˜ å°„åœ°å€è½¬æ¢ä¸ºç‰©ç†åœ°å€ï¼Œå®ƒä»¬éœ€è¦çŸ¥é“DRAM的起始ä½ç½®ã€‚è¿™å‘生在æ¥éª¤1之åŽï¼Œ 就在æ¥éª¤2å®‰è£…ç›´æŽ¥æ˜ å°„ä¹‹å‰ï¼ˆå‚è§arch/riscv/mm/init.cä¸çš„ ``setup_bootmem()`` å‡½æ•°ï¼‰ã€‚åœ¨å®‰è£…æœ€ç»ˆè™šæ‹Ÿæ˜ å°„ä¹‹å‰ä½¿ç”¨è¿™äº›å®æ—¶å¿…é¡» 仔细检查。 通过fixmapè¿›è¡Œè®¾å¤‡æ ‘æ˜ å°„ ------------------------ 由于 ``reserved_mem`` 数组是用 ``setup_vm()`` 建立的虚拟地å€åˆå§‹åŒ– 的,并且与``setup_vm_final()``å»ºç«‹çš„æ˜ å°„ä¸€èµ·ä½¿ç”¨ï¼ŒRISC-Vå†…æ ¸ä½¿ç”¨ fixmapåŒºåŸŸæ¥æ˜ å°„è®¾å¤‡æ ‘ã€‚è¿™ç¡®ä¿è®¾å¤‡æ ‘å¯ä»¥é€šè¿‡ä¸¤ç§è™šæ‹Ÿæ˜ 射访问。 Pre-MMU执行 ----------- åœ¨å»ºç«‹ç¬¬ä¸€ä¸ªè™šæ‹Ÿæ˜ å°„ä¹‹å‰ï¼Œéœ€è¦è¿è¡Œä¸€äº›ä»£ç ã€‚è¿™äº›åŒ…æ‹¬ç¬¬ä¸€ä¸ªè™šæ‹Ÿæ˜ å°„çš„å®‰è£…æœ¬èº«ï¼Œ 早期替代方案的修补,以åŠå†…æ ¸å‘½ä»¤è¡Œçš„æ—©æœŸè§£æžã€‚这些代ç å¿…é¡»éžå¸¸å°å¿ƒåœ°ç¼–è¯‘ï¼Œå› ä¸ºï¼š - ``-fno-pie``:这对于使用``-fPIE``çš„å¯é‡å®šä½å†…æ ¸æ˜¯å¿…éœ€çš„ï¼Œå¦åˆ™ï¼Œä»»ä½•对 全局符å·çš„访问都将通过 GOT进行,而GOTåªæ˜¯è™šæ‹Ÿåœ°é‡æ–°å®šä½ã€‚ - ``-mcmodel=medany``:任何对全局符å·çš„访问都必须是PC相对的,以é¿å…在设 ç½®MMU之å‰å‘生任何é‡å®šä½ã€‚ - *所有* 的仪表化功能也必须被ç¦ç”¨ï¼ˆåŒ…括KASAN,ftrace和其他)。 由于使用æ¥è‡ªä¸åŒç¼–译å•元的符å·éœ€è¦ç”¨è¿™äº›æ ‡å¿—编译该å•元,我们建议尽å¯èƒ½ä¸è¦ä½¿ç”¨ 外部符å·ã€‚