系统引导程序 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/.

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JMeter性能测试实战

🔥 交流讨论:欢迎加入我们一起学习! 🔥 资源分享:耗时200小时精选的「软件测试」资料包 🔥 教程推荐:火遍全网的《软件测试》教程 📢欢迎点赞 👍 收藏 ⭐留言 &#x1…

C语言——O / 动态内存管理

一、为什么要有动态内存分配 我们已经掌握的内存开辟⽅式有: int val 20;//在栈空间上开辟四个字节 char arr[10] {0};//在栈空间上开辟10个字节的连续空间 但是上述的开辟空间的⽅式有两个特点: • 空间开辟⼤⼩是固定的。 • 数组在申明的时候&am…

RabbitMQ之死信交换机

前言 消息队列是分布式系统中常用的组件,用于异步通信、解耦和提高系统可靠性。然而,在实际应用中,难免会遇到一些异常情况,例如消息处理失败、超时等。为了更好地处理这些异常情况,死信交换机(Dead Lette…

AS自治系统中的路由协议---RIP、OSPF、BGP

一、AS --- 自治系统 将网络分块管理 --- 由单一的机构或组织所管理 的一系列IP网络及其设备的集合 AS的管理:为了方便对AS进行管理,我们给AS设计了一个编号称为AS 号 --- 16位二进制构成 --- 0 - 65535 ---- 目前也存在拓展版的AS 号 --- 32位二进制构…

C++-类和对象(1)

目录 1.面向过程和面向对象初步认识 2.类的引入 3.类的定义 4.类的访问限定符及封装 4.1 访问限定符 关于C中struct和class的区别: 4.2 封装 1.面向过程和面向对象初步认识 C语言是面向过程的,关注的是过程,分析出求解问题的步骤&…

【论文阅读|半监督小苹果检测方法S3AD】

论文题目 : : Semi-supervised Small Apple Detection in Orchard Environments 项目链接:https://www.inf.uni-hamburg.de/en/inst/ab/cv/people/wilms/mad.html 摘要(Abstract) 农作物检测是自动估产或水果采摘等精准农业应用不…

代码迁移,合并双仓库

文章目录 前言一、如何对两个仓库进行合并二、具体操作步骤A仓库新分支第一步 移除controller以及接口第二步 移除service以及实现类impl第三步 移除dao层(mapper以及xml)第四步 移除pojo、cache、config、enum以及util等,并复查service第五步…

python 基础知识点(蓝桥杯python科目个人复习计划27)

今日复习内容:基础算法中的递归 1.介绍 递归:通过自我调用来解决问题的函数递归通常把一个复杂的大问题层层转化为一个与原问题相似的规模较小的问题来解决 递归要注意:(1)递归出口;(2&#x…

一招搞定msvcr120.dll丢失怎样修复的问题,快速修复msvcr120.dll文件

msvcr120.dll丢失的问题时电脑中常见的几种问题,关于msvcr120.dll丢失的问题都有什么办法可以有效的解决文件丢失的问题,今天我们就来聊聊关于msvcr120.dll丢失怎样修复的方法都有哪些? 一.一招搞定msvcr120.dll丢失问题 为了解决msvcr120.d…

05 SB3之Spring Initializr+运行方式+自动配置原理(TBD)

1. 使用IDEA内置Spring Initializr 生成SB项目 最上方Server URL可以选择借助哪个平台生成, 可选阿里云 作为对比 , 官方可选版本最旧为3.1.18 ; 阿里云可选最新版本为3.0.2 本次选择3.1.8版本, 并且添加Spring Web依赖(包括RESTful / Spring MVC/)和Lombok依赖 生成后端项目…

野火霸道V2学习笔记

STM32F103学习笔记 STM32F103学习笔记说明基础配置配置KeilMDK配置串口下载程序美化Keil界面配置VScode 理论知识STM32命名方式例子 置位与清零GPIOGPIO简介GPIO和引脚的区别引脚的分类 GPIO 框图讲解保护二极管推挽输出推挽输出的含义推挽输出的原理推挽输出的特点推挽输出的应…

TCO AF488,AF488 反式环辛烯,可以用于各种生物实验中,如免疫荧光染色、细胞追踪、核酸检测等

AF488 TCO,Alexa Fluor TCO,TCO AF488,AF488 反式环辛烯,可以用于各种生物实验中,如免疫荧光染色、细胞追踪、核酸检测等 您好,欢迎来到新研之家 文章关键词:AF488 TCO,Alexa Fluo…

如何使用Docker部署火狐浏览器并实现无公网ip远程访问

文章目录 1. 部署Firefox2. 本地访问Firefox3. Linux安装Cpolar4. 配置Firefox公网地址5. 远程访问Firefox6. 固定Firefox公网地址7. 固定地址访问Firefox Firefox是一款免费开源的网页浏览器,由Mozilla基金会开发和维护。它是第一个成功挑战微软Internet Explorer浏…

vulnhub靶场之EMPIRE:BREAKOUT

一.环境搭建 1.靶场描述 Description Back to the Top Difficulty: Easy This box was created to be an Easy box, but it can be Medium if you get lost. For hints discord Server ( https://discord.gg/7asvAhCEhe ) 2.靶场地址 https://www.vulnhub.com/entry/empire-…

备战蓝桥杯---数据结构与STL应用(入门1)

话不多说,直接看题: 下面为分析:显然,我们要先合并最小的两堆(因为他们在后边也得被计算,换句话,我们独立的看,某一堆的体力值为他自己重量*从现在到最后的次数) 因此&a…

Ubuntu 22.04安装Nginx负载均衡

君衍. 一、编译安装Nginx二、轮询算法实现负载均衡三、加权轮询算法实现负载均衡四、ip_hash实现负载均衡 一、编译安装Nginx 这里我们先将环境准备好,我使用的是Ubuntu22.04操作系统: 这个是我刚安装好的,所以首先我们进行保存快照防止安装…

为什么说linux操作系统要比windows稳定?

为什么说linux操作系统要比windows稳定? 在开始前我分享下我的经历,刚入行时遇到一个好公司和师父,给了我机会,两年时间从3k薪资涨到18k的, 我师父给了一些linux学习方法和资料,让我不断提升自己&#xff…

【机器学习】欠拟合与过拟合

过拟合:模型在训练数据上表现良好对不可见数据的泛化能力差。 欠拟合:模型在训练数据和不可见数据上泛化能力都很差。 欠拟合常见解决办法: (1)增加新特征,可以考虑加入特征组合、高次特征,以…

Qt Design Studio+Pyside项目

Qt Design Studio设计出的项目结构有多个层级的目录,我们直接用类似Qt Creator工具的方式加载main.qml文件时会报错提示module "content" is not installed,将content加入importPath后还是报同样的错误。 Qt Design Studio生成的文件包含了.qm…

【Docker】数据持久化 挂载

Docker的镜像是只读的,但是容器是可写的,我们可以将数据写入到容器,不过一旦容器删除数据将会丢 失,那么有什么办法能将数据进行持久化存储呢? ——在宿主机上开辟一块地方,存储内容和docker容器的存储内…