Merge branch 'work.iov_iter' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
[linux-2.6-microblaze.git] / Documentation / translations / zh_TW / arm64 / booting.txt
1 SPDX-License-Identifier: GPL-2.0
2
3 Chinese translated version of Documentation/arm64/booting.rst
4
5 If you have any comment or update to the content, please contact the
6 original document maintainer directly.  However, if you have a problem
7 communicating in English you can also ask the Chinese maintainer for
8 help.  Contact the Chinese maintainer if this translation is outdated
9 or if there is a problem with the translation.
10
11 M:      Will Deacon <will.deacon@arm.com>
12 zh_CN:  Fu Wei <wefu@redhat.com>
13 zh_TW:  Hu Haowen <src.res@email.cn>
14 C:      55f058e7574c3615dea4615573a19bdb258696c6
15 ---------------------------------------------------------------------
16 Documentation/arm64/booting.rst 的中文翻譯
17
18 如果想評論或更新本文的內容,請直接聯繫原文檔的維護者。如果你使用英文
19 交流有困難的話,也可以向中文版維護者求助。如果本翻譯更新不及時或者翻
20 譯存在問題,請聯繫中文版維護者。
21
22 英文版維護者: Will Deacon <will.deacon@arm.com>
23 中文版維護者: 傅煒  Fu Wei <wefu@redhat.com>
24 中文版翻譯者: 傅煒  Fu Wei <wefu@redhat.com>
25 中文版校譯者: 傅煒  Fu Wei <wefu@redhat.com>
26 繁體中文版校譯者: 胡皓文  Hu Haowen <src.res@email.cn>
27 本文翻譯提交時的 Git 檢出點爲: 55f058e7574c3615dea4615573a19bdb258696c6
28
29 以下爲正文
30 ---------------------------------------------------------------------
31                         啓動 AArch64 Linux
32                         ==================
33
34 作者: Will Deacon <will.deacon@arm.com>
35 日期: 2012 年 09 月 07 日
36
37 本文檔基於 Russell King 的 ARM 啓動文檔,且適用於所有公開發布的
38 AArch64 Linux 內核代碼。
39
40 AArch64 異常模型由多個異常級(EL0 - EL3)組成,對於 EL0 和 EL1 異常級
41 有對應的安全和非安全模式。EL2 是系統管理級,且僅存在於非安全模式下。
42 EL3 是最高特權級,且僅存在於安全模式下。
43
44 基於本文檔的目的,我們將簡單地使用『引導裝載程序』(『boot loader』)
45 這個術語來定義在將控制權交給 Linux 內核前 CPU 上執行的所有軟體。
46 這可能包含安全監控和系統管理代碼,或者它可能只是一些用於準備最小啓動
47 環境的指令。
48
49 基本上,引導裝載程序(至少)應實現以下操作:
50
51 1、設置和初始化 RAM
52 2、設置設備樹數據
53 3、解壓內核映像
54 4、調用內核映像
55
56
57 1、設置和初始化 RAM
58 -----------------
59
60 必要性: 強制
61
62 引導裝載程序應該找到並初始化系統中所有內核用於保持系統變量數據的 RAM。
63 這個操作的執行方式因設備而異。(它可能使用內部算法來自動定位和計算所有
64 RAM,或可能使用對這個設備已知的 RAM 信息,還可能是引導裝載程序設計者
65 想到的任何合適的方法。)
66
67
68 2、設置設備樹數據
69 ---------------
70
71 必要性: 強制
72
73 設備樹數據塊(dtb)必須 8 字節對齊,且大小不能超過 2MB。由於設備樹
74 數據塊將在使能緩存的情況下以 2MB 粒度被映射,故其不能被置於必須以特定
75 屬性映射的2M區域內。
76
77 註: v4.2 之前的版本同時要求設備樹數據塊被置於從內核映像以下
78 text_offset 字節處算起第一個 512MB 內。
79
80 3、解壓內核映像
81 -------------
82
83 必要性: 可選
84
85 AArch64 內核當前沒有提供自解壓代碼,因此如果使用了壓縮內核映像文件
86 (比如 Image.gz),則需要通過引導裝載程序(使用 gzip 等)來進行解壓。
87 若引導裝載程序沒有實現這個功能,就要使用非壓縮內核映像文件。
88
89
90 4、調用內核映像
91 -------------
92
93 必要性: 強制
94
95 已解壓的內核映像包含一個 64 字節的頭,內容如下:
96
97   u32 code0;                    /* 可執行代碼 */
98   u32 code1;                    /* 可執行代碼 */
99   u64 text_offset;              /* 映像裝載偏移,小端模式 */
100   u64 image_size;               /* 映像實際大小, 小端模式 */
101   u64 flags;                    /* 內核旗標, 小端模式 *
102   u64 res2      = 0;            /* 保留 */
103   u64 res3      = 0;            /* 保留 */
104   u64 res4      = 0;            /* 保留 */
105   u32 magic     = 0x644d5241;   /* 魔數, 小端, "ARM\x64" */
106   u32 res5;                     /* 保留 (用於 PE COFF 偏移) */
107
108
109 映像頭注釋:
110
111 - 自 v3.17 起,除非另有說明,所有域都是小端模式。
112
113 - code0/code1 負責跳轉到 stext.
114
115 - 當通過 EFI 啓動時, 最初 code0/code1 被跳過。
116   res5 是到 PE 文件頭的偏移,而 PE 文件頭含有 EFI 的啓動入口點
117   (efi_stub_entry)。當 stub 代碼完成了它的使命,它會跳轉到 code0
118   繼續正常的啓動流程。
119
120 - v3.17 之前,未明確指定 text_offset 的字節序。此時,image_size 爲零,
121   且 text_offset 依照內核字節序爲 0x80000。
122   當 image_size 非零,text_offset 爲小端模式且是有效值,應被引導加載
123   程序使用。當 image_size 爲零,text_offset 可假定爲 0x80000。
124
125 - flags 域 (v3.17 引入) 爲 64 位小端模式,其編碼如下:
126   位 0:        內核字節序。 1 表示大端模式,0 表示小端模式。
127   位 1-2:      內核頁大小。
128                         0 - 未指定。
129                         1 - 4K
130                         2 - 16K
131                         3 - 64K
132   位 3:                內核物理位置
133                         0 - 2MB 對齊基址應儘量靠近內存起始處,因爲
134                             其基址以下的內存無法通過線性映射訪問
135                         1 - 2MB 對齊基址可以在物理內存的任意位置
136   位 4-63:     保留。
137
138 - 當 image_size 爲零時,引導裝載程序應試圖在內核映像末尾之後儘可能
139   多地保留空閒內存供內核直接使用。對內存空間的需求量因所選定的內核
140   特性而異, 並無實際限制。
141
142 內核映像必須被放置在任意一個可用系統內存 2MB 對齊基址的 text_offset
143 字節處,並從該處被調用。2MB 對齊基址和內核映像起始地址之間的區域對於
144 內核來說沒有特殊意義,且可能被用於其他目的。
145 從映像起始地址算起,最少必須準備 image_size 字節的空閒內存供內核使用。
146 註: v4.6 之前的版本無法使用內核映像物理偏移以下的內存,所以當時建議
147 將映像儘量放置在靠近系統內存起始的地方。
148
149 任何提供給內核的內存(甚至在映像起始地址之前),若未從內核中標記爲保留
150 (如在設備樹(dtb)的 memreserve 區域),都將被認爲對內核是可用。
151
152 在跳轉入內核前,必須符合以下狀態:
153
154 - 停止所有 DMA 設備,這樣內存數據就不會因爲虛假網絡包或磁碟數據而
155   被破壞。這可能可以節省你許多的調試時間。
156
157 - 主 CPU 通用寄存器設置
158   x0 = 系統 RAM 中設備樹數據塊(dtb)的物理地址。
159   x1 = 0 (保留,將來可能使用)
160   x2 = 0 (保留,將來可能使用)
161   x3 = 0 (保留,將來可能使用)
162
163 - CPU 模式
164   所有形式的中斷必須在 PSTATE.DAIF 中被屏蔽(Debug、SError、IRQ
165   和 FIQ)。
166   CPU 必須處於 EL2(推薦,可訪問虛擬化擴展)或非安全 EL1 模式下。
167
168 - 高速緩存、MMU
169   MMU 必須關閉。
170   指令緩存開啓或關閉皆可。
171   已載入的內核映像的相應內存區必須被清理,以達到緩存一致性點(PoC)。
172   當存在系統緩存或其他使能緩存的一致性主控器時,通常需使用虛擬地址
173   維護其緩存,而非 set/way 操作。
174   遵從通過虛擬地址操作維護構架緩存的系統緩存必須被配置,並可以被使能。
175   而不通過虛擬地址操作維護構架緩存的系統緩存(不推薦),必須被配置且
176   禁用。
177
178   *譯者註:對於 PoC 以及緩存相關內容,請參考 ARMv8 構架參考手冊
179    ARM DDI 0487A
180
181 - 架構計時器
182   CNTFRQ 必須設定爲計時器的頻率,且 CNTVOFF 必須設定爲對所有 CPU
183   都一致的值。如果在 EL1 模式下進入內核,則 CNTHCTL_EL2 中的
184   EL1PCTEN (bit 0) 必須置位。
185
186 - 一致性
187   通過內核啓動的所有 CPU 在內核入口地址上必須處於相同的一致性域中。
188   這可能要根據具體實現來定義初始化過程,以使能每個CPU上對維護操作的
189   接收。
190
191 - 系統寄存器
192   在進入內核映像的異常級中,所有構架中可寫的系統寄存器必須通過軟體
193   在一個更高的異常級別下初始化,以防止在 未知 狀態下運行。
194
195   對於擁有 GICv3 中斷控制器並以 v3 模式運行的系統:
196   - 如果 EL3 存在:
197     ICC_SRE_EL3.Enable (位 3) 必須初始化爲 0b1。
198     ICC_SRE_EL3.SRE (位 0) 必須初始化爲 0b1。
199   - 若內核運行在 EL1:
200     ICC_SRE_EL2.Enable (位 3) 必須初始化爲 0b1。
201     ICC_SRE_EL2.SRE (位 0) 必須初始化爲 0b1。
202   - 設備樹(DT)或 ACPI 表必須描述一個 GICv3 中斷控制器。
203
204   對於擁有 GICv3 中斷控制器並以兼容(v2)模式運行的系統:
205   - 如果 EL3 存在:
206     ICC_SRE_EL3.SRE (位 0) 必須初始化爲 0b0。
207   - 若內核運行在 EL1:
208     ICC_SRE_EL2.SRE (位 0) 必須初始化爲 0b0。
209   - 設備樹(DT)或 ACPI 表必須描述一個 GICv2 中斷控制器。
210
211 以上對於 CPU 模式、高速緩存、MMU、架構計時器、一致性、系統寄存器的
212 必要條件描述適用於所有 CPU。所有 CPU 必須在同一異常級別跳入內核。
213
214 引導裝載程序必須在每個 CPU 處於以下狀態時跳入內核入口:
215
216 - 主 CPU 必須直接跳入內核映像的第一條指令。通過此 CPU 傳遞的設備樹
217   數據塊必須在每個 CPU 節點中包含一個 『enable-method』 屬性,所
218   支持的 enable-method 請見下文。
219
220   引導裝載程序必須生成這些設備樹屬性,並在跳入內核入口之前將其插入
221   數據塊。
222
223 - enable-method 爲 「spin-table」 的 CPU 必須在它們的 CPU
224   節點中包含一個 『cpu-release-addr』 屬性。這個屬性標識了一個
225   64 位自然對齊且初始化爲零的內存位置。
226
227   這些 CPU 必須在內存保留區(通過設備樹中的 /memreserve/ 域傳遞
228   給內核)中自旋於內核之外,輪詢它們的 cpu-release-addr 位置(必須
229   包含在保留區中)。可通過插入 wfe 指令來降低忙循環開銷,而主 CPU 將
230   發出 sev 指令。當對 cpu-release-addr 所指位置的讀取操作返回非零值
231   時,CPU 必須跳入此值所指向的地址。此值爲一個單獨的 64 位小端值,
232   因此 CPU 須在跳轉前將所讀取的值轉換爲其本身的端模式。
233
234 - enable-method 爲 「psci」 的 CPU 保持在內核外(比如,在
235   memory 節點中描述爲內核空間的內存區外,或在通過設備樹 /memreserve/
236   域中描述爲內核保留區的空間中)。內核將會發起在 ARM 文檔(編號
237   ARM DEN 0022A:用於 ARM 上的電源狀態協調接口系統軟體)中描述的
238   CPU_ON 調用來將 CPU 帶入內核。
239
240   *譯者注: ARM DEN 0022A 已更新到 ARM DEN 0022C。
241
242   設備樹必須包含一個 『psci』 節點,請參考以下文檔:
243   Documentation/devicetree/bindings/arm/psci.yaml
244
245
246 - 輔助 CPU 通用寄存器設置
247   x0 = 0 (保留,將來可能使用)
248   x1 = 0 (保留,將來可能使用)
249   x2 = 0 (保留,將來可能使用)
250   x3 = 0 (保留,將來可能使用)
251