引导 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. 技术大佬:我去,你竟然还在用 try–catch-finally

    二哥,你之前那篇 我去 switch的文章也特么太有趣了,读完后意犹未尽啊,要不要再写一篇啊?虽然用的是 Java 13 的语法,对旧版本不太友好.但谁能保证 Java 不会再来一次重大更新呢,就像 ...

  2. coding++:快速构建 kindeditor 富文本编辑器(一)

    此案例 demo 为 SpringBoot 开发 1.官网下载相关资源包:http://kindeditor.net/down.php 2.编写页面(引入相关JS) <!DOCTYPE html ...

  3. Django-on_delete

    一.外键的删除 关于on_delete的总结 1.常见的使用方式(设置为null) class BookModel(models.Model): """ 书籍表 &quo ...

  4. 从 Socket 编程谈谈 IO 模型(三)

    快过年啦,估计很多朋友已在摸鱼的路上.而我为了兄弟们年后的追逐,却在苦苦寻觅.规划,导致文章更新晚了些,各位猿粉谅解. 上期分享,我们结合新春送祝福的场景,通过一坨坨的代码让 BIO.NIO 编程过程 ...

  5. Flask 和Django

    软件系统发展到今天已经很复杂了,在服务端软件,设计的知识很广泛,为了降低开发难度,提高开发效率,在某些方面去使用别人成熟的框架. 一些事务处理,安全性,数据流控制等都可以让框架处理,而开发人员把更多的 ...

  6. Fastdfs文件系统扩容

    1.简介     FastDFS文件服务器在设计时,为了支持大容量,存储节点(服务器)采用了分卷(或分组)的组织方式.存储系统由一个或多个卷组成,卷与卷之间的文件是相互独立的,所有卷的文件容量累加就是 ...

  7. uni-app的初识(01)

    1.什么是uni-app uni-app 是一个使用 Vue.js 开发所有前端应用的框架, 开发者编写一套代码, 可发布到IOS, Android, H5, 以及各种小程序(微信,百度)等多个平台. ...

  8. IDEA使用技巧,如何在JSP中创建Servlet“小程序”

    步骤 1.新建一个java类,实现Servlet接口 2.实现接口中的抽象方法: 3.在web.xml文件中配置好servlet <web-app ......> <servlet& ...

  9. 2017蓝桥杯九宫幻方(C++B组)

    题目:九宫幻方    小明最近在教邻居家的小朋友小学奥数,而最近正好讲述到了三阶幻方这个部分,三阶幻方指的是将1~9不重复的填入一个3*3的矩阵当中,使得每一行.每一列和每一条对角线的和都是相同的. ...

  10. [go]map基本使用和底层原理

    1.map基本使用 map声明 var m4 map[int]int //只是声明 没有开辟空间 m4[1]=100 //报错 log.Println(m4) 创建 //1 m3:=make(map[ ...