SPDX-License-Identifier: GPL-2.0 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> zh_TW: Hu Haowen <src.res@email.cn> 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> ç¹é«”ä¸æ–‡ç‰ˆæ ¡è¯è€…: 胡皓文 Hu Haowen <src.res@email.cn> 本文翻è¯æ交時的 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 (ä¿ç•™ï¼Œå°‡ä¾†å¯èƒ½ä½¿ç”¨)