应该了解:嵌入式设备一般都使用精简指令集(RISC),而常见的x86台式机使用复杂指令集(RISC)。前者执行效率快设备启动快,前者执行效率慢设备启动慢。
一、台式机
我们使用的PC机一般都是windows系统或者Linux系统。
BIOS是PC机启动时运行的第一个软件,它是一组固化到计算机主板上ROM芯片内的程序(固件),保存着计算机最重要的基本输入输出的程序、开机自检程序和系统自启动程序,它可从CMOS中读写系统设置的具体信息。
启动过程:
- 按下开机键,CPU得电工作,首先将CS:IP寄存器复位为0xffff0——该地址就是ROM区的BIOS入口,执行BIOS代码进行自检和初始化,按顺序查找启动设备。此时内存尚未运行。
- 若找到被系统格式化过的磁盘(如硬盘),就把MBR扇区的引导程序(Booter)装入到内存,并将控制权转移给Booter(跳转指令实现)。
boot作用:
1.清屏
2.设置光标
3.显示start boot信息
4.加载load程序到物理内存中
5.设置好CPU的CS:IP,将控制权移交load - Booter检查分区表,将唯一活动主分区里的加载程序(Loader)装入到内存,并将控制权转移给Loader。
load作用:
1.加载OS内核
2.设置好CPU的CS:IP,将控制权移交OS内核 - Loader将主分区里的OS内核(kernel)文件装入到内存,将控制权转移给OS内核,内核会控制显示屏键盘亮等一系列现象,操作系统启动完成。
一句话总结:台式机首先执行bios然后bootload清屏加载OS内核点亮屏幕。
这样实现了从硬件启动到操作系统接管设备的全过程。
二、嵌入式设备
首先,Bootloader这个词是针对嵌入式系统而言的。Bootloader就是融合了boot和load功能的一个软件。
Bootloader的基本功能:
(1)初始化关键硬件,如RAM控制器、IO控制器等;
(2)初始化系统内存,并准备将其控制权移交给操作系统;
(3)给外设控制器分配必要的资源,如内存和中断电路等;
(4)提供一个定位和加载操作系统的机制;
(5)加载操作系统,将控制权移交给它,并向其传递必要启动信息(内存容量、时钟频率、串口速率这类硬件配置数据)。
由于不同的嵌入式系统的硬件(包括CPU、外设等)差异很大,因此Bootloader几乎都是针对某个特定嵌入式系统开发的。幸运的是,有一些诸如U-Boot这样的很好的开源Bootloader可以拿来定制,大大减少从头开始造轮子的痛苦。
嵌入式设备分2种:一种是linux内核,一种是RTOS。RTOS的系统启动很快,linux相对较慢,由于内存较小,通过u-boot加载内核,然后加载文件系统。
RTOS:是实时操作系统,其固件非常小通常1M-2M,其中并没有像linux那样的完整的操作系统,将任务与进程挂钩,开机就会启动进程,所以速度较快,而且通常固件较难分析。linux内核设备可通过cat /proc/mtd查看flash的分区情况。
启动过程:
- 首先嵌入式开发板上电,然后cpu开始运行;
- 然后cpu将固化在flash/ROM中的一段代码加载到RAM中运行,这段代码就是Bootloader(通用版是u-boot);
3.最后Bootload从flash中加载文件系统执行,配置网络服务等,执行preinit初始化脚本。
三、Bootloader与BIOS的作用区别
嵌入式系统只有Bootloader没有BIOS。嵌入式系统和桌面电脑同属于计算机系统,它们要完成的功能有很多相似之处。
对于嵌入式系统,一旦操作系统掌握了控制权时,比如Linux内核接管了那些被Bootloader占用的系统资源时,Bootloader的作用就不存在。想重新加载Bootloader那只能断电重启了。但BIOS在操作系统运行时,一直配合操作系统的驱动程序实现控制功能。