系统引导程序 Boot Loader——学习笔记

基于嵌入式Linux 的完整系统软件由三个部分组成:系统引导程序、Linux 操作系统内核文件系统。

系统引导程序 Boot Loader 是系统加电后运行的第一段软件代码,它的作用是加载操作系统或者其他程序到内存中,并将控制权交给它们。

Boot Loader启动过程

Boot Loader分为单阶段和多阶段两类

多阶段的Boot Loader能提供更为复杂的功能,以及更好的移植性。从固态存储器上启动的Boot Loader大多是两阶段的启动过程。具体分为stage1和stage2。

系统引导程序通常分为两个阶段:

  1. 由 BIOS 或者 UEFI 完成,它负责检测硬件设备,读取硬盘的主引导记录(MBR)或者 GUID 分区表(GPT),并执行其中的引导代码;
  2. 由操作系统的引导加载程序完成,它负责读取操作系统的核心文件,设置启动参数,创建启动菜单,或者链载另一个引导加载程序。

换一个说法:

Boot Loader首先完成系统硬件的初始化,包括时钟的设置、存储区的映射等,设置堆栈指针等;

然后把操作系统内核从flash拷贝到RAM区,并跳转到内核的入口,将系统控制权交给操作系统,在此之后系统的运行和Boot Loader 再无任何关系。

Linux的发行包中不包含Boot LoaderBoot Loader必须由用户自己设计,但用户可以直接使用或参考一些开源的Boot Loader软件工程。

Boot Loader的大小由其设计功能所决定,最小只有几K字节,功能复杂的一般也不超过100K字节。

Linux系统的开机过程是这样的:从BIOS开始,进入Boot Loader,再加载内核系统,进行内核初始化,最后启动初始化进程。以前Linux的启动一直是采用init进程的。

Boot Loader的特点

  • Boot Loader的实现高度依赖于硬件,包括处理器的体系结构、具体型号、硬件电路板的设计。 Boot Loader中有一部分代码是使用汇编语言设计的,汇编语言是直接和硬件相关的。
  • 不存在通用的Boot Loader,但是存在设计Boot Loader通用的概念和规则,以指导用户对特定的Boot Loader进行设计与实现。
  • 宿主主机和目标机之间一般通过串口连接,Boot Loader软件在执行时通常会通过串口来进行I/O操作。

例如:输出打印信息到串口,从串口读取用户控制字符等。

因为不同的硬件不同,和不同硬件一一对应的Boot Loader也不同,所以不存在通用的Boot Loader

Boot Loader操作模式

大多Boot Loader都有两个操作模式

  • 启动加载(正常使用):即Boot Loader从目标机上的某个固态存储器上将操作系统加载到ram中运行,整个过程没有用户的介入。这是Boot Loader的正常工作模式。
  • 下载模式(开发人员用):目标机上的Boot Loader将通过串口或网络连接从主机(host)上下载文件,例如内核映象和根文件系统等。下载的文件首先放在ram中,然后被Boot Loader写到固态存储器中。 Boot Loader的这种模式通常在第一次安装内核与根文件系统时使用。

 重点Boot Loader介绍

  • LILOLInux LOaderlinux草创时期提出的Boot Loader,现在由John Coffman维护,有详细的文档。在lilo.go.dyndns.org可以获得最新版本。
  • GRUBGRand Unified Boot Loader,是GNU计划的主要Boot Loader(用的多)
  • blobLART硬件计划采用的Boot Loader。因为它的采用,blob被移植到许多使用arm的系统,使用非常广泛。blob不提供监控程序的能力。
  • U-Boot:公认的功能最多、最具弹性以及开发最积极的开放源码Boot Loader,受到各种支持者的支持。U-BootPPCBootARMBoot为基础,大约支持100PPC电路和十几种ARM电路

 vivi是由mizi公司为ARM处理器系列设计的一个Boot Loader,目前只支持使用串口和主机通信,所以必须使用一条串口电缆来连接目标板和主机。作用如下:

  • 把内核(kernel)flash复制RAM,然后启动它 
  • 初始化硬件 
  • 下载程序并写入flash(一般通过串口或者网口先把内核下载到RAM中,然后写入到flash)
  • 检测目标板(Boot Loader会有一些简单的代码用以测试目标板硬件的好坏)

例:Boot Loader的简单实现 

/* Boot Loader, boot.S 
上面这5行主要是对不同寄存器的地址进行了命名
*/

.equ    WTCON,      0x01d30000
.equ    PCONE,      0x01d20028
.equ    LOCKTIME,   0x01d8000c
.equ    PLLCON,     0x01d80000
.equ    CLKCON,     0x01d80004
 

.globl _start
_start:             //程序启动
b   reset           //程序跳转到标号为reset的地方执行
add pc, pc, #0x0c000000   //这些都是中断向量表
add pc, pc, #0x0c000000
add pc, pc, #0x0c000000
add pc, pc, #0x0c000000
add pc, pc, #0x0c000000
add pc, pc, #0x0c000000
add pc, pc, #0x0c000000

//存放在标号MEMORY_CONFIG之下的用于配置内存的13个配置字

MEMORY_CONFIG:
.long   0x11110102
.long   0x600
.long   0x7ffc
.long   0x7ffc
.long   0x7ffc
.long   0x7ffc
.long   0x7ffc
.long   0x18000
.long   0x18000
.long   0x860459
.long   0x10
.long   0x20
.long   0x20    
 
/* 复位地址 */
reset:
/* 关看门狗 */
ldr r0, =WTCON
ldr r1, =0x0
str r1, [r0]

/* 设置端口控制寄存器 Port E ,打开RxD0和TxD0(串口输入输出)功能*/
ldr r1, =PCONE      //把PCONE这个寄存器的地址交给r1这个寄存器
ldr r0, =0x25529     // 0x25529就是对Port E寄存器 的配置字
str r0, [r1]
 
/* 设置系统时钟控制寄存器 */
ldr r1, =LOCKTIME
ldrb    r0, =0xfff
strb    r0, [r1]
 
ldr r1, =PLLCON
ldr r0, =0x78061
str r0, [r1]
 
ldr r1,=CLKCON
ldr r0, =0x7ff8
str r0, [r1]
 
/* 设置存储器 */
memsetup:
ldr r0, =MEMORY_CONFIG
ldmia   r0, {r1-r13}
ldr     r0, =0x01c80000
stmia   r0, {r1-r13}
 
/* 拷贝Flash地址0x10000内核到RAM地址0xc300000中 */
ldr r0, =0x10000
ldr r1, =0xc300000
add r2, r0, #(704 * 1024)
copy_kernel: 
ldmia   r0!, {r3-r10}
stmia   r1!, {r3-r10}
cmp r0, r2
ble copy_kernel
 
/* 跳转到RAM中执行内核 */
ldr r0, =0xc300000
mov pc, r0

 


常见的操作系统引导加载程序有 LILO,GRUB,SYSLINUX,Windows Boot Manager 等。

它们各有优缺点,可以根据不同的需求和场景选择合适的引导加载程序。一般来说,引导加载程序需要支持多种文件系统,能够识别不同的操作系统,提供友好的用户界面,支持安全启动等功能。

如果您想了解更多关于系统引导程序 Boot Loader 的信息,您可以参考以下的网页:

(1) 8.8. 配置引导加载器(Bootloader) - Debian. https://www.debian.org/doc/manuals/debian-handbook/sect.config-bootloader.zh-cn.html.
(2) 超详细分析Bootloader到内核的启动流程(万字长文) - 知乎. https://zhuanlan.zhihu.com/p/337507908.

超详细分析Bootloader到内核的启动流程(万字长文) - 知乎 (zhihu.com)
(3) 引导加载程序(BootLoader)_引导程序-CSDN博客. https://bing.com/search?q=%e7%b3%bb%e7%bb%9f%e5%bc%95%e5%af%bc%e7%a8%8b%e5%ba%8f+Boot+Loader.
(4) 引导加载程序(BootLoader)_引导程序-CSDN博客. https://blog.csdn.net/sinat_31608641/article/details/109981978.
(5) Bootloader开发:初识Bootloader - 知乎 - 知乎专栏. https://zhuanlan.zhihu.com/p/556181275.
(6) [小知识]Linux启动加载器介绍 – 深度科技社区 - Deepin. https://www.deepin.org/zh/linux-bootloaders/.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/346615.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

nodejs学习计划--(六)包管理工具

包管理工具 1. 介绍 包是什么 『包』英文单词是 package ,代表了一组特定功能的源码集合包管理工具 管理『包』的应用软件,可以对「包」进行 下载安装 , 更新 , 删除 , 上传 等操作 借助包管理工具,可以快…

无人机航迹规划(五):七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划(提供MATLAB代码)

一、七种算法(DBO、LO、SWO、COA、LSO、KOA、GRO)简介 1、蜣螂优化算法DBO 蜣螂优化算法(Dung beetle optimizer,DBO)由Jiankai Xue和Bo Shen于2022年提出,该算法主要受蜣螂的滚球、跳舞、觅食、偷窃和繁…

SpringMVC第四天(SSM整合)

SSM整合流程 1.创建工程 2.SSM整合 ①Spring SpringConfig package com.cacb.config;import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import;…

解析半导体放电管TSS的原理与应用?|深圳比创达电子

随着电子技术的迅速发展,半导体放电管(TSS)已成为电路保护的重要组件。本文旨在全面深入解析半导体放电管TSS的原理与应用,帮助读者更好地理解这一关键元件。 一、半导体放电管TSS的概念与原理 半导体放电管TSS是一种用于保护电…

sheng的学习笔记-神经网络

基础知识 基础知识-什么是分类问题 分类问题是根据已有数据,判断结果是正的还是负的(1或者0),比如: • 根据肿瘤大小,判断肿瘤是良性的还是恶性的 • 根据客户交易行为,判断是否是恶意用户 • 根据邮件情况…

司铭宇老师:手机门店销售培训:手机销售的技巧和方法

手机门店销售培训:手机销售的技巧和方法 在当今这个信息化的时代,手机已经成为了我们生活中不可或缺的一部分。作为手机销售人员,如何在这个竞争激烈的市场中突出重围,实现销售目标,是每一位销售人员都需要思考的问题。…

Unity出AAB包资源加载过慢

1)Unity出AAB包资源加载过慢 2)Unity IL2CPP打包,libil2cpp.so库中没有Mono接口 3)如何在URP中正确打出Shader变体 4)XLua打包Lua文件粒度问题 这是第370篇UWA技术知识分享的推送,精选了UWA社区的热门话题&…

Dify学习笔记-知识库(六)

1、知识库 大多数语言模型采用较为陈旧的训练数据,并且对每次请求的上下文有长度限制。例如 GPT-3.5 是基于 2021 年的语料进行训练的,且有每次约 4K Token 的限制。这意味着开发者如果想让 AI 应用基于最新的、私有的上下文对话,必须使用类…

C语言实现快速排序算法(附带源代码)

快速排序 在区间中随机挑选一个元素作基准,将小于基准的元素放在基准之前,大于基准的元素放在基准之后,再分别对小数区与大数区进行排序。 动态效果过程演示: 快速排序(Quick Sort)是一种常用的排序算法&…

Mac 也能玩文明6!下载安装详细教程

最近朋友给我分享了一个 Mac 玩文明6的方法,丝毫不卡顿,非常流畅,分享给大家 文明6是最新的文明系列游戏,和以往的文明游戏一样,玩家将从石器时代创建文明,然后迈向信息时代,最终通过军事、经济…

SQL 系列教程(二)

目录 SQL DELETE 语句 DELETE 语句 演示数据库 DELETE 实例 删除所有行 SQL TOP, LIMIT, ROWNUM 子句 TOP 子句 演示数据库 SQL TOP、LIMIT 和 ROWNUM 示例 SQL TOP PERCENT 实例 添加WHERE子句 SQL MIN() 和 MAX() 函数 MIN() 和 MAX() 函数 演示数据库 MIN() …

【服务器Midjourney】Midjourney网站0基础搭建

目录 🌺【前言】 🌺【准备】 🌺【宝塔搭建MJ】 🌼1. 给服务器添加端口 🌼2. 使用Xshell连接服务器 🌼3. 安装docker 🌼4. 安装Midjourney程序 🌼5. 绑定域名+申请SSL证书 🌼6. 更新网站

4D成像雷达「风再起」

编者按:4D成像雷达在过去几年已经得到汽车行业的认可,但后面的路怎么走,是否会一帆风顺,还受制于很多因素。 “去年第三季度,四家合作伙伴都进入了基于我们芯片组的4D雷达生产阶段,目前正处于与欧美和亚洲头…

太卷了!这个考试系统不愧是“卷王”!

大家好,我是 Java陈序员。 今天给大家推荐一款 Java 开源、功能强大、搭建简单的调查问卷系统和考试系统。 关注微信公众号:【Java陈序员】,获取开源项目分享、AI副业分享、超200本经典计算机电子书籍等。 项目介绍 SurveyKing —— 也叫“…

简化java代码:mapstruct + 策略模式

目录 目的 准备 注意 相同类型-属性名不同 实体类 映射 使用 验证-查看实现类 测试 不同类型(策略模式) 实体类 映射 工具类 使用:对象拷贝 验证-查看实现类 测试 使用:集合拷贝 测试 策略模式说明 准备-依赖 目的 简化 BeanUtils.…

JAVA 学习 面试(四)垃圾回收篇

Java中的每个对象都经历了创建、使用和最终被回收的过程。从对象实例化开始,它可能被程序的多个部分引用,直到最后一个引用消失,对象成为垃圾,等待回收。 JVM垃圾查找算法 (1)引用计数法:已淘…

开始读 Oracle PL/SQL Programming 第6版

最近觉得PL/SQL越来越重要,因为这本书早就在待读列表中,因此决定系统的学一下。 2024年1月24日晚开始读。 在亚马逊上的评价还不错: 本书的第一作者是Steven Feuerstein,是Oracle资深的Developer Advocate。 本书的示例代码可…

JS进阶-内置构造函数(二)

小提示:这些内置函数在开发使用的频率非常的频繁,建议认真看一下,并背一下 目录 知识回顾: • Object 三个常用静态方法(静态方法就是只有构造函数Object可以调用的) Object.keys Object.values Obj…

《动手学深度学习(PyTorch版)》笔记3.4

Chapter3 Linear Neural Networks 3.4 Softmax Regression 3.4.1 Classification Problems 一般的分类问题并不与类别之间的自然顺序有关,统计学家发明了一种表示分类数据的简单方法:独热编码(one-hot encoding)。独热编码是一…

docker里安装conda,并source本地已有的虚拟环境包

有的环境比较难配,在镜像里配置的版本总是与本地不同,导致程序起不来,今天就用个最基础的镜像,去配置anaconda,然后直接导入虚拟环境。 本次使用镜像:nvcr.io/nvidia/cuda:12.2.0-runtime-ubuntu20.04&…