1 Chinese translated version of Documentation/arm64/booting.txt
3 If you have any comment or update to the content, please contact the
4 original document maintainer directly. However, if you have a problem
5 communicating in English you can also ask the Chinese maintainer for
6 help. Contact the Chinese maintainer if this translation is outdated
7 or if there is a problem with the translation.
9 Maintainer: Will Deacon <will.deacon@arm.com>
10 Chinese maintainer: Fu Wei <wefu@redhat.com>
11 ---------------------------------------------------------------------
12 Documentation/arm64/booting.txt 的中文翻译
14 如果想评论或更新本文的内容,请直接联系原文档的维护者。如果你使用英文
15 交流有困难的话,也可以向中文版维护者求助。如果本翻译更新不及时或者翻
18 英文版维护者: Will Deacon <will.deacon@arm.com>
19 中文版维护者: 傅炜 Fu Wei <wefu@redhat.com>
20 中文版翻译者: 傅炜 Fu Wei <wefu@redhat.com>
21 中文版校译者: 傅炜 Fu Wei <wefu@redhat.com>
24 ---------------------------------------------------------------------
28 作者: Will Deacon <will.deacon@arm.com>
31 本文档基于 Russell King 的 ARM 启动文档,且适用于所有公开发布的
34 AArch64 异常模型由多个异常级别(EL0 - EL3)组成,对于 EL0 和 EL1
35 异常级有对应的安全和非安全模式。EL2 是系统管理级,且仅存在于
36 非安全模式下。EL3 是最高特权级,且仅存在于安全模式下。
38 基于本文档的目的,我们将简单地使用‘引导装载程序’(‘boot loader’)
39 这个术语来定义在将控制权交给 Linux 内核前 CPU 上执行的所有软件。
40 这可能包含安全监控和系统管理代码,或者它可能只是一些用于准备最小启动
43 基本上,引导装载程序(至少)应实现以下操作:
56 引导装载程序应该找到并初始化系统中所有内核用于保持系统变量数据的 RAM。
57 这个操作的执行是设备依赖的。(它可能使用内部算法来自动定位和计算所有
58 RAM,或可能使用对这个设备已知的 RAM 信息,还可能使用任何引导装载程序
67 设备树数据块(dtb)必须 8 字节对齐,并位于从内核映像起始算起第一个 512MB
68 内,且不得跨越 2MB 对齐边界。这使得内核可以通过初始页表中的单个节描述符来
77 AArch64 内核当前没有提供自解压代码,因此如果使用了压缩内核映像文件
78 (比如 Image.gz),则需要通过引导装载程序(使用 gzip 等)来进行解压。
79 若引导装载程序没有实现这个需求,就要使用非压缩内核映像文件。
87 已解压的内核映像包含一个 64 字节的头,内容如下:
89 u32 code0; /* 可执行代码 */
90 u32 code1; /* 可执行代码 */
91 u64 text_offset; /* 映像装载偏移 */
92 u64 res0 = 0; /* 保留 */
93 u64 res1 = 0; /* 保留 */
94 u64 res2 = 0; /* 保留 */
95 u64 res3 = 0; /* 保留 */
96 u64 res4 = 0; /* 保留 */
97 u32 magic = 0x644d5241; /* 魔数, 小端, "ARM\x64" */
98 u32 res5 = 0; /* 保留 */
103 - code0/code1 负责跳转到 stext.
105 映像必须位于系统 RAM 起始处的特定偏移(当前是 0x80000)。系统 RAM
110 - 停止所有 DMA 设备,这样内存数据就不会因为虚假网络包或磁盘数据而
114 x0 = 系统 RAM 中设备树数据块(dtb)的物理地址。
120 所有形式的中断必须在 PSTATE.DAIF 中被屏蔽(Debug、SError、IRQ
122 CPU 必须处于 EL2(推荐,可访问虚拟化扩展)或非安全 EL1 模式下。
131 CNTFRQ 必须设定为计时器的频率,且 CNTVOFF 必须设定为对所有 CPU
132 都一致的值。如果在 EL1 模式下进入内核,则 CNTHCTL_EL2 中的
133 EL1PCTEN (bit 0) 必须置位。
136 通过内核启动的所有 CPU 在内核入口地址上必须处于相同的一致性域中。
137 这可能要根据具体实现来定义初始化过程,以使能每个CPU上对维护操作的
141 在进入内核映像的异常级中,所有构架中可写的系统寄存器必须通过软件
142 在一个更高的异常级别下初始化,以防止在 未知 状态下运行。
144 以上对于 CPU 模式、高速缓存、MMU、架构计时器、一致性、系统寄存器的
145 必要条件描述适用于所有 CPU。所有 CPU 必须在同一异常级别跳入内核。
147 引导装载程序必须在每个 CPU 处于以下状态时跳入内核入口:
149 - 主 CPU 必须直接跳入内核映像的第一条指令。通过此 CPU 传递的设备树
150 数据块必须在每个 CPU 节点中包含一个 ‘enable-method’ 属性,所
151 支持的 enable-method 请见下文。
153 引导装载程序必须生成这些设备树属性,并在跳入内核入口之前将其插入
156 - enable-method 为 “spin-table” 的 CPU 必须在它们的 CPU
157 节点中包含一个 ‘cpu-release-addr’ 属性。这个属性标识了一个
160 这些 CPU 必须在内存保留区(通过设备树中的 /memreserve/ 域传递
161 给内核)中自旋于内核之外,轮询它们的 cpu-release-addr 位置(必须
162 包含在保留区中)。可通过插入 wfe 指令来降低忙循环开销,而主 CPU 将
163 发出 sev 指令。当对 cpu-release-addr 所指位置的读取操作返回非零值
164 时,CPU 必须跳入此值所指向的地址。此值为一个单独的 64 位小端值,
165 因此 CPU 须在跳转前将所读取的值转换为其本身的端模式。
167 - enable-method 为 “psci” 的 CPU 保持在内核外(比如,在
168 memory 节点中描述为内核空间的内存区外,或在通过设备树 /memreserve/
169 域中描述为内核保留区的空间中)。内核将会发起在 ARM 文档(编号
170 ARM DEN 0022A:用于 ARM 上的电源状态协调接口系统软件)中描述的
171 CPU_ON 调用来将 CPU 带入内核。
173 *译者注:到文档翻译时,此文档已更新为 ARM DEN 0022B。
175 设备树必须包含一个 ‘psci’ 节点,请参考以下文档:
176 Documentation/devicetree/bindings/arm/psci.txt