Chinese translated version of Documentation/arch/arm64/booting.rst If you have any comment or update to the content, please contact the original document maintainer directly. However, if you have a problem communicating in English you can also ask the Chinese maintainer for help. Contact the Chinese maintainer if this translation is outdated or if there is a problem with the translation. M: Will Deacon <will.deacon@arm.com> zh_CN: Fu Wei <wefu@redhat.com> C: 55f058e7574c3615dea4615573a19bdb258696c6 --------------------------------------------------------------------- Documentation/arch/arm64/booting.rst çš„ä¸æ–‡ç¿»è¯‘ 如果想评论或更新本文的内容,请直接è”ç³»åŽŸæ–‡æ¡£çš„ç»´æŠ¤è€…ã€‚å¦‚æžœä½ ä½¿ç”¨è‹±æ–‡ 交æµæœ‰å›°éš¾çš„è¯ï¼Œä¹Ÿå¯ä»¥å‘ä¸æ–‡ç‰ˆç»´æŠ¤è€…求助。如果本翻译更新ä¸åŠæ—¶æˆ–者翻 译å˜åœ¨é—®é¢˜ï¼Œè¯·è”ç³»ä¸æ–‡ç‰ˆç»´æŠ¤è€…。 英文版维护者: Will Deacon <will.deacon@arm.com> ä¸æ–‡ç‰ˆç»´æŠ¤è€…: å‚…ç‚œ Fu Wei <wefu@redhat.com> ä¸æ–‡ç‰ˆç¿»è¯‘者: å‚…ç‚œ Fu Wei <wefu@redhat.com> ä¸æ–‡ç‰ˆæ ¡è¯‘者: å‚…ç‚œ Fu Wei <wefu@redhat.com> 本文翻译æ交时的 Git 检出点为: 55f058e7574c3615dea4615573a19bdb258696c6 以下为æ£æ–‡ --------------------------------------------------------------------- å¯åŠ¨ AArch64 Linux ================== 作者: Will Deacon <will.deacon@arm.com> 日期: 2012 å¹´ 09 月 07 æ—¥ 本文档基于 Russell King çš„ ARM å¯åŠ¨æ–‡æ¡£ï¼Œä¸”适用于所有公开å‘布的 AArch64 Linux å†…æ ¸ä»£ç 。 AArch64 异常模型由多个异常级(EL0 - EL3)组æˆï¼Œå¯¹äºŽ EL0 å’Œ EL1 异常级 有对应的安全和éžå®‰å…¨æ¨¡å¼ã€‚EL2 是系统管ç†çº§ï¼Œä¸”ä»…å˜åœ¨äºŽéžå®‰å…¨æ¨¡å¼ä¸‹ã€‚ EL3 是最高特æƒçº§ï¼Œä¸”ä»…å˜åœ¨äºŽå®‰å…¨æ¨¡å¼ä¸‹ã€‚ 基于本文档的目的,我们将简å•åœ°ä½¿ç”¨â€˜å¼•å¯¼è£…载程åºâ€™ï¼ˆâ€˜boot loader’) 这个术è¯æ¥å®šä¹‰åœ¨å°†æŽ§åˆ¶æƒäº¤ç»™ Linux å†…æ ¸å‰ CPU 上执行的所有软件。 è¿™å¯èƒ½åŒ…å«å®‰å…¨ç›‘控和系统管ç†ä»£ç ,或者它å¯èƒ½åªæ˜¯ä¸€äº›ç”¨äºŽå‡†å¤‡æœ€å°å¯åŠ¨ 环境的指令。 基本上,引导装载程åºï¼ˆè‡³å°‘)应实现以下æ“作: 1ã€è®¾ç½®å’Œåˆå§‹åŒ– RAM 2ã€è®¾ç½®è®¾å¤‡æ ‘æ•°æ® 3ã€è§£åŽ‹å†…æ ¸æ˜ åƒ 4ã€è°ƒç”¨å†…æ ¸æ˜ åƒ 1ã€è®¾ç½®å’Œåˆå§‹åŒ– RAM ----------------- å¿…è¦æ€§: 强制 引导装载程åºåº”该找到并åˆå§‹åŒ–系统ä¸æ‰€æœ‰å†…æ ¸ç”¨äºŽä¿æŒç³»ç»Ÿå˜é‡æ•°æ®çš„ RAM。 这个æ“作的执行方å¼å› 设备而异。(它å¯èƒ½ä½¿ç”¨å†…部算法æ¥è‡ªåŠ¨å®šä½å’Œè®¡ç®—所有 RAM,或å¯èƒ½ä½¿ç”¨å¯¹è¿™ä¸ªè®¾å¤‡å·²çŸ¥çš„ RAM ä¿¡æ¯ï¼Œè¿˜å¯èƒ½æ˜¯å¼•å¯¼è£…载程åºè®¾è®¡è€… 想到的任何åˆé€‚的方法。) 2ã€è®¾ç½®è®¾å¤‡æ ‘æ•°æ® --------------- å¿…è¦æ€§: 强制 è®¾å¤‡æ ‘æ•°æ®å—(dtb)必须 8 å—节对é½ï¼Œä¸”大å°ä¸èƒ½è¶…过 2MBã€‚ç”±äºŽè®¾å¤‡æ ‘ æ•°æ®å—将在使能缓å˜çš„情况下以 2MB ç²’åº¦è¢«æ˜ å°„ï¼Œæ•…å…¶ä¸èƒ½è¢«ç½®äºŽå¿…须以特定 å±žæ€§æ˜ å°„çš„2M区域内。 注: v4.2 之å‰çš„版本åŒæ—¶è¦æ±‚è®¾å¤‡æ ‘æ•°æ®å—è¢«ç½®äºŽä»Žå†…æ ¸æ˜ åƒä»¥ä¸‹ text_offset å—节处算起第一个 512MB 内。 3ã€è§£åŽ‹å†…æ ¸æ˜ åƒ ------------- å¿…è¦æ€§: å¯é€‰ AArch64 å†…æ ¸å½“å‰æ²¡æœ‰æ供自解压代ç ï¼Œå› æ¤å¦‚æžœä½¿ç”¨äº†åŽ‹ç¼©å†…æ ¸æ˜ åƒæ–‡ä»¶ (比如 Image.gz),则需è¦é€šè¿‡å¼•å¯¼è£…载程åºï¼ˆä½¿ç”¨ gzip ç‰ï¼‰æ¥è¿›è¡Œè§£åŽ‹ã€‚ 若引导装载程åºæ²¡æœ‰å®žçŽ°è¿™ä¸ªåŠŸèƒ½ï¼Œå°±è¦ä½¿ç”¨éžåŽ‹ç¼©å†…æ ¸æ˜ åƒæ–‡ä»¶ã€‚ 4ã€è°ƒç”¨å†…æ ¸æ˜ åƒ ------------- å¿…è¦æ€§: 强制 å·²è§£åŽ‹çš„å†…æ ¸æ˜ åƒåŒ…å«ä¸€ä¸ª 64 å—节的头,内容如下: u32 code0; /* å¯æ‰§è¡Œä»£ç */ u32 code1; /* å¯æ‰§è¡Œä»£ç */ u64 text_offset; /* æ˜ åƒè£…è½½å移,å°ç«¯æ¨¡å¼ */ u64 image_size; /* æ˜ åƒå®žé™…大å°, å°ç«¯æ¨¡å¼ */ u64 flags; /* å†…æ ¸æ——æ ‡, å°ç«¯æ¨¡å¼ * u64 res2 = 0; /* ä¿ç•™ */ u64 res3 = 0; /* ä¿ç•™ */ u64 res4 = 0; /* ä¿ç•™ */ u32 magic = 0x644d5241; /* é”æ•°, å°ç«¯, "ARM\x64" */ u32 res5; /* ä¿ç•™ (用于 PE COFF å移) */ æ˜ åƒå¤´æ³¨é‡Šï¼š - 自 v3.17 起,除éžå¦æœ‰è¯´æ˜Žï¼Œæ‰€æœ‰åŸŸéƒ½æ˜¯å°ç«¯æ¨¡å¼ã€‚ - code0/code1 负责跳转到 stext. - 当通过 EFI å¯åŠ¨æ—¶ï¼Œ æœ€åˆ code0/code1 被跳过。 res5 是到 PE 文件头的å移,而 PE 文件头å«æœ‰ EFI çš„å¯åŠ¨å…¥å£ç‚¹ (efi_stub_entry)。当 stub 代ç 完æˆäº†å®ƒçš„使命,它会跳转到 code0 继ç»æ£å¸¸çš„å¯åŠ¨æµç¨‹ã€‚ - v3.17 之å‰ï¼Œæœªæ˜Žç¡®æŒ‡å®š text_offset çš„å—节åºã€‚æ¤æ—¶ï¼Œimage_size 为零, 且 text_offset ä¾ç…§å†…æ ¸å—节åºä¸º 0x80000。 当 image_size éžé›¶ï¼Œtext_offset 为å°ç«¯æ¨¡å¼ä¸”æ˜¯æœ‰æ•ˆå€¼ï¼Œåº”è¢«å¼•å¯¼åŠ è½½ 程åºä½¿ç”¨ã€‚当 image_size 为零,text_offset å¯å‡å®šä¸º 0x80000。 - flags 域 (v3.17 引入) 为 64 ä½å°ç«¯æ¨¡å¼ï¼Œå…¶ç¼–ç 如下: ä½ 0: å†…æ ¸å—节åºã€‚ 1 表示大端模å¼ï¼Œ0 表示å°ç«¯æ¨¡å¼ã€‚ ä½ 1-2: å†…æ ¸é¡µå¤§å°ã€‚ 0 - 未指定。 1 - 4K 2 - 16K 3 - 64K ä½ 3: å†…æ ¸ç‰©ç†ä½ç½® 0 - 2MB 对é½åŸºå€åº”å°½é‡é 近内å˜èµ·å§‹å¤„ï¼Œå› ä¸º 其基å€ä»¥ä¸‹çš„内å˜æ— æ³•é€šè¿‡çº¿æ€§æ˜ å°„è®¿é—® 1 - 2MB 对é½åŸºå€å¯ä»¥åœ¨ç‰©ç†å†…å˜çš„ä»»æ„ä½ç½® ä½ 4-63: ä¿ç•™ã€‚ - 当 image_size 为零时,引导装载程åºåº”è¯•å›¾åœ¨å†…æ ¸æ˜ åƒæœ«å°¾ä¹‹åŽå°½å¯èƒ½ 多地ä¿ç•™ç©ºé—²å†…å˜ä¾›å†…æ ¸ç›´æŽ¥ä½¿ç”¨ã€‚å¯¹å†…å˜ç©ºé—´çš„需求é‡å› æ‰€é€‰å®šçš„å†…æ ¸ 特性而异, å¹¶æ— å®žé™…é™åˆ¶ã€‚ å†…æ ¸æ˜ åƒå¿…须被放置在任æ„一个å¯ç”¨ç³»ç»Ÿå†…å˜ 2MB 对é½åŸºå€çš„ text_offset å—节处,并从该处被调用。2MB 对é½åŸºå€å’Œå†…æ ¸æ˜ åƒèµ·å§‹åœ°å€ä¹‹é—´çš„区域对于 å†…æ ¸æ¥è¯´æ²¡æœ‰ç‰¹æ®Šæ„义,且å¯èƒ½è¢«ç”¨äºŽå…¶ä»–目的。 ä»Žæ˜ åƒèµ·å§‹åœ°å€ç®—起,最少必须准备 image_size å—节的空闲内å˜ä¾›å†…æ ¸ä½¿ç”¨ã€‚ 注: v4.6 之å‰çš„ç‰ˆæœ¬æ— æ³•ä½¿ç”¨å†…æ ¸æ˜ åƒç‰©ç†å移以下的内å˜ï¼Œæ‰€ä»¥å½“时建议 å°†æ˜ åƒå°½é‡æ”¾ç½®åœ¨é 近系统内å˜èµ·å§‹çš„地方。 任何æä¾›ç»™å†…æ ¸çš„å†…å˜ï¼ˆç”šè‡³åœ¨æ˜ åƒèµ·å§‹åœ°å€ä¹‹å‰ï¼‰ï¼Œè‹¥æœªä»Žå†…æ ¸ä¸æ ‡è®°ä¸ºä¿ç•™ (å¦‚åœ¨è®¾å¤‡æ ‘ï¼ˆdtb)的 memreserve åŒºåŸŸï¼‰ï¼Œéƒ½å°†è¢«è®¤ä¸ºå¯¹å†…æ ¸æ˜¯å¯ç”¨ã€‚ åœ¨è·³è½¬å…¥å†…æ ¸å‰ï¼Œå¿…须符åˆä»¥ä¸‹çŠ¶æ€ï¼š - åœæ¢æ‰€æœ‰ DMA è®¾å¤‡ï¼Œè¿™æ ·å†…å˜æ•°æ®å°±ä¸ä¼šå› 为虚å‡ç½‘络包或ç£ç›˜æ•°æ®è€Œ è¢«ç ´å。这å¯èƒ½å¯ä»¥èŠ‚çœä½ 许多的调试时间。 - 主 CPU 通用寄å˜å™¨è®¾ç½® x0 = 系统 RAM ä¸è®¾å¤‡æ ‘æ•°æ®å—(dtb)的物ç†åœ°å€ã€‚ x1 = 0 (ä¿ç•™ï¼Œå°†æ¥å¯èƒ½ä½¿ç”¨) x2 = 0 (ä¿ç•™ï¼Œå°†æ¥å¯èƒ½ä½¿ç”¨) x3 = 0 (ä¿ç•™ï¼Œå°†æ¥å¯èƒ½ä½¿ç”¨) - CPU æ¨¡å¼ æ‰€æœ‰å½¢å¼çš„ä¸æ–必须在 PSTATE.DAIF ä¸è¢«å±è”½ï¼ˆDebugã€SErrorã€IRQ å’Œ FIQ)。 CPU 必须处于 EL2(推è,å¯è®¿é—®è™šæ‹ŸåŒ–扩展)或éžå®‰å…¨ EL1 模å¼ä¸‹ã€‚ - 高速缓å˜ã€MMU MMU 必须关é—。 指令缓å˜å¼€å¯æˆ–å…³é—皆å¯ã€‚ å·²è½½å…¥çš„å†…æ ¸æ˜ åƒçš„相应内å˜åŒºå¿…须被清ç†ï¼Œä»¥è¾¾åˆ°ç¼“å˜ä¸€è‡´æ€§ç‚¹ï¼ˆPoC)。 当å˜åœ¨ç³»ç»Ÿç¼“å˜æˆ–其他使能缓å˜çš„ä¸€è‡´æ€§ä¸»æŽ§å™¨æ—¶ï¼Œé€šå¸¸éœ€ä½¿ç”¨è™šæ‹Ÿåœ°å€ ç»´æŠ¤å…¶ç¼“å˜ï¼Œè€Œéž set/way æ“作。 éµä»Žé€šè¿‡è™šæ‹Ÿåœ°å€æ“作维护构架缓å˜çš„系统缓å˜å¿…须被é…置,并å¯ä»¥è¢«ä½¿èƒ½ã€‚ 而ä¸é€šè¿‡è™šæ‹Ÿåœ°å€æ“作维护构架缓å˜çš„系统缓å˜ï¼ˆä¸æŽ¨è),必须被é…置且 ç¦ç”¨ã€‚ *译者注:对于 PoC 以åŠç¼“å˜ç›¸å…³å†…容,请å‚考 ARMv8 构架å‚考手册 ARM DDI 0487A - 架构计时器 CNTFRQ 必须设定为计时器的频率,且 CNTVOFF 必须设定为对所有 CPU 都一致的值。如果在 EL1 模å¼ä¸‹è¿›å…¥å†…æ ¸ï¼Œåˆ™ CNTHCTL_EL2 ä¸çš„ EL1PCTEN (bit 0) 必须置ä½ã€‚ - 一致性 é€šè¿‡å†…æ ¸å¯åŠ¨çš„所有 CPU åœ¨å†…æ ¸å…¥å£åœ°å€ä¸Šå¿…须处于相åŒçš„一致性域ä¸ã€‚ è¿™å¯èƒ½è¦æ ¹æ®å…·ä½“实现æ¥å®šä¹‰åˆå§‹åŒ–过程,以使能æ¯ä¸ªCPU上对维护æ“作的 接收。 - 系统寄å˜å™¨ åœ¨è¿›å…¥å†…æ ¸æ˜ åƒçš„异常级ä¸ï¼Œæ‰€æœ‰æž„架ä¸å¯å†™çš„系统寄å˜å™¨å¿…须通过软件 在一个更高的异常级别下åˆå§‹åŒ–,以防æ¢åœ¨ 未知 状æ€ä¸‹è¿è¡Œã€‚ 对于拥有 GICv3 ä¸æ–控制器并以 v3 模å¼è¿è¡Œçš„系统: - 如果 EL3 å˜åœ¨ï¼š ICC_SRE_EL3.Enable (ä½ 3) å¿…é¡»åˆå§‹åŒ–为 0b1。 ICC_SRE_EL3.SRE (ä½ 0) å¿…é¡»åˆå§‹åŒ–为 0b1。 - è‹¥å†…æ ¸è¿è¡Œåœ¨ EL1: ICC_SRE_EL2.Enable (ä½ 3) å¿…é¡»åˆå§‹åŒ–为 0b1。 ICC_SRE_EL2.SRE (ä½ 0) å¿…é¡»åˆå§‹åŒ–为 0b1。 - è®¾å¤‡æ ‘ï¼ˆDT)或 ACPI 表必须æ述一个 GICv3 ä¸æ–控制器。 对于拥有 GICv3 ä¸æ–控制器并以兼容(v2)模å¼è¿è¡Œçš„系统: - 如果 EL3 å˜åœ¨ï¼š ICC_SRE_EL3.SRE (ä½ 0) å¿…é¡»åˆå§‹åŒ–为 0b0。 - è‹¥å†…æ ¸è¿è¡Œåœ¨ EL1: ICC_SRE_EL2.SRE (ä½ 0) å¿…é¡»åˆå§‹åŒ–为 0b0。 - è®¾å¤‡æ ‘ï¼ˆDT)或 ACPI 表必须æ述一个 GICv2 ä¸æ–控制器。 以上对于 CPU 模å¼ã€é«˜é€Ÿç¼“å˜ã€MMUã€æž¶æž„计时器ã€ä¸€è‡´æ€§ã€ç³»ç»Ÿå¯„å˜å™¨çš„ å¿…è¦æ¡ä»¶æ述适用于所有 CPU。所有 CPU 必须在åŒä¸€å¼‚å¸¸çº§åˆ«è·³å…¥å†…æ ¸ã€‚ 引导装载程åºå¿…须在æ¯ä¸ª CPU 处于以下状æ€æ—¶è·³å…¥å†…æ ¸å…¥å£ï¼š - 主 CPU å¿…é¡»ç›´æŽ¥è·³å…¥å†…æ ¸æ˜ åƒçš„第一æ¡æŒ‡ä»¤ã€‚é€šè¿‡æ¤ CPU ä¼ é€’çš„è®¾å¤‡æ ‘ æ•°æ®å—必须在æ¯ä¸ª CPU 节点ä¸åŒ…å«ä¸€ä¸ª ‘enable-method’ 属性,所 支æŒçš„ enable-method 请è§ä¸‹æ–‡ã€‚ 引导装载程åºå¿…须生æˆè¿™äº›è®¾å¤‡æ ‘å±žæ€§ï¼Œå¹¶åœ¨è·³å…¥å†…æ ¸å…¥å£ä¹‹å‰å°†å…¶æ’å…¥ æ•°æ®å—。 - enable-method 为 “spin-table†的 CPU 必须在它们的 CPU 节点ä¸åŒ…å«ä¸€ä¸ª ‘cpu-release-addr’ å±žæ€§ã€‚è¿™ä¸ªå±žæ€§æ ‡è¯†äº†ä¸€ä¸ª 64 ä½è‡ªç„¶å¯¹é½ä¸”åˆå§‹åŒ–为零的内å˜ä½ç½®ã€‚ 这些 CPU 必须在内å˜ä¿ç•™åŒºï¼ˆé€šè¿‡è®¾å¤‡æ ‘ä¸çš„ /memreserve/ åŸŸä¼ é€’ ç»™å†…æ ¸ï¼‰ä¸è‡ªæ—‹äºŽå†…æ ¸ä¹‹å¤–ï¼Œè½®è¯¢å®ƒä»¬çš„ cpu-release-addr ä½ç½®ï¼ˆå¿…é¡» 包å«åœ¨ä¿ç•™åŒºä¸ï¼‰ã€‚å¯é€šè¿‡æ’å…¥ wfe 指令æ¥é™ä½Žå¿™å¾ªçŽ¯å¼€é”€ï¼Œè€Œä¸» CPU å°† å‘出 sev 指令。当对 cpu-release-addr 所指ä½ç½®çš„读å–æ“作返回éžé›¶å€¼ 时,CPU 必须跳入æ¤å€¼æ‰€æŒ‡å‘的地å€ã€‚æ¤å€¼ä¸ºä¸€ä¸ªå•ç‹¬çš„ 64 ä½å°ç«¯å€¼ï¼Œ å› æ¤ CPU 须在跳转å‰å°†æ‰€è¯»å–的值转æ¢ä¸ºå…¶æœ¬èº«çš„端模å¼ã€‚ - enable-method 为 “psci†的 CPU ä¿æŒåœ¨å†…æ ¸å¤–ï¼ˆæ¯”å¦‚ï¼Œåœ¨ memory 节点ä¸æè¿°ä¸ºå†…æ ¸ç©ºé—´çš„å†…å˜åŒºå¤–ï¼Œæˆ–åœ¨é€šè¿‡è®¾å¤‡æ ‘ /memreserve/ 域ä¸æè¿°ä¸ºå†…æ ¸ä¿ç•™åŒºçš„空间ä¸ï¼‰ã€‚å†…æ ¸å°†ä¼šå‘起在 ARM æ–‡æ¡£ï¼ˆç¼–å· ARM DEN 0022A:用于 ARM 上的电æºçŠ¶æ€å调接å£ç³»ç»Ÿè½¯ä»¶ï¼‰ä¸æè¿°çš„ CPU_ON 调用æ¥å°† CPU å¸¦å…¥å†…æ ¸ã€‚ *译者注: ARM DEN 0022A 已更新到 ARM DEN 0022C。 è®¾å¤‡æ ‘å¿…é¡»åŒ…å«ä¸€ä¸ª ‘psci’ 节点,请å‚考以下文档: Documentation/devicetree/bindings/arm/psci.yaml - 辅助 CPU 通用寄å˜å™¨è®¾ç½® x0 = 0 (ä¿ç•™ï¼Œå°†æ¥å¯èƒ½ä½¿ç”¨) x1 = 0 (ä¿ç•™ï¼Œå°†æ¥å¯èƒ½ä½¿ç”¨) x2 = 0 (ä¿ç•™ï¼Œå°†æ¥å¯èƒ½ä½¿ç”¨) x3 = 0 (ä¿ç•™ï¼Œå°†æ¥å¯èƒ½ä½¿ç”¨)