Bootloader技术

生活百科 2023-01-26 08:57生活百科www.aizhengw.cn

Bootloader技术

boot loader 就是在作业系统核心运行之前运行的一段小程式。通过这段小程式,我们可以初始化硬体设备、建立记忆体空间的映射图,从而将系统的软硬体环境带到一个合适的状态,以便为最终调用作业系统核心準备好正确的环境。通常,boot loader 是严重地依赖于硬体而实现的,特别是在嵌入式世界。,在嵌入式世界里建立一个通用的 boot loader 几乎是不可能的。儘管如此,我们仍然可以对 boot loader 归纳出一些通用的概念来,以指导用户特定的 boot loader 设计与实现。

操作模式

大多数 boot loader 都包含两种不同的操作模式"启动载入"模式和"下载"模式,这种区别仅对于开发人员才有意义。但从最终用户的角度看,boot loader 的作用就是用来载入作业系统,而并不存在所谓的启动载入模式与下载工作模式的区别。  启动载入(boot loading)模式这种模式也称为"自主"(autonomous)模式。也即 boot loader 从目标机上的某个固态存储设备上将作业系统载入到 ram 中运行,整个过程并没有用户的介入。这种模式是 boot loader 的正常工作模式,在嵌入式产品发布的时侯,boot loader 显然必须工作在这种模式下。  下载(downloading)模式在这种模式下,目标机上的 boot loader 将通过串口连线或网路连线等通信手段从主机(host)下载档案,比如下载核心映像和根档案系统映像等。从主机下载的档案通常被 boot loader 保存到目标机的 ram 中,然后再被 boot loader 写到目标机上的flash 类固态存储设备中。boot loader 的这种模式通常在第一次安装核心与根档案系统时被使用;,以后的系统更新也会使用 boot loader 的这种工作模式。工作于这种模式下的 boot loader 通常都会向它的终端用户提供一个简单的命令行接口。  像 blob 或 u-boot 等这样功能强大的 boot loader 通常支持这两种工作模式,而且允许用户在这两种工作模式之间进行切换。比如,blob 在启动时处于正常的启动载入模式,它会延时 10 秒等待终端用户按下任意键而将 blob 切换到下载模式。如果在 10 秒内没有用户按键,则 blob 继续启动 linux 核心。

兼容性能

每种不同的 cpu 体系结构都有不同的 boot loader。有些 boot loader 也支持多种体系结构的 cpu,比如 u-boot 就支持 arm 体系结构和mips 体系结构。除了依赖于 cpu 的体系结构外,boot loader 实际上也依赖于具体的嵌入式板级设备的配置。这也就是说,对于两块不同的嵌入式板而言,即使它们是基于同一种 cpu 而构建的,要想让运行在一块板子上的 boot loader 程式也能运行在另一块板子上,通常也都需要修改 boot loader 的源程式。

安装媒介

系统加电或复位后,所有的 cpu 通常都从某个由 cpu 製造商预先安排的地址上取指令。比如,基于 arm7tdmi core 的 cpu 在复位时通常都从地址 0x00000000 取它的第一条指令。而基于 cpu 构建的嵌入式系统通常都有某种类型的固态存储设备(比如rom、eeprom 或 flash 等)被映射到这个预先安排的地址上。在系统加电后,cpu 将执行 boot loader 程式。  下图就是一个装有 boot loader、核心的启动参数、核心映像和根档案系统映像的固态存储设备的典型空间分配结构图。
图 固态存储设备的典型空间分配结构

程式流程

系统上电复位后, 在完成各种初始化配置后判断0x500地址单元中值是否为0xff, 如果是,则说明系统从未下载过用户程式, 系统会一直运行boot loader程式等待pc 机传送下载命令; 如果0x500中的值不是0xff, 则说明系统中已经下载过用户程式了, 这时候根据0x500中的值来设定定时器t imer2的初值并开始计时, 如果uart2 在指定的自举周期内未接收到pc 机发来的下载命令(说明系统不需要下载程式), 系统会自动跳出boo tloader程式而去运行已有的用户代码, 如果uart2在自举周期内接收到了下载命令, boo tloader程式会进入循环状态等待pc机传送数据。如图所示。
图 程式流程图。  如前文所述, pc 机传送的数据是从. hex 档案中提取的, pc机传送扩展地址部分, 下位机接收保存后会继续等待接收32个指令字( 96位元组)并保存到ram 中, 然后根据接收到的地址擦除flash 存储器中的1行, 擦除flash 是通过调用彙编函式e rasemem来进行的, 函式原型如下:  mov# 0x4041, nvmcon ; 使nvmcon 暂存器为擦除flash模式  mov # 0x55, w 0  movw0, nvmkey  mov # 0xaa, w0  movw 0, nvmkey ; 将0x55、0xaa 写入密钥暂存器  bsetnvmcon, #wr ; 开始擦除  nop  nop  return  擦除flash存储器的一行后需要把接收到的32个指令字写入到flash 存储器写锁存器中, 这一过程可以通过函式w ritelatch 实现, 函式原型如下:  movw0, tblpag ; 写表暂存器  tb lw tlw3, 1]  tb lw thw2, 1] ; 写入锁存器  return  这一步完成之后就可以将接收到的32个指令字写入flash 存储器了, 其方法与擦除flash 类似, 写完一行后向pc 机传送应答。待flash 存储器全部写完之后, pc 机会传送表示结束下载的命令, 下位机接收后退出boo tloader程式, 进入新的用户程式继续运行, 从而完成整个线上自编程过程。

原理

bootloader相当于pc主机板上的b ios, 是最底层的引导软体。boo tloader是一段固化在嵌入式系统目标系统rom或者是诸如flash 等非易失存储器中的一段程式, 它的主要作用就是引导作业系统或用户程式的运行。系统上电后boo tloader将接管系统, 在进行一些最基本的上电自检后, bootloader将对系统的硬体进行初始化, 为引导作业系统作好準备, 接下来, bootloader需要将作业系统的代码拷贝到主存储器的特定地址, boot loader将控制权交给作业系统, 由作业系统完成接下来的工作;在不含作业系统的系统中, bootloader可以完成这样一些操作: 分配程式存储空间; 重新映射复位和中断向量; 将程式代码从片外载入到程式区, 执行时再将代码载入到ram 中以便快速执行; 检测是否需要下载新的用户代码, 若需要则通过某种通信方式接收新代码并将其写入指定程式存储空间中, 若不需要, 则执行原有用户代码。
上一篇:BLOCK街区 下一篇:drippin\x27

Copyright@2015-2025 www.aizhengw.cn 癌症网版板所有