引导 ARM Linux

本文翻译自:https://www.kernel.org/doc/html/latest/arm/booting.html

引导 ARM Linux 需要一个引导加载程序,它是一个先于内核运行的小段程序。引导加载程序被用于初始化各种设备,并最终调用 Linux 内核,同时给内核传递参数。

总之,引导加载程序需要提供一下几种功能:

  1. 设置和初始化内存
  2. 初始化一个串口
  3. 检测机器类型
  4. 设置内核标签列表
  5. 加载 initramfs
  6. 调用内核镜像

1. 设置和初始化内存

  • Existing boot loaders: MANDATORY
  • New boot loaders: MANDATORY

引导加载程序用来查询和初始化所有内存,该过程是体系结构相关的。

2. 初始化一个串口

  • Existing boot loaders: OPTIONAL, RECOMMENDED
  • New boot loaders: OPTIONAL, RECOMMENDED

引导加载程序应该在目标办上初始化和使能一个串口,这样可以使内核串口驱动自动地检测哪个串口可用于内核控制台。

另外,引导加载程序可以通过标记列表传递 'console=' 选项给内核指定端口,串口参数格式选项详见:Documentation/admin-guide/kernel-parameters.rst

3. 检测机器类型

  • Existing boot loaders: OPTIONAL
  • New boot loaders: MANDATORY except for DT-only platforms

引导加载程序需要通过一些方法来检测目标板类型,最终提供给内核一个MACH_TYPE_xxx的值给内核,该值详见:linux/arch/arm/tools/mach-types。该值需要放在寄存器 r1 中。

4. 设置引导数据

  • Existing boot loaders: OPTIONAL, HIGHLY RECOMMENDED
  • New boot loaders: MANDATORY

引导加载程序必须一个标记列表或者 dtb 镜像给内核,该引导数据的物理地址需要放置在寄存器 r2 中。

引导家在程序必须创建和初始化内核标记列表,一个有效的标记列表开始于ATAG_CORE,结束于ATAG_NONE。引导加载程序最少要传递系统内存的大小和位置以及文件系统位置。因此最小的标记列表类似于:

              +-----------+
base ->       | ATAG_CORE |  |
              +-----------+  |
              | ATAG_MEM  |  | increasing address
              +-----------+  |
              | ATAG_NONE |  |
              +-----------+  v

标记列表应该放置在系统 RAM 中,推荐放置在前 16KiB 处,以防止被内核解压缩程序覆盖掉。

5. 加载 initramfs

  • Existing boot loaders: OPTIONAL
  • New boot loaders: OPTIONAL

6. 调用内核镜像

  • Existing boot loaders: MANDATORY
  • New boot loaders: MANDATORY

调用内核镜像 zImage 有两种可能,如果 zImage 位于 flash 中,并且被正确链接,那么就可以直接在 flash 中调用 zImage。同时 zImage 也可能在 RAM 中调用,内核应该放置在内存的前 128MiB 中,推荐加载到 32MIB 之上来避免内核在解压缩之前重定位,这可以加快引导速度。

如果引导的是原生的内核,那么内核的加载位置就必须严格等于 TEXT_OFFSET - PAGE_OFFSET。

无论什么情况,以下条件必须得到满足:

  • 关闭所有 DMA 相关的设备
  • CPU 寄存器设置
    • r0 = 0
    • r1 = 机器类型码
    • r3 = 标记列表在系统内存中的物理地址
  • CPU 模式
    • 关闭所有中断
    • CPU 必须处于 SVC 模式
  • 缓存和 MMU
    • MMU 必须关闭
    • 指令缓存可以打开可以关闭
    • 数据缓存必须关闭
  • 引导加载程序应该直接跳转到内核镜像处执行第一条指令

引导 ARM Linux的更多相关文章

  1. 构建 ARM Linux 4.7.3 嵌入式开发环境 —— U-BOOT 引导 Kernel

    经过若干天的反复测试,搜索.终于成功利用 Qemu 在 u-boot 下引导 ARM Linux 4.7.3 内核.如下详细解释整个构建过程. 准备环境 运行环境:Ubuntu 16.04 需要的虚拟 ...

  2. 构建 ARM Linux 4.7.3 嵌入式开发环境 —— BusyBox 构建 RootFS

    上一篇我们已经成功将 ARM Linux 4.7.3 的内核利用 U-BOOT 引导了起来.但是细心的你会发现,引导到后面,系统无法启动,出现内核恐慌 (Kernel Panic). 原因是找不到文件 ...

  3. ARM Linux 3.x的设备树(Device Tree)

    http://blog.csdn.net/21cnbao/article/details/8457546 宋宝华 Barry Song <21cnbao@gmail.com> 1.     ...

  4. ARM Linux启动代码分析

    前言 在学习.分析之前首先要弄明白一个问题:为什么要分析启动代码? 因为启动代码绝大部分都是用汇编语言写的,对于没学过或者不熟悉汇编语言的同学确实有一定难度,但是如果你想真正深入地学习Linux,那么 ...

  5. ARM Linux 3.x的设备树(Device Tree)

    1. ARM Device Tree起源 Linus Torvalds在2011年3月17日的ARM Linux邮件列表宣称“this whole ARM thing is a f*cking pai ...

  6. ARM Linux从Bootloader、kernel到filesystem启动流程

    转自:http://www.veryarm.com/1491.html ARM Linux启动流程大致为:bootloader ---->kernel---->root filesyste ...

  7. 【转】 ARM Linux 3.x的设备树(Device Tree)

    1.    ARM Device Tree起源 http://blog.csdn.net/21cnbao/article/details/8457546 Linus Torvalds在2011年3月1 ...

  8. 【转】ARM Linux 3.x的设备树(Device Tree)

    原文网址:http://blog.csdn.net/21cnbao/article/details/8457546 1.    ARM Device Tree起源 Linus Torvalds在201 ...

  9. ARM linux内核启动时几个关键地址【转】

    转自:http://www.cnblogs.com/armlinux/archive/2011/11/06/2396787.html 1.       内核启动地址1.1.   名词解释ZTEXTAD ...

随机推荐

  1. 模板字符串原理,原生js实现字符串模板

    在使用模板字符串的时候使用的是 '{{}}'形式进行书写,本文则向各位解密这么写的原因 初体验正则 首先要先明白正则表达式中exec的使用 例如: let str = 'axu1997@qq.com' ...

  2. Java 数组 字符 函数

    一. 1. package Hello; import java.util.Scanner; public class hello_test { public static void main(Str ...

  3. Python语法元素分析

    缩进 1个缩进 = 4个空格 用以在Python中标明代码的层次关系 缩进是Python语言中表明程序框架的唯一手段 注释 注释:程序员在代码中加入的说明信息,不被计算机执行 注释的两种方法: 单行注 ...

  4. 【WPF学习】第六十五章 创建无外观控件

    用户控件的目标是提供增补控件模板的设计表面,提供一种定义控件的快速方法,代价是失去了将来的灵活性.如果喜欢用户控件的功能,但需要修改使其可视化外观,使用这种方法就有问题了.例如,设想希望使用相同的颜色 ...

  5. Python第十三章-网络编程

    网络编程 一.网络编程基础 python 的网络编程模块主要支持两种Internet协议: TCP 和 UDP. 1.1通信协议 通信协议也叫网络传输协议或简称为传送协议(Communications ...

  6. 原生的js操作实现通过对URL的监控获取参数

    原生的js操作实现通过对URL的监控获取用户的操作信息 优化网站的时候,因为列表是用vue组件进行循环渲染,就出现了一个问题,单击跳转的问题,想了很多方案,使用js函数的方式面对这种情况并不乐观,想到 ...

  7. STM32F103ZET6通用定时器

    1.通用定时器简介 通用定时器是由一个可编程预分频器驱动的16位自动装载计数器构成.通用定时器可以应用于多种场合,如测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和PWM).使用通用定时 ...

  8. Flink| 实时需要分析

    ========================实时流量统计 1. 实时热门商品HotItems 每隔 5 分钟输出最近一小时内点击量最多的前 N 个商品. 抽取出业务时间戳,告诉 Flink 框架基 ...

  9. VUE一款适用于pc平台的简单toast

    新项目要求用typescript+vue+elementui的模式来搭建pc项目,最初踩了好多坑.产品说提示不想用element-ui的提示. 打算用toast的形式.所以就自己写了一个pc的toas ...

  10. selenium 鼠标滑动操作验证码

    selenium 鼠标点击操作比较简单,这里就不介绍了,主要说一下鼠标滑动(按住并滑动),经常用于解决自动化操作的滑动验证码 下面举个简单的例子,比如这种验证码: 代码: div = driver.f ...