162306a36Sopenharmony_ciChinese translated version of Documentation/arch/arm/booting.rst
262306a36Sopenharmony_ci
362306a36Sopenharmony_ciIf you have any comment or update to the content, please contact the
462306a36Sopenharmony_cioriginal document maintainer directly.  However, if you have a problem
562306a36Sopenharmony_cicommunicating in English you can also ask the Chinese maintainer for
662306a36Sopenharmony_cihelp.  Contact the Chinese maintainer if this translation is outdated
762306a36Sopenharmony_cior if there is a problem with the translation.
862306a36Sopenharmony_ci
962306a36Sopenharmony_ciMaintainer: Russell King <linux@arm.linux.org.uk>
1062306a36Sopenharmony_ciChinese maintainer: Fu Wei <tekkamanninja@gmail.com>
1162306a36Sopenharmony_ci---------------------------------------------------------------------
1262306a36Sopenharmony_ciDocumentation/arch/arm/booting.rst 的中文翻译
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci如果想评论或更新本文的内容,请直接联系原文档的维护者。如果你使用英文
1562306a36Sopenharmony_ci交流有困难的话,也可以向中文版维护者求助。如果本翻译更新不及时或者翻
1662306a36Sopenharmony_ci译存在问题,请联系中文版维护者。
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci英文版维护者: Russell King <linux@arm.linux.org.uk>
1962306a36Sopenharmony_ci中文版维护者: 傅炜  Fu Wei <tekkamanninja@gmail.com>
2062306a36Sopenharmony_ci中文版翻译者: 傅炜  Fu Wei <tekkamanninja@gmail.com>
2162306a36Sopenharmony_ci中文版校译者: 傅炜  Fu Wei <tekkamanninja@gmail.com>
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci以下为正文
2462306a36Sopenharmony_ci---------------------------------------------------------------------
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci			启动 ARM Linux
2762306a36Sopenharmony_ci			==============
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci作者:Russell King
3062306a36Sopenharmony_ci日期:2002年5月18日
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci以下文档适用于 2.4.18-rmk6 及以上版本。
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci为了启动 ARM Linux,你需要一个引导装载程序(boot loader),
3562306a36Sopenharmony_ci它是一个在主内核启动前运行的一个小程序。引导装载程序需要初始化各种
3662306a36Sopenharmony_ci设备,并最终调用 Linux 内核,将信息传递给内核。
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci从本质上讲,引导装载程序应提供(至少)以下功能:
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci1、设置和初始化 RAM。
4162306a36Sopenharmony_ci2、初始化一个串口。
4262306a36Sopenharmony_ci3、检测机器的类型(machine type)。
4362306a36Sopenharmony_ci4、设置内核标签列表(tagged list)。
4462306a36Sopenharmony_ci5、调用内核映像。
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci1、设置和初始化 RAM
4862306a36Sopenharmony_ci-------------------
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci现有的引导加载程序:		强制
5162306a36Sopenharmony_ci新开发的引导加载程序:		强制
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci引导装载程序应该找到并初始化系统中所有内核用于保持系统变量数据的 RAM。
5462306a36Sopenharmony_ci这个操作的执行是设备依赖的。(它可能使用内部算法来自动定位和计算所有
5562306a36Sopenharmony_ciRAM,或可能使用对这个设备已知的 RAM 信息,还可能使用任何引导装载程序
5662306a36Sopenharmony_ci设计者想到的匹配方法。)
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci2、初始化一个串口
6062306a36Sopenharmony_ci-----------------------------
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci现有的引导加载程序:		可选、建议
6362306a36Sopenharmony_ci新开发的引导加载程序:		可选、建议
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ci引导加载程序应该初始化并使能一个目标板上的串口。这允许内核串口驱动
6662306a36Sopenharmony_ci自动检测哪个串口用于内核控制台。(一般用于调试或与目标板通信。)
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ci作为替代方案,引导加载程序也可以通过标签列表传递相关的'console='
6962306a36Sopenharmony_ci选项给内核以指定某个串口,而串口数据格式的选项在以下文档中描述:
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_ci       Documentation/admin-guide/kernel-parameters.rst7262306a36Sopenharmony_ci
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_ci3、检测机器类型
7562306a36Sopenharmony_ci--------------------------
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci现有的引导加载程序:		可选
7862306a36Sopenharmony_ci新开发的引导加载程序:		强制
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_ci引导加载程序应该通过某些方式检测自身所处的机器类型。这是一个硬件
8162306a36Sopenharmony_ci代码或通过查看所连接的硬件用某些算法得到,这些超出了本文档的范围。
8262306a36Sopenharmony_ci引导加载程序最终必须能提供一个 MACH_TYPE_xxx 值给内核。
8362306a36Sopenharmony_ci(详见 linux/arch/arm/tools/mach-types )。
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_ci4、设置启动数据
8662306a36Sopenharmony_ci------------------
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_ci现有的引导加载程序:		可选、强烈建议
8962306a36Sopenharmony_ci新开发的引导加载程序:		强制
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_ci引导加载程序必须提供标签列表或者 dtb 映像以传递配置数据给内核。启动
9262306a36Sopenharmony_ci数据的物理地址通过寄存器 r2 传递给内核。
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_ci4a、设置内核标签列表
9562306a36Sopenharmony_ci--------------------------------
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_cibootloader 必须创建和初始化内核标签列表。一个有效的标签列表以
9862306a36Sopenharmony_ciATAG_CORE 标签开始,并以 ATAG_NONE 标签结束。ATAG_CORE 标签可以是
9962306a36Sopenharmony_ci空的,也可以是非空。一个空 ATAG_CORE 标签其 size 域设置为
10062306a36Sopenharmony_ci‘2’(0x00000002)。ATAG_NONE 标签的 size 域必须设置为零。
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_ci在列表中可以保存任意数量的标签。对于一个重复的标签是追加到之前标签
10362306a36Sopenharmony_ci所携带的信息之后,还是会覆盖原来的信息,是未定义的。某些标签的行为
10462306a36Sopenharmony_ci是前者,其他是后者。
10562306a36Sopenharmony_ci
10662306a36Sopenharmony_cibootloader 必须传递一个系统内存的位置和最小值,以及根文件系统位置。
10762306a36Sopenharmony_ci因此,最小的标签列表如下所示:
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_ci		+-----------+
11062306a36Sopenharmony_ci基地址 ->	| ATAG_CORE |  |
11162306a36Sopenharmony_ci		+-----------+  |
11262306a36Sopenharmony_ci		| ATAG_MEM  |  | 地址增长方向
11362306a36Sopenharmony_ci		+-----------+  |
11462306a36Sopenharmony_ci		| ATAG_NONE |  |
11562306a36Sopenharmony_ci		+-----------+  v
11662306a36Sopenharmony_ci
11762306a36Sopenharmony_ci标签列表应该保存在系统的 RAM 中。
11862306a36Sopenharmony_ci
11962306a36Sopenharmony_ci标签列表必须置于内核自解压和 initrd'bootp' 程序都不会覆盖的内存区。
12062306a36Sopenharmony_ci建议放在 RAM 的头 16KiB 中。
12162306a36Sopenharmony_ci
12262306a36Sopenharmony_ci4b、设置设备树
12362306a36Sopenharmony_ci-------------------------
12462306a36Sopenharmony_ci
12562306a36Sopenharmony_cibootloader 必须以 64bit 地址对齐的形式加载一个设备树映像(dtb)到系统
12662306a36Sopenharmony_ciRAM 中,并用启动数据初始化它。dtb 格式在文档
12762306a36Sopenharmony_cihttps://www.devicetree.org/specifications/ 中。内核将会在
12862306a36Sopenharmony_cidtb 物理地址处查找 dtb 魔数值(0xd00dfeed),以确定 dtb 是否已经代替
12962306a36Sopenharmony_ci标签列表被传递进来。
13062306a36Sopenharmony_ci
13162306a36Sopenharmony_cibootloader 必须传递一个系统内存的位置和最小值,以及根文件系统位置。
13262306a36Sopenharmony_cidtb 必须置于内核自解压不会覆盖的内存区。建议将其放置于 RAM 的头 16KiB
13362306a36Sopenharmony_ci中。但是不可将其放置于“0”物理地址处,因为内核认为:r2 中为 0,意味着
13462306a36Sopenharmony_ci没有标签列表和 dtb 传递过来。
13562306a36Sopenharmony_ci
13662306a36Sopenharmony_ci5、调用内核映像
13762306a36Sopenharmony_ci---------------------------
13862306a36Sopenharmony_ci
13962306a36Sopenharmony_ci现有的引导加载程序:		强制
14062306a36Sopenharmony_ci新开发的引导加载程序:		强制
14162306a36Sopenharmony_ci
14262306a36Sopenharmony_ci调用内核映像 zImage 有两个选择。如果 zImge 保存在 flash 中,且是为了
14362306a36Sopenharmony_ci在 flash 中直接运行而被正确链接的。这样引导加载程序就可以在 flash 中
14462306a36Sopenharmony_ci直接调用 zImage。
14562306a36Sopenharmony_ci
14662306a36Sopenharmony_cizImage 也可以被放在系统 RAM(任意位置)中被调用。注意:内核使用映像
14762306a36Sopenharmony_ci基地址的前 16KB RAM 空间来保存页表。建议将映像置于 RAM 的 32KB 处。
14862306a36Sopenharmony_ci
14962306a36Sopenharmony_ci对于以上任意一种情况,都必须符合以下启动状态:
15062306a36Sopenharmony_ci
15162306a36Sopenharmony_ci- 停止所有 DMA 设备,这样内存数据就不会因为虚假网络包或磁盘数据而被破坏。
15262306a36Sopenharmony_ci  这可能可以节省你许多的调试时间。
15362306a36Sopenharmony_ci
15462306a36Sopenharmony_ci- CPU 寄存器配置
15562306a36Sopenharmony_ci  r0 = 0,
15662306a36Sopenharmony_ci  r1 = (在上面 3 中获取的)机器类型码。
15762306a36Sopenharmony_ci  r2 = 标签列表在系统 RAM 中的物理地址,或
15862306a36Sopenharmony_ci       设备树块(dtb)在系统 RAM 中的物理地址
15962306a36Sopenharmony_ci
16062306a36Sopenharmony_ci- CPU 模式
16162306a36Sopenharmony_ci  所有形式的中断必须被禁止 (IRQs 和 FIQs)
16262306a36Sopenharmony_ci  CPU 必须处于 SVC 模式。(对于 Angel 调试有特例存在)
16362306a36Sopenharmony_ci
16462306a36Sopenharmony_ci- 缓存,MMUs
16562306a36Sopenharmony_ci  MMU 必须关闭。
16662306a36Sopenharmony_ci  指令缓存开启或关闭都可以。
16762306a36Sopenharmony_ci  数据缓存必须关闭。
16862306a36Sopenharmony_ci
16962306a36Sopenharmony_ci- 引导加载程序应该通过直接跳转到内核映像的第一条指令来调用内核映像。
17062306a36Sopenharmony_ci
17162306a36Sopenharmony_ci  对于支持 ARM 指令集的 CPU,跳入内核入口时必须处在 ARM 状态,即使
17262306a36Sopenharmony_ci  对于 Thumb-2 内核也是如此。
17362306a36Sopenharmony_ci
17462306a36Sopenharmony_ci  对于仅支持 Thumb 指令集的 CPU,比如 Cortex-M 系列的 CPU,跳入
17562306a36Sopenharmony_ci  内核入口时必须处于 Thumb 状态。
176