About Kernel Documentation Linux Kernel Contact Linux Resources Linux Blog

Documentation / zh_CN / arm64 / booting.txt




Custom Search

Based on kernel version 4.1. Page generated on 2015-06-28 12:15 EST.

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

Information is copyright its respective author. All material is available from the Linux Kernel Source distributed under a GPL License. This page is provided as a free service by mjmwired.net.