xref: /linux/Documentation/translations/zh_CN/arch/arm64/booting.txt (revision cdd5b5a9761fd66d17586e4f4ba6588c70e640ea)
1*e4624435SJonathan CorbetChinese translated version of Documentation/arch/arm64/booting.rst
2*e4624435SJonathan Corbet
3*e4624435SJonathan CorbetIf you have any comment or update to the content, please contact the
4*e4624435SJonathan Corbetoriginal document maintainer directly.  However, if you have a problem
5*e4624435SJonathan Corbetcommunicating in English you can also ask the Chinese maintainer for
6*e4624435SJonathan Corbethelp.  Contact the Chinese maintainer if this translation is outdated
7*e4624435SJonathan Corbetor if there is a problem with the translation.
8*e4624435SJonathan Corbet
9*e4624435SJonathan CorbetM:	Will Deacon <will.deacon@arm.com>
10*e4624435SJonathan Corbetzh_CN:	Fu Wei <wefu@redhat.com>
11*e4624435SJonathan CorbetC:	55f058e7574c3615dea4615573a19bdb258696c6
12*e4624435SJonathan Corbet---------------------------------------------------------------------
13*e4624435SJonathan CorbetDocumentation/arch/arm64/booting.rst 的中文翻译
14*e4624435SJonathan Corbet
15*e4624435SJonathan Corbet如果想评论或更新本文的内容,请直接联系原文档的维护者。如果你使用英文
16*e4624435SJonathan Corbet交流有困难的话,也可以向中文版维护者求助。如果本翻译更新不及时或者翻
17*e4624435SJonathan Corbet译存在问题,请联系中文版维护者。
18*e4624435SJonathan Corbet
19*e4624435SJonathan Corbet英文版维护者: Will Deacon <will.deacon@arm.com>
20*e4624435SJonathan Corbet中文版维护者: 傅炜  Fu Wei <wefu@redhat.com>
21*e4624435SJonathan Corbet中文版翻译者: 傅炜  Fu Wei <wefu@redhat.com>
22*e4624435SJonathan Corbet中文版校译者: 傅炜  Fu Wei <wefu@redhat.com>
23*e4624435SJonathan Corbet本文翻译提交时的 Git 检出点为: 55f058e7574c3615dea4615573a19bdb258696c6
24*e4624435SJonathan Corbet
25*e4624435SJonathan Corbet以下为正文
26*e4624435SJonathan Corbet---------------------------------------------------------------------
27*e4624435SJonathan Corbet			启动 AArch64 Linux
28*e4624435SJonathan Corbet			==================
29*e4624435SJonathan Corbet
30*e4624435SJonathan Corbet作者: Will Deacon <will.deacon@arm.com>
31*e4624435SJonathan Corbet日期: 2012 年 09 月 07 日
32*e4624435SJonathan Corbet
33*e4624435SJonathan Corbet本文档基于 Russell King 的 ARM 启动文档,且适用于所有公开发布的
34*e4624435SJonathan CorbetAArch64 Linux 内核代码。
35*e4624435SJonathan Corbet
36*e4624435SJonathan CorbetAArch64 异常模型由多个异常级(EL0 - EL3)组成,对于 EL0 和 EL1 异常级
37*e4624435SJonathan Corbet有对应的安全和非安全模式。EL2 是系统管理级,且仅存在于非安全模式下。
38*e4624435SJonathan CorbetEL3 是最高特权级,且仅存在于安全模式下。
39*e4624435SJonathan Corbet
40*e4624435SJonathan Corbet基于本文档的目的,我们将简单地使用‘引导装载程序’(‘boot loader’)
41*e4624435SJonathan Corbet这个术语来定义在将控制权交给 Linux 内核前 CPU 上执行的所有软件。
42*e4624435SJonathan Corbet这可能包含安全监控和系统管理代码,或者它可能只是一些用于准备最小启动
43*e4624435SJonathan Corbet环境的指令。
44*e4624435SJonathan Corbet
45*e4624435SJonathan Corbet基本上,引导装载程序(至少)应实现以下操作:
46*e4624435SJonathan Corbet
47*e4624435SJonathan Corbet1、设置和初始化 RAM
48*e4624435SJonathan Corbet2、设置设备树数据
49*e4624435SJonathan Corbet3、解压内核映像
50*e4624435SJonathan Corbet4、调用内核映像
51*e4624435SJonathan Corbet
52*e4624435SJonathan Corbet
53*e4624435SJonathan Corbet1、设置和初始化 RAM
54*e4624435SJonathan Corbet-----------------
55*e4624435SJonathan Corbet
56*e4624435SJonathan Corbet必要性: 强制
57*e4624435SJonathan Corbet
58*e4624435SJonathan Corbet引导装载程序应该找到并初始化系统中所有内核用于保持系统变量数据的 RAM。
59*e4624435SJonathan Corbet这个操作的执行方式因设备而异。(它可能使用内部算法来自动定位和计算所有
60*e4624435SJonathan CorbetRAM,或可能使用对这个设备已知的 RAM 信息,还可能是引导装载程序设计者
61*e4624435SJonathan Corbet想到的任何合适的方法。)
62*e4624435SJonathan Corbet
63*e4624435SJonathan Corbet
64*e4624435SJonathan Corbet2、设置设备树数据
65*e4624435SJonathan Corbet---------------
66*e4624435SJonathan Corbet
67*e4624435SJonathan Corbet必要性: 强制
68*e4624435SJonathan Corbet
69*e4624435SJonathan Corbet设备树数据块(dtb)必须 8 字节对齐,且大小不能超过 2MB。由于设备树
70*e4624435SJonathan Corbet数据块将在使能缓存的情况下以 2MB 粒度被映射,故其不能被置于必须以特定
71*e4624435SJonathan Corbet属性映射的2M区域内。
72*e4624435SJonathan Corbet
73*e4624435SJonathan Corbet注: v4.2 之前的版本同时要求设备树数据块被置于从内核映像以下
74*e4624435SJonathan Corbettext_offset 字节处算起第一个 512MB 内。
75*e4624435SJonathan Corbet
76*e4624435SJonathan Corbet3、解压内核映像
77*e4624435SJonathan Corbet-------------
78*e4624435SJonathan Corbet
79*e4624435SJonathan Corbet必要性: 可选
80*e4624435SJonathan Corbet
81*e4624435SJonathan CorbetAArch64 内核当前没有提供自解压代码,因此如果使用了压缩内核映像文件
82*e4624435SJonathan Corbet(比如 Image.gz),则需要通过引导装载程序(使用 gzip 等)来进行解压。
83*e4624435SJonathan Corbet若引导装载程序没有实现这个功能,就要使用非压缩内核映像文件。
84*e4624435SJonathan Corbet
85*e4624435SJonathan Corbet
86*e4624435SJonathan Corbet4、调用内核映像
87*e4624435SJonathan Corbet-------------
88*e4624435SJonathan Corbet
89*e4624435SJonathan Corbet必要性: 强制
90*e4624435SJonathan Corbet
91*e4624435SJonathan Corbet已解压的内核映像包含一个 64 字节的头,内容如下:
92*e4624435SJonathan Corbet
93*e4624435SJonathan Corbet  u32 code0;			/* 可执行代码 */
94*e4624435SJonathan Corbet  u32 code1;			/* 可执行代码 */
95*e4624435SJonathan Corbet  u64 text_offset;		/* 映像装载偏移,小端模式 */
96*e4624435SJonathan Corbet  u64 image_size;		/* 映像实际大小, 小端模式 */
97*e4624435SJonathan Corbet  u64 flags;			/* 内核旗标, 小端模式 *
98*e4624435SJonathan Corbet  u64 res2	= 0;		/* 保留 */
99*e4624435SJonathan Corbet  u64 res3	= 0;		/* 保留 */
100*e4624435SJonathan Corbet  u64 res4	= 0;		/* 保留 */
101*e4624435SJonathan Corbet  u32 magic	= 0x644d5241;	/* 魔数, 小端, "ARM\x64" */
102*e4624435SJonathan Corbet  u32 res5;			/* 保留 (用于 PE COFF 偏移) */
103*e4624435SJonathan Corbet
104*e4624435SJonathan Corbet
105*e4624435SJonathan Corbet映像头注释:
106*e4624435SJonathan Corbet
107*e4624435SJonathan Corbet- 自 v3.17 起,除非另有说明,所有域都是小端模式。
108*e4624435SJonathan Corbet
109*e4624435SJonathan Corbet- code0/code1 负责跳转到 stext.
110*e4624435SJonathan Corbet
111*e4624435SJonathan Corbet- 当通过 EFI 启动时, 最初 code0/code1 被跳过。
112*e4624435SJonathan Corbet  res5 是到 PE 文件头的偏移,而 PE 文件头含有 EFI 的启动入口点
113*e4624435SJonathan Corbet  (efi_stub_entry)。当 stub 代码完成了它的使命,它会跳转到 code0
114*e4624435SJonathan Corbet  继续正常的启动流程。
115*e4624435SJonathan Corbet
116*e4624435SJonathan Corbet- v3.17 之前,未明确指定 text_offset 的字节序。此时,image_size 为零,
117*e4624435SJonathan Corbet  且 text_offset 依照内核字节序为 0x80000。
118*e4624435SJonathan Corbet  当 image_size 非零,text_offset 为小端模式且是有效值,应被引导加载
119*e4624435SJonathan Corbet  程序使用。当 image_size 为零,text_offset 可假定为 0x80000。
120*e4624435SJonathan Corbet
121*e4624435SJonathan Corbet- flags 域 (v3.17 引入) 为 64 位小端模式,其编码如下:
122*e4624435SJonathan Corbet  位 0: 	内核字节序。 1 表示大端模式,0 表示小端模式。
123*e4624435SJonathan Corbet  位 1-2:	内核页大小。
124*e4624435SJonathan Corbet			0 - 未指定。
125*e4624435SJonathan Corbet			1 - 4K
126*e4624435SJonathan Corbet			2 - 16K
127*e4624435SJonathan Corbet			3 - 64K
128*e4624435SJonathan Corbet  位 3:		内核物理位置
129*e4624435SJonathan Corbet			0 - 2MB 对齐基址应尽量靠近内存起始处,因为
130*e4624435SJonathan Corbet			    其基址以下的内存无法通过线性映射访问
131*e4624435SJonathan Corbet			1 - 2MB 对齐基址可以在物理内存的任意位置
132*e4624435SJonathan Corbet  位 4-63:	保留。
133*e4624435SJonathan Corbet
134*e4624435SJonathan Corbet- 当 image_size 为零时,引导装载程序应试图在内核映像末尾之后尽可能
135*e4624435SJonathan Corbet  多地保留空闲内存供内核直接使用。对内存空间的需求量因所选定的内核
136*e4624435SJonathan Corbet  特性而异, 并无实际限制。
137*e4624435SJonathan Corbet
138*e4624435SJonathan Corbet内核映像必须被放置在任意一个可用系统内存 2MB 对齐基址的 text_offset
139*e4624435SJonathan Corbet字节处,并从该处被调用。2MB 对齐基址和内核映像起始地址之间的区域对于
140*e4624435SJonathan Corbet内核来说没有特殊意义,且可能被用于其他目的。
141*e4624435SJonathan Corbet从映像起始地址算起,最少必须准备 image_size 字节的空闲内存供内核使用。
142*e4624435SJonathan Corbet注: v4.6 之前的版本无法使用内核映像物理偏移以下的内存,所以当时建议
143*e4624435SJonathan Corbet将映像尽量放置在靠近系统内存起始的地方。
144*e4624435SJonathan Corbet
145*e4624435SJonathan Corbet任何提供给内核的内存(甚至在映像起始地址之前),若未从内核中标记为保留
146*e4624435SJonathan Corbet(如在设备树(dtb)的 memreserve 区域),都将被认为对内核是可用。
147*e4624435SJonathan Corbet
148*e4624435SJonathan Corbet在跳转入内核前,必须符合以下状态:
149*e4624435SJonathan Corbet
150*e4624435SJonathan Corbet- 停止所有 DMA 设备,这样内存数据就不会因为虚假网络包或磁盘数据而
151*e4624435SJonathan Corbet  被破坏。这可能可以节省你许多的调试时间。
152*e4624435SJonathan Corbet
153*e4624435SJonathan Corbet- 主 CPU 通用寄存器设置
154*e4624435SJonathan Corbet  x0 = 系统 RAM 中设备树数据块(dtb)的物理地址。
155*e4624435SJonathan Corbet  x1 = 0 (保留,将来可能使用)
156*e4624435SJonathan Corbet  x2 = 0 (保留,将来可能使用)
157*e4624435SJonathan Corbet  x3 = 0 (保留,将来可能使用)
158*e4624435SJonathan Corbet
159*e4624435SJonathan Corbet- CPU 模式
160*e4624435SJonathan Corbet  所有形式的中断必须在 PSTATE.DAIF 中被屏蔽(Debug、SError、IRQ
161*e4624435SJonathan Corbet  和 FIQ)。
162*e4624435SJonathan Corbet  CPU 必须处于 EL2(推荐,可访问虚拟化扩展)或非安全 EL1 模式下。
163*e4624435SJonathan Corbet
164*e4624435SJonathan Corbet- 高速缓存、MMU
165*e4624435SJonathan Corbet  MMU 必须关闭。
166*e4624435SJonathan Corbet  指令缓存开启或关闭皆可。
167*e4624435SJonathan Corbet  已载入的内核映像的相应内存区必须被清理,以达到缓存一致性点(PoC)。
168*e4624435SJonathan Corbet  当存在系统缓存或其他使能缓存的一致性主控器时,通常需使用虚拟地址
169*e4624435SJonathan Corbet  维护其缓存,而非 set/way 操作。
170*e4624435SJonathan Corbet  遵从通过虚拟地址操作维护构架缓存的系统缓存必须被配置,并可以被使能。
171*e4624435SJonathan Corbet  而不通过虚拟地址操作维护构架缓存的系统缓存(不推荐),必须被配置且
172*e4624435SJonathan Corbet  禁用。
173*e4624435SJonathan Corbet
174*e4624435SJonathan Corbet  *译者注:对于 PoC 以及缓存相关内容,请参考 ARMv8 构架参考手册
175*e4624435SJonathan Corbet   ARM DDI 0487A
176*e4624435SJonathan Corbet
177*e4624435SJonathan Corbet- 架构计时器
178*e4624435SJonathan Corbet  CNTFRQ 必须设定为计时器的频率,且 CNTVOFF 必须设定为对所有 CPU
179*e4624435SJonathan Corbet  都一致的值。如果在 EL1 模式下进入内核,则 CNTHCTL_EL2 中的
180*e4624435SJonathan Corbet  EL1PCTEN (bit 0) 必须置位。
181*e4624435SJonathan Corbet
182*e4624435SJonathan Corbet- 一致性
183*e4624435SJonathan Corbet  通过内核启动的所有 CPU 在内核入口地址上必须处于相同的一致性域中。
184*e4624435SJonathan Corbet  这可能要根据具体实现来定义初始化过程,以使能每个CPU上对维护操作的
185*e4624435SJonathan Corbet  接收。
186*e4624435SJonathan Corbet
187*e4624435SJonathan Corbet- 系统寄存器
188*e4624435SJonathan Corbet  在进入内核映像的异常级中,所有构架中可写的系统寄存器必须通过软件
189*e4624435SJonathan Corbet  在一个更高的异常级别下初始化,以防止在 未知 状态下运行。
190*e4624435SJonathan Corbet
191*e4624435SJonathan Corbet  对于拥有 GICv3 中断控制器并以 v3 模式运行的系统:
192*e4624435SJonathan Corbet  - 如果 EL3 存在:
193*e4624435SJonathan Corbet    ICC_SRE_EL3.Enable (位 3) 必须初始化为 0b1。
194*e4624435SJonathan Corbet    ICC_SRE_EL3.SRE (位 0) 必须初始化为 0b1。
195*e4624435SJonathan Corbet  - 若内核运行在 EL1:
196*e4624435SJonathan Corbet    ICC_SRE_EL2.Enable (位 3) 必须初始化为 0b1。
197*e4624435SJonathan Corbet    ICC_SRE_EL2.SRE (位 0) 必须初始化为 0b1。
198*e4624435SJonathan Corbet  - 设备树(DT)或 ACPI 表必须描述一个 GICv3 中断控制器。
199*e4624435SJonathan Corbet
200*e4624435SJonathan Corbet  对于拥有 GICv3 中断控制器并以兼容(v2)模式运行的系统:
201*e4624435SJonathan Corbet  - 如果 EL3 存在:
202*e4624435SJonathan Corbet    ICC_SRE_EL3.SRE (位 0) 必须初始化为 0b0。
203*e4624435SJonathan Corbet  - 若内核运行在 EL1:
204*e4624435SJonathan Corbet    ICC_SRE_EL2.SRE (位 0) 必须初始化为 0b0。
205*e4624435SJonathan Corbet  - 设备树(DT)或 ACPI 表必须描述一个 GICv2 中断控制器。
206*e4624435SJonathan Corbet
207*e4624435SJonathan Corbet以上对于 CPU 模式、高速缓存、MMU、架构计时器、一致性、系统寄存器的
208*e4624435SJonathan Corbet必要条件描述适用于所有 CPU。所有 CPU 必须在同一异常级别跳入内核。
209*e4624435SJonathan Corbet
210*e4624435SJonathan Corbet引导装载程序必须在每个 CPU 处于以下状态时跳入内核入口:
211*e4624435SJonathan Corbet
212*e4624435SJonathan Corbet- 主 CPU 必须直接跳入内核映像的第一条指令。通过此 CPU 传递的设备树
213*e4624435SJonathan Corbet  数据块必须在每个 CPU 节点中包含一个 ‘enable-method’ 属性,所
214*e4624435SJonathan Corbet  支持的 enable-method 请见下文。
215*e4624435SJonathan Corbet
216*e4624435SJonathan Corbet  引导装载程序必须生成这些设备树属性,并在跳入内核入口之前将其插入
217*e4624435SJonathan Corbet  数据块。
218*e4624435SJonathan Corbet
219*e4624435SJonathan Corbet- enable-method 为 “spin-table” 的 CPU 必须在它们的 CPU
220*e4624435SJonathan Corbet  节点中包含一个 ‘cpu-release-addr’ 属性。这个属性标识了一个
221*e4624435SJonathan Corbet  64 位自然对齐且初始化为零的内存位置。
222*e4624435SJonathan Corbet
223*e4624435SJonathan Corbet  这些 CPU 必须在内存保留区(通过设备树中的 /memreserve/ 域传递
224*e4624435SJonathan Corbet  给内核)中自旋于内核之外,轮询它们的 cpu-release-addr 位置(必须
225*e4624435SJonathan Corbet  包含在保留区中)。可通过插入 wfe 指令来降低忙循环开销,而主 CPU 将
226*e4624435SJonathan Corbet  发出 sev 指令。当对 cpu-release-addr 所指位置的读取操作返回非零值
227*e4624435SJonathan Corbet  时,CPU 必须跳入此值所指向的地址。此值为一个单独的 64 位小端值,
228*e4624435SJonathan Corbet  因此 CPU 须在跳转前将所读取的值转换为其本身的端模式。
229*e4624435SJonathan Corbet
230*e4624435SJonathan Corbet- enable-method 为 “psci” 的 CPU 保持在内核外(比如,在
231*e4624435SJonathan Corbet  memory 节点中描述为内核空间的内存区外,或在通过设备树 /memreserve/
232*e4624435SJonathan Corbet  域中描述为内核保留区的空间中)。内核将会发起在 ARM 文档(编号
233*e4624435SJonathan Corbet  ARM DEN 0022A:用于 ARM 上的电源状态协调接口系统软件)中描述的
234*e4624435SJonathan Corbet  CPU_ON 调用来将 CPU 带入内核。
235*e4624435SJonathan Corbet
236*e4624435SJonathan Corbet  *译者注: ARM DEN 0022A 已更新到 ARM DEN 0022C。
237*e4624435SJonathan Corbet
238*e4624435SJonathan Corbet  设备树必须包含一个 ‘psci’ 节点,请参考以下文档:
239*e4624435SJonathan Corbet  Documentation/devicetree/bindings/arm/psci.yaml
240*e4624435SJonathan Corbet
241*e4624435SJonathan Corbet
242*e4624435SJonathan Corbet- 辅助 CPU 通用寄存器设置
243*e4624435SJonathan Corbet  x0 = 0 (保留,将来可能使用)
244*e4624435SJonathan Corbet  x1 = 0 (保留,将来可能使用)
245*e4624435SJonathan Corbet  x2 = 0 (保留,将来可能使用)
246*e4624435SJonathan Corbet  x3 = 0 (保留,将来可能使用)
247