Chinese translated version of Documentation/arm64/booting.txt
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/arm64/booting.txt çä¸æç¿»è¯
å¦ææ³è¯è®ºææ´æ°æ¬æçå
容ï¼è¯·ç´æ¥èç³»åææ¡£çç»´æ¤è
ãå¦æä½ ä½¿ç¨è±æ
交æµæå°é¾çè¯ï¼ä¹å¯ä»¥åä¸æçç»´æ¤è
æ±å©ãå¦ææ¬ç¿»è¯æ´æ°ä¸åæ¶æè
ç¿»
è¯åå¨é®é¢ï¼è¯·èç³»ä¸æçç»´æ¤è
ã
è±æçç»´æ¤è
ï¼ 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 ç²åº¦è¢«æ å°ï¼æ
å
¶ä¸è½è¢«ç½®äºå¸¦ä»»æ
ç¹å®å±æ§è¢«æ å°ç 2MB åºåå
ã
æ³¨ï¼ 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 ä¸ææ§å¶å¨ã
- å¦æ EL3 åå¨ï¼
以ä¸å¯¹äº 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.txt
- è¾
å© CPU éç¨å¯åå¨è®¾ç½®
x0 = 0 (ä¿çï¼å°æ¥å¯è½ä½¿ç¨)
x1 = 0 (ä¿çï¼å°æ¥å¯è½ä½¿ç¨)
x2 = 0 (ä¿çï¼å°æ¥å¯è½ä½¿ç¨)
x3 = 0 (ä¿çï¼å°æ¥å¯è½ä½¿ç¨)