引导 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. jmeter参数化之函数助手(十五)

    jmeter-参数化: 参数化的作用:调用接口入参时.有时要求参数经常变化,如果每次去修改就会变得很繁琐,这时候就需要把经常变化的值改变为提前编辑好的文档或函数中,便于调用时使用不同的值. Jmete ...

  2. C++最简打开网页的方法

    system("explorer https://pay.747fz.com");

  3. 图的深度优先搜索dfs

    图的深度优先搜索: 1.将最初访问的顶点压入栈: 2.只要栈中仍有顶点,就循环进行下述操作: (1)访问栈顶部的顶点u: (2)从当前访问的顶点u 移动至顶点v 时,将v 压入栈.如果当前顶点u 不存 ...

  4. 什么情况下JVM内存中的一个对象会被垃圾回收?

    新生代满了会触发 Young GC,老年代满了会触发 Old GC.GC时会回收对象,那么具体是什么样的对象会被垃圾回收器回收呢? 可达性分析算法,判断是否被 GC Roots 引用 判断引用类型:强 ...

  5. EOS基础全家桶(五)钱包管理

    简介 本篇我们将会学习EOS自带的命令行钱包的使用方法,我们将会使用cleos来控制keosd服务对本地钱包进行管理. 虽然现在市面上已经有很多支持EOS的钱包了,有Web钱包,有app钱包,还有浏览 ...

  6. .Net 微服务架构技术栈的那些事

    一.前言 大家一直都在谈论微服务架构,园子里面也有很多关于微服务的文章,前几天也有一些园子的朋友问我微服务架构的一些技术,我这里就整理了微服务架构的技术栈路线图,这里就分享出来和大家一起探讨学习,同时 ...

  7. CentOS 6.5 nginx+tomcat+ssl配置

    本文档用于指导在CentOS 6.5下使用nginx反向代理tomcat,并在nginx端支持ssl. 安装nginx.参见CentOS 6 nginx安装. SSL证书申请.参见腾讯SSL证书申请和 ...

  8. Flutter AbsorbPointer 与 IgnorePointer的区别

    AbsorbPointer AbsorbPointer是一种禁止用户输入的控件,比如按钮的点击.输入框的输入.ListView的滚动等,你可能说将按钮的onPressed设置为null,一样也可以实现 ...

  9. 个人hexo博客(静态,无后台)搭建

    博客搭建 1.工具安装 安装Node.js,其中包含Node.js和npm(包管理器) 利用npm安装cnpm(淘宝的npm,速度在国内更快) npm install -g cnpm --regist ...

  10. Java调用ARM模板执行Azure Rest建立VM过程

    Azure Resource Manager 提供一致的管理层,用于管理通过 Azure PowerShell.Azure CLI.Azure 门户.REST API 和开发工具执行的任务,所有工具使 ...