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

news2024/10/2 22:27:59

基于嵌入式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.coloradmin.cn/o/1412751.html

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

相关文章

代码随想录算法训练营第16天 | 104.二叉树的最大深度, 111.二叉树的最小深度 ,222.完全二叉树的节点个数

二叉树理论基础: https://programmercarl.com/%E4%BA%8C%E5%8F%89%E6%A0%91%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE 104.二叉树的最大深度 题目链接:https://leetcode.cn/problems/maximum-depth-…

Mediasoup Demo-v3笔记(三)——Mediasoup库介绍

Mediasoup基本概念 Worker : 每一个worker就是一个进程(节点),进程和进程之间可以通信Router:每一个Router就是一个房间的概念Producer:每一个发出声音和视频的流都是一个ProducerConsumer:每一…

Confluence 的文章导入到 YouTrack KB 中

YouTrack 是有一个 KB 的,我们可以吧 Confluence 的文章全部导入到 YouTrack 的 KB 中。 首先,你需要具有管理员权限,然后选择导入。 然后可以在打开的界面中新增一个导入。 在新增导入中输入 Confluence 在随后的界面中输入你 Confluence …

浅谈ICMP协议

ICMP(Internet Control Message Protocol) 网络控制消息协议是网络层的协议,所谓控制,指的是通过下发指令来判断是否当前主机可达目标主机及不可达时的错误报告。通常使用ping命令和traceroute命令来使用。 ping命令:检测到目标主机是否可达、 tracerout…

SQL语句创建一个简单的银行数据库

目录 一、银行业务E-R图 二、数据库模型图 转换关系模型后: 三、创建数据库 3.1 创建银行业务数据库 四、创建表 4.1 创建客户信息表 4.2 创建银行卡信息表 4.3 创建交易信息表 4.4 创建存款类型表 结果如下: ​编辑 五、插入适量数据 5.1…

Linux中LVM实验

LVM实验: 1、分区 -L是大小的意思-n名称的意思 从vg0(卷组)分出来 2、格式化LV逻辑卷 LVM扩容 如果icdir空间不够了, 扩展空间lvextend -L 5G /dev/vg0/lv1 /dev/vg0/lv1(pp,vg,lv) 刷新文件系统xfs_growfs /lvdir VG扩容 …

选现货白银投资划不划算?

可以肯定的是选择现货白银投资是划算的,但投资者需要有足够的知识和经验,以及对市场的敏锐观察力。只有这样,投资者才能在现货白银投资中获取收益。在投资市场上,白银作为一种特殊的投资品种,一直以来都备受投资者们的…

01:云计算底层技术奥秘|虚拟化管理|公有云概述

云计算底层技术奥秘|虚拟化管理|公有云概述 虚拟化平台安装验证虚拟化支持 Linux虚拟机创建虚拟机磁盘虚拟机配置文件创建虚拟机 公有云简介 虚拟化平台安装 虚拟化:是一种技术 就是将不可拆分的实体资源变成可以自由划分的逻辑资源&#xf…

搭建Vite和Vue环境

​ 第一步:创建一个文件夹(此处为新建文件夹),并通过vscode打开 第二步:鼠标右键新建终端,并在终端处输入代码npm create vuelatest ​第三步:输入该项目名称(该项目名称并不是第一…

面向对象编程(进阶)(上)

文章目录 一. 关键字:this1.1 this是什么?1.2 什么时候使用this1.2.1 实例方法或构造器中使用当前对象的成员1.2.2 同一个类中构造器互相调用 1.3 练习 二. 面向对象特征二:继承(Inheritance)2.1 继承的概述2.1.1 生活中的继承2.1.2 Java中的…

乖乖,咱不用BeanUtil.copy了,咱试试这款神级工具(超详细)

引言 在现代Java应用程序开发中,处理对象之间的映射是一个常见而且必不可少的任务。随着项目规模的增长,手动编写繁琐的映射代码不仅耗时且容易出错,因此开发者们一直在寻找更高效的解决方案。比如基于Dozer封装的或者Spring自带的BeanUtil.…

C语言指针进阶之一字符指针

目录 1.指针知识回顾 2.字符指针 2.1字符指针的一般使用 2.2字符指针的另外一种使用 1.指针知识回顾 ①.指针就是个变量,用来存放地址,地址唯一标识了一片空间。 内存会划分成一个个的内存单元,每个内存单元都有一个独立的编号&#xff0…

php怎么输入一个变量,http常用的两种请求方式getpost(ctf基础)

php是网页脚本语言,网页一般支持两种提交变量的方式,即get和post get方式传参 直接在网页URL的后面写上【?a1027】,如果有多个参数则用&符号连接, 如【?a10&b27】 post方式传参 需要借助插件,ctfer必备插…

腾讯云服务器一键部署幻兽帕鲁联机服务器详细教程(Linux系统)

腾讯云作为国内领先的云计算服务商,为广大用户提供了稳定、高效的云计算服务。本文将详细介绍如何在腾讯云服务器(Linux系统)实现一键部署幻兽帕鲁联机服务器,帮助大家快速搭建自己的游戏联机服务器。 第一步:购买服务…

C#winform上位机开发学习笔记13-串口助手显示系统时间功能添加

1.功能描述 在上位机中显示系统的实时时间 2.代码部分 步骤1:添加文本框控件并设置参数 #此处注意将BackColor颜色修改为非Control,即可正常显示ForeColor颜色,否则该颜色不变,原因暂且不明。 步骤2:添加timer控件…

Docker深入解析:从基础到实践

Docker基础知识 Docker是什么:定义和核心概念解释 Docker是一个开源项目,它诞生于2013年,旨在自动化应用程序的部署过程, 让应用程序能够在轻量级的、可移植的、自给自足的容器中运行。这些容器可以在几乎任何机器上运行&#xf…

linux安装python3.11

yum -y install gcc-c zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite* readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel下载地址 https://www.python.org/ftp/python/3.11.7/Python-3.11.7.tar.xz 上传python文件&#xff…

互信息的简单理解

在介绍互信息之前,首先需要了解一下信息熵的概念:所谓信息熵,是指信息论中对一个随机变量不确定性的度量,对于随机变量x,信息熵的定义为: H ( x ) − ∑ x p ( x ) l o g p ( x ) H(x)-\sum_xp(x)logp(x) …

Programming Abstractions in C阅读笔记:p254-p257

《Programming Abstractions in C》学习第70天,p254-p257总结,总计4页。 一、技术总结 1.minimax strategy(极小化极大算法) p255, This idea–finding the position that leaves your opponent with the worst possible best move–is called the mi…

HTML-框架标签、实体、全局属性和元信息

HTML 1.框架标签 <iframe name"b站" src"https://www.bilibili.com" width"500" height"300" frameborder"0"></iframe>iframe 标签的实际应用&#xff1a; 在网页中嵌入广告。与超链接或表单的 target 配合&a…