Chinese translated version of Documentation/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/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 (ä¿çï¼å°æ¥å¯è½ä½¿ç¨)