本帖最后由 pzsh 于 2024-5-21 09:54 编辑
1.什么是BootLoader
BootLoader是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。通常,BootLoader是严重地依赖于硬件而实现的,特别是在嵌入式世界。因此,在嵌入式世界里建立一个通用的BootLoader几乎是不可能的。尽管如此,我们仍然可以对BootLoader归纳出一些通用的概念来,以指导用户特定的BootLoader设计与实现。
⒈ Boot Loader 所支持的 CPU 和嵌入式板
每种不同的 CPU 体系结构都有不同的Boot Loader。有些 Boot Loader 也支持多种 体系结构的 CPU,比如 U-Boot 就同时支持 ARM 体系结构和MIPS 体系结构。除了依赖于 CPU的 体系结构外,Boot Loader 实际上也依赖于具体的 嵌入式板级设备的配置。这也就是说,对于两块不同的 嵌入式板而言,即使它们是基于同一种 CPU 而构建的,要想让运行在一块板子上的 Boot Loader 程序也能运行在另一块板子上,通常也都需要修改 Boot Loader 的 源程序。
⒉ Boot Loader 的安装媒介(Installation Medium)
系统加电或复位后,所有的CPU 通常都从某个由 CPU 制造商预先安排的地址上取指令。比如,基于 ARM7TDMI core 的 CPU 在复位时通常都从地址 0x00000000 取它的第一条指令。而基于CPU 构建的嵌入式系统通常都有某种类型的固态存储设备(比如:ROM、EEPROM 或 FLASH 等)被映射到这个预先安排的地址上。因此在系统加电后,CPU 将首先执行Boot Loader 程序。
⒊ 用来控制 Boot Loader 的设备或机制
主机和目标机之间一般通过串口建立连接,Boot Loader 软件在执行时通常会通过串口来进行输入、输出,比如:输出打印信息到串口,从串口读取用户 控制字符等。
⒋ Boot Loader 的启动过程
BootLoader 的启动过程可分为单阶段(Single-Stage)和多阶段(Multi-Stage)两种。通常多阶段的Boot Loader 具有更复杂的功能,更好的可移植性。从固态存储设备上启动的Boot Loader 大多采用两阶段,即启动过程可以分为 stage1和stage2:stage1完成初始化硬件,为stage2准备内存空间,并将stage2复制到内存中,设置堆栈,然后跳转到stage2。
⒌ Boot Loader 的操作模式 (Operation Mode)
大多数Boot Loader都包含两种不同的操作模式。启动加载模式和下载模式。
(1)启动加载(Boot loading)模式:这种模式也称为“自主”模式,也即Boot Loader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入。这种模式是Boot Loader的正常工作模式。
(2)下载(Down loading)模式:在这种模式下目标机上的Boot Loader将通过串口连接或网络连接等通信手段从主机下载文件。从主机下载的文件通常首先被Boot Loader保存到目标机的RAM中然后再被Boot Loader写到目标机上的固态存储设备中。
⒍ Boot Loader 与主机之间进行 文件传输所用的通信设备及协议
分为两种情况。一种是目标机使用串口与主机相连。这时的传输协议通常是xmodem/ymodem/zmodem中的一种。第二种可以用网络连接的方式传输文件,这时使用的协议多为tftp。
2.配置SDK和编译环境,进行Bootloader的编译和烧录。
使用brew install scons ,安装scons编译工具。
下载SEGGER J-Link software,用于烧录调试。
使用git clone https://github.com/RT-Thread-Studio/sdk-bsp-stm32h750-realthread-artpi克隆ART-Pi SDK到本地目录。
下载解压Arm GUN 工具链。
(可选)克隆RT-Thread Env到本地目录,主要用于开发阶段pkgs管理等操作。
设置环境变量,建议添加到.zshrc 或.bashrc |