在PC机中,BIOS(Basic Input/Output System,基本输入输出系统)和UEFI(Unified Extensible Firmware Interface,统一可扩展固件接口)是两种用于初始化系统硬件、加载操作系统启动程(如引导加载程序)的固件接口。
BIOS参在于较为成就的PC系统内,主要作用如下:
1.硬件初始化:在系统启动时,BIOS会执行自检(POST,Power-On Self-Test)过程,检查CPU、内存、显卡、硬盘等关键硬件是否正常运行。
2.加载操作系统:完成自检后,BIOS会从预设的启动设备(如硬盘、USB驱动器、CD/DVD驱动器)中读取启动程序(如GRUB、Windows Boot Manager等),并将其加载到内存中执行,从而启动操作系统。
3.配置和设置:BIOS提供了一个简单的设置界面(BIOS Setup),允许用户配置系统硬件的参数,如启动顺序、日期和时间、CPU和内存的频率等。
而它的继任者UEFI提供了更丰富的功能和更好的安全性。它与传统BIOS的主要区别包括:
1.图形化界面:UEFI支持图形化的用户界面(GUI),这使得配置系统变得更加直观和容易。
2.更大的可寻址空间:UEFI使用64位寻址模式,相比BIOS的16位寻址模式,能够支持更大的内存空间,这对现代大内存系统尤为重要。
3.更快启动速度:UEFI通过预加载环境(Pre-EFI Initialization, PEI)和驱动程序执行环境(Driver Execution Environment, DXE)等机制,实现了更快的系统启动速度。
4.更好的安全性:UEFI内置了安全启动(Secure Boot)功能,能够确保只有经过签名认证的操作系统和驱动程序才能被加载,从而增强了系统的安全性。
5.更丰富的功能:UEFI支持网络启动、设备枚举和配置、以及更复杂的启动选项管理等功能。
那么在嵌入式系统之中是否有着可以类比这两者的存在呢?
主流的说法是bootloader和它们的功能近似。一般来讲裸机系统与RTOS系统正常上电运行不需要bootloader的参与,比如ARM架构的单片机在上电之后开始从0位置读取复位向量,然后自动执行内部的flash程序(Keil这类的集成IDE可以决定扇区擦拭与整页擦拭以及通过下载算法决定页地址),不需要像Linux/Windows系统那样将程序拷贝到ram中运行。
因为STM32内部的on chip flash属于nor flash,而且通过片上的AMBA(Advanced Microcontroller Bus Architecture)总线(AHB+APB)连接到CPU,存在着对地址空间的映射,所以CPU可以直接读取FLASH进行取指。
但是用不上不代表不存在,STM32基本都存在内置的bootloader,ST原厂将其固化在了rom里面。
例如当serial wire调试失效的时候,我们可以将boot0接入高电平用串口下载代码就是依靠原厂固化在rom中的bootloader。同理,ota升级时MCU先运行到原厂的bootloader,然后会跳转到用户自己写的存到flash中的bootloader,最后跳转到用户APP。
再例如型号陈旧的8bit单片机,它们的CPU会自动从一个内存空间位置取指执行,如果它需要从外部IIC加载数据到内部RAM再启动,那么也需要bootloader的参与。
嵌入式Linux系统里面主要是使用一种叫做U-boot的开源的引导加载程序,U-boot的主要作用:
1. 初始化硬件设备
- 在系统启动时,U-boot首先会执行一系列的初始化操作,包括初始化硬件设备(如CPU、内存、外设等)和建立内存空间映射图。这些操作将系统的软硬件环境带到一个适合运行操作系统内核的状态。
2. 加载并引导操作系统内核
- U-boot负责将操作系统内核镜像从存储介质(如Flash、SD卡、网络等)加载到内存中,并设置必要的启动参数,然后跳转到内核的入口点执行,从而启动操作系统。
3. 提供测试调试工具
- U-boot包含了一系列用于测试和调试的工具,如内存显示(md)、内存修改(mm、nm)、网络测试(ping)等命令,这些工具对于开发人员来说非常有用,可以帮助他们进行系统的调试和故障排查。
4. 支持多种嵌入式操作系统和处理器
- U-boot支持多种嵌入式操作系统内核,如Linux、VxWorks、QNX等,并且支持多个处理器系列,如PowerPC、ARM、x86、MIPS等。这使得U-boot在嵌入式系统中具有广泛的应用场景。
5. 提供灵活的功能设置
- U-boot允许用户通过修改环境变量来设置不同的启动参数和功能选项,这使得U-boot在不同的应用场景下具有高度的灵活性和可定制性。
6. 丰富的设备驱动源码
- U-boot包含了丰富的设备驱动源码,如串口、以太网、SDRAM、FLASH等,这些驱动使得U-boot能够更好地支持各种硬件设备,并实现与这些设备的交互。
7. 较高的可靠性和稳定性
- 作为嵌入式系统的引导加载程序,U-boot需要具备较高的可靠性和稳定性。U-boot的开源特性和广泛的应用基础使得其在可靠性和稳定性方面得到了充分的验证和保障。
目前就聊这么多,后面等我接触到更多的东西会进行修改。