Merge tag 'asoc-v3.14-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie...
[sfrench/cifs-2.6.git] / Documentation / zh_CN / arm64 / booting.txt
1 Chinese translated version of Documentation/arm64/booting.txt
2
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.
8
9 Maintainer: Will Deacon <will.deacon@arm.com>
10 Chinese maintainer: Fu Wei <wefu@redhat.com>
11 ---------------------------------------------------------------------
12 Documentation/arm64/booting.txt 的中文翻译
13
14 如果想评论或更新本文的内容,请直接联系原文档的维护者。如果你使用英文
15 交流有困难的话,也可以向中文版维护者求助。如果本翻译更新不及时或者翻
16 译存在问题,请联系中文版维护者。
17
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>
22
23 以下为正文
24 ---------------------------------------------------------------------
25                         启动 AArch64 Linux
26                         ==================
27
28 作者: Will Deacon <will.deacon@arm.com>
29 日期: 2012 年 09 月 07 日
30
31 本文档基于 Russell King 的 ARM 启动文档,且适用于所有公开发布的
32 AArch64 Linux 内核代码。
33
34 AArch64 异常模型由多个异常级别(EL0 - EL3)组成,对于 EL0 和 EL1
35 异常级有对应的安全和非安全模式。EL2 是系统管理级,且仅存在于
36 非安全模式下。EL3 是最高特权级,且仅存在于安全模式下。
37
38 基于本文档的目的,我们将简单地使用‘引导装载程序’(‘boot loader’)
39 这个术语来定义在将控制权交给 Linux 内核前 CPU 上执行的所有软件。
40 这可能包含安全监控和系统管理代码,或者它可能只是一些用于准备最小启动
41 环境的指令。
42
43 基本上,引导装载程序(至少)应实现以下操作:
44
45 1、设置和初始化 RAM
46 2、设置设备树数据
47 3、解压内核映像
48 4、调用内核映像
49
50
51 1、设置和初始化 RAM
52 -----------------
53
54 必要性: 强制
55
56 引导装载程序应该找到并初始化系统中所有内核用于保持系统变量数据的 RAM。
57 这个操作的执行是设备依赖的。(它可能使用内部算法来自动定位和计算所有
58 RAM,或可能使用对这个设备已知的 RAM 信息,还可能使用任何引导装载程序
59 设计者想到的匹配方法。)
60
61
62 2、设置设备树数据
63 ---------------
64
65 必要性: 强制
66
67 设备树数据块(dtb)必须 8 字节对齐,并位于从内核映像起始算起第一个 512MB
68 内,且不得跨越 2MB 对齐边界。这使得内核可以通过初始页表中的单个节描述符来
69 映射此数据块。
70
71
72 3、解压内核映像
73 -------------
74
75 必要性: 可选
76
77 AArch64 内核当前没有提供自解压代码,因此如果使用了压缩内核映像文件
78 (比如 Image.gz),则需要通过引导装载程序(使用 gzip 等)来进行解压。
79 若引导装载程序没有实现这个需求,就要使用非压缩内核映像文件。
80
81
82 4、调用内核映像
83 -------------
84
85 必要性: 强制
86
87 已解压的内核映像包含一个 64 字节的头,内容如下:
88
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;                 /* 保留 */
99
100
101 映像头注释:
102
103 - code0/code1 负责跳转到 stext.
104
105 映像必须位于系统 RAM 起始处的特定偏移(当前是 0x80000)。系统 RAM
106 的起始地址必须是以 2MB 对齐的。
107
108 在跳转入内核前,必须符合以下状态:
109
110 - 停止所有 DMA 设备,这样内存数据就不会因为虚假网络包或磁盘数据而
111   被破坏。这可能可以节省你许多的调试时间。
112
113 - 主 CPU 通用寄存器设置
114   x0 = 系统 RAM 中设备树数据块(dtb)的物理地址。
115   x1 = 0 (保留,将来可能使用)
116   x2 = 0 (保留,将来可能使用)
117   x3 = 0 (保留,将来可能使用)
118
119 - CPU 模式
120   所有形式的中断必须在 PSTATE.DAIF 中被屏蔽(Debug、SError、IRQ
121   和 FIQ)。
122   CPU 必须处于 EL2(推荐,可访问虚拟化扩展)或非安全 EL1 模式下。
123
124 - 高速缓存、MMU
125   MMU 必须关闭。
126   指令缓存开启或关闭都可以。
127   数据缓存必须关闭且无效。
128   外部高速缓存(如果存在)必须配置并禁用。
129
130 - 架构计时器
131   CNTFRQ 必须设定为计时器的频率,且 CNTVOFF 必须设定为对所有 CPU
132   都一致的值。如果在 EL1 模式下进入内核,则 CNTHCTL_EL2 中的
133   EL1PCTEN (bit 0) 必须置位。
134
135 - 一致性
136   通过内核启动的所有 CPU 在内核入口地址上必须处于相同的一致性域中。
137   这可能要根据具体实现来定义初始化过程,以使能每个CPU上对维护操作的
138   接收。
139
140 - 系统寄存器
141   在进入内核映像的异常级中,所有构架中可写的系统寄存器必须通过软件
142   在一个更高的异常级别下初始化,以防止在 未知 状态下运行。
143
144 以上对于 CPU 模式、高速缓存、MMU、架构计时器、一致性、系统寄存器的
145 必要条件描述适用于所有 CPU。所有 CPU 必须在同一异常级别跳入内核。
146
147 引导装载程序必须在每个 CPU 处于以下状态时跳入内核入口:
148
149 - 主 CPU 必须直接跳入内核映像的第一条指令。通过此 CPU 传递的设备树
150   数据块必须在每个 CPU 节点中包含一个 ‘enable-method’ 属性,所
151   支持的 enable-method 请见下文。
152
153   引导装载程序必须生成这些设备树属性,并在跳入内核入口之前将其插入
154   数据块。
155
156 - enable-method 为 “spin-table” 的 CPU 必须在它们的 CPU
157   节点中包含一个 ‘cpu-release-addr’ 属性。这个属性标识了一个
158   64 位自然对齐且初始化为零的内存位置。
159
160   这些 CPU 必须在内存保留区(通过设备树中的 /memreserve/ 域传递
161   给内核)中自旋于内核之外,轮询它们的 cpu-release-addr 位置(必须
162   包含在保留区中)。可通过插入 wfe 指令来降低忙循环开销,而主 CPU 将
163   发出 sev 指令。当对 cpu-release-addr 所指位置的读取操作返回非零值
164   时,CPU 必须跳入此值所指向的地址。此值为一个单独的 64 位小端值,
165   因此 CPU 须在跳转前将所读取的值转换为其本身的端模式。
166
167 - enable-method 为 “psci” 的 CPU 保持在内核外(比如,在
168   memory 节点中描述为内核空间的内存区外,或在通过设备树 /memreserve/
169   域中描述为内核保留区的空间中)。内核将会发起在 ARM 文档(编号
170   ARM DEN 0022A:用于 ARM 上的电源状态协调接口系统软件)中描述的
171   CPU_ON 调用来将 CPU 带入内核。
172
173   *译者注:到文档翻译时,此文档已更新为 ARM DEN 0022B。
174
175   设备树必须包含一个 ‘psci’ 节点,请参考以下文档:
176   Documentation/devicetree/bindings/arm/psci.txt
177
178
179 - 辅助 CPU 通用寄存器设置
180   x0 = 0 (保留,将来可能使用)
181   x1 = 0 (保留,将来可能使用)
182   x2 = 0 (保留,将来可能使用)
183   x3 = 0 (保留,将来可能使用)