0001 Chinese translated version of Documentation/arm/booting.rst
0002
0003 If you have any comment or update to the content, please contact the
0004 original document maintainer directly. However, if you have a problem
0005 communicating in English you can also ask the Chinese maintainer for
0006 help. Contact the Chinese maintainer if this translation is outdated
0007 or if there is a problem with the translation.
0008
0009 Maintainer: Russell King <linux@arm.linux.org.uk>
0010 Chinese maintainer: Fu Wei <tekkamanninja@gmail.com>
0011 ---------------------------------------------------------------------
0012 Documentation/arm/booting.rst 的中文翻译
0013
0014 如果想评论或更新本文的内容,请直接联系原文档的维护者。如果你使用英文
0015 交流有困难的话,也可以向中文版维护者求助。如果本翻译更新不及时或者翻
0016 译存在问题,请联系中文版维护者。
0017
0018 英文版维护者: Russell King <linux@arm.linux.org.uk>
0019 中文版维护者: 傅炜 Fu Wei <tekkamanninja@gmail.com>
0020 中文版翻译者: 傅炜 Fu Wei <tekkamanninja@gmail.com>
0021 中文版校译者: 傅炜 Fu Wei <tekkamanninja@gmail.com>
0022
0023 以下为正文
0024 ---------------------------------------------------------------------
0025
0026 启动 ARM Linux
0027 ==============
0028
0029 作者:Russell King
0030 日期:2002年5月18日
0031
0032 以下文档适用于 2.4.18-rmk6 及以上版本。
0033
0034 为了启动 ARM Linux,你需要一个引导装载程序(boot loader),
0035 它是一个在主内核启动前运行的一个小程序。引导装载程序需要初始化各种
0036 设备,并最终调用 Linux 内核,将信息传递给内核。
0037
0038 从本质上讲,引导装载程序应提供(至少)以下功能:
0039
0040 1、设置和初始化 RAM。
0041 2、初始化一个串口。
0042 3、检测机器的类型(machine type)。
0043 4、设置内核标签列表(tagged list)。
0044 5、调用内核映像。
0045
0046
0047 1、设置和初始化 RAM
0048 -------------------
0049
0050 现有的引导加载程序: 强制
0051 新开发的引导加载程序: 强制
0052
0053 引导装载程序应该找到并初始化系统中所有内核用于保持系统变量数据的 RAM。
0054 这个操作的执行是设备依赖的。(它可能使用内部算法来自动定位和计算所有
0055 RAM,或可能使用对这个设备已知的 RAM 信息,还可能使用任何引导装载程序
0056 设计者想到的匹配方法。)
0057
0058
0059 2、初始化一个串口
0060 -----------------------------
0061
0062 现有的引导加载程序: 可选、建议
0063 新开发的引导加载程序: 可选、建议
0064
0065 引导加载程序应该初始化并使能一个目标板上的串口。这允许内核串口驱动
0066 自动检测哪个串口用于内核控制台。(一般用于调试或与目标板通信。)
0067
0068 作为替代方案,引导加载程序也可以通过标签列表传递相关的'console='
0069 选项给内核以指定某个串口,而串口数据格式的选项在以下文档中描述:
0070
0071 Documentation/admin-guide/kernel-parameters.rst。
0072
0073
0074 3、检测机器类型
0075 --------------------------
0076
0077 现有的引导加载程序: 可选
0078 新开发的引导加载程序: 强制
0079
0080 引导加载程序应该通过某些方式检测自身所处的机器类型。这是一个硬件
0081 代码或通过查看所连接的硬件用某些算法得到,这些超出了本文档的范围。
0082 引导加载程序最终必须能提供一个 MACH_TYPE_xxx 值给内核。
0083 (详见 linux/arch/arm/tools/mach-types )。
0084
0085 4、设置启动数据
0086 ------------------
0087
0088 现有的引导加载程序: 可选、强烈建议
0089 新开发的引导加载程序: 强制
0090
0091 引导加载程序必须提供标签列表或者 dtb 映像以传递配置数据给内核。启动
0092 数据的物理地址通过寄存器 r2 传递给内核。
0093
0094 4a、设置内核标签列表
0095 --------------------------------
0096
0097 bootloader 必须创建和初始化内核标签列表。一个有效的标签列表以
0098 ATAG_CORE 标签开始,并以 ATAG_NONE 标签结束。ATAG_CORE 标签可以是
0099 空的,也可以是非空。一个空 ATAG_CORE 标签其 size 域设置为
0100 ‘2’(0x00000002)。ATAG_NONE 标签的 size 域必须设置为零。
0101
0102 在列表中可以保存任意数量的标签。对于一个重复的标签是追加到之前标签
0103 所携带的信息之后,还是会覆盖原来的信息,是未定义的。某些标签的行为
0104 是前者,其他是后者。
0105
0106 bootloader 必须传递一个系统内存的位置和最小值,以及根文件系统位置。
0107 因此,最小的标签列表如下所示:
0108
0109 +-----------+
0110 基地址 -> | ATAG_CORE | |
0111 +-----------+ |
0112 | ATAG_MEM | | 地址增长方向
0113 +-----------+ |
0114 | ATAG_NONE | |
0115 +-----------+ v
0116
0117 标签列表应该保存在系统的 RAM 中。
0118
0119 标签列表必须置于内核自解压和 initrd'bootp' 程序都不会覆盖的内存区。
0120 建议放在 RAM 的头 16KiB 中。
0121
0122 4b、设置设备树
0123 -------------------------
0124
0125 bootloader 必须以 64bit 地址对齐的形式加载一个设备树映像(dtb)到系统
0126 RAM 中,并用启动数据初始化它。dtb 格式在文档
0127 https://www.devicetree.org/specifications/ 中。内核将会在
0128 dtb 物理地址处查找 dtb 魔数值(0xd00dfeed),以确定 dtb 是否已经代替
0129 标签列表被传递进来。
0130
0131 bootloader 必须传递一个系统内存的位置和最小值,以及根文件系统位置。
0132 dtb 必须置于内核自解压不会覆盖的内存区。建议将其放置于 RAM 的头 16KiB
0133 中。但是不可将其放置于“0”物理地址处,因为内核认为:r2 中为 0,意味着
0134 没有标签列表和 dtb 传递过来。
0135
0136 5、调用内核映像
0137 ---------------------------
0138
0139 现有的引导加载程序: 强制
0140 新开发的引导加载程序: 强制
0141
0142 调用内核映像 zImage 有两个选择。如果 zImge 保存在 flash 中,且是为了
0143 在 flash 中直接运行而被正确链接的。这样引导加载程序就可以在 flash 中
0144 直接调用 zImage。
0145
0146 zImage 也可以被放在系统 RAM(任意位置)中被调用。注意:内核使用映像
0147 基地址的前 16KB RAM 空间来保存页表。建议将映像置于 RAM 的 32KB 处。
0148
0149 对于以上任意一种情况,都必须符合以下启动状态:
0150
0151 - 停止所有 DMA 设备,这样内存数据就不会因为虚假网络包或磁盘数据而被破坏。
0152 这可能可以节省你许多的调试时间。
0153
0154 - CPU 寄存器配置
0155 r0 = 0,
0156 r1 = (在上面 3 中获取的)机器类型码。
0157 r2 = 标签列表在系统 RAM 中的物理地址,或
0158 设备树块(dtb)在系统 RAM 中的物理地址
0159
0160 - CPU 模式
0161 所有形式的中断必须被禁止 (IRQs 和 FIQs)
0162 CPU 必须处于 SVC 模式。(对于 Angel 调试有特例存在)
0163
0164 - 缓存,MMUs
0165 MMU 必须关闭。
0166 指令缓存开启或关闭都可以。
0167 数据缓存必须关闭。
0168
0169 - 引导加载程序应该通过直接跳转到内核映像的第一条指令来调用内核映像。
0170
0171 对于支持 ARM 指令集的 CPU,跳入内核入口时必须处在 ARM 状态,即使
0172 对于 Thumb-2 内核也是如此。
0173
0174 对于仅支持 Thumb 指令集的 CPU,比如 Cortex-M 系列的 CPU,跳入
0175 内核入口时必须处于 Thumb 状态。