嵌入式文件系统启动流程与计算机系统启动步骤是怎样的?
摘要:其实不管是嵌入式系统,还是其它的计算机系统,其启动过程大概都可以分为三个阶段:ROM 阶段、RAM 阶段、BOOT 阶段
liwen01 2024.04.14
前言
我们身边的各种电子设备,手机、手表、相机、个人电脑等等,从用户体验的角度看,好像只要给它们一上电,它们就开始启动可以工作了,这个过程一般是比较短暂的。
从一个嵌入式开发的角度来看,不管是嵌入式系统,还是其它的计算机系统,其启动过程都是一个相对复杂的过程。这个过程一旦出错,基本上设备就不能正常运行了。
(一)嵌入式系统启动
(1)存储架构示意图
我们先看一个嵌入式系统的存储架构示意图
嵌入式设备的存储介质一般有NOR Flash,NAND Flash、SD卡、EEPROM等,其中根据Flash接口的不同,又可以分期串行Flash(SPI Flash)和并行Flash。在芯片内部有它们对应的控制器。
于此同时,一般在芯片的内部,都会有一个比较小的SRAM和ROM,我们一般称它为内部SRAM和内部ROM。
我们的程序,包括系统程序和应用程序,一般都是存放在这些外接的存储介质上。
(2)启动过程
芯片上电执行的第一条程序,不是执行放置在外部Flash中的Boot程序,执行的是内部ROM上的程序
内部ROM里面的程序,会根据BOOT_SEL引脚的电平状态,判断需要从哪个存储器中启动,然后初始化该存储器的接口
存储器接口初始化完成后,将存储设备最开始的一小段程序程序(一般4~5K)加载到内部SRAM,通过这一小部分程序去初始化外部的DDR内存
外部DDR初始化完之后,再将Flash中剩下的代码复制到外部DDR中,然后再跳转到外部DDR中去执行BOOT剩下的代码
DDR上的BOOT程序会去初始化硬件并引导kernel的启动,随后kernel去挂载根文件系统
根文件系统去执行应用程序、并挂载在存储器上其它分区上的文件系统
这里需要对几个知识点需要注意:
并不是所有的系统都有BOOT_SEL引脚,在有些SOC上,还会通过BOOT_SEL引脚判断是否在烧录模式
如果去分析boot的编译连接脚本,你会发现,放置在boot程序最前面4K位置的代码,都是一些初始化、代码复制、重定位的代码,这部分一般是汇编实现。
因为内部SRAM的空间很小,所以内部ROM上的程序才会只复制前面的一小段程序。
启动过程的1~4步骤,有叫BOOT的自举,也有的叫BOOT 的重定位。
(3)启动阶段
其实不管是嵌入式系统,还是其它的计算机系统,其启动过程大概都可以分为三个阶段
ROM 阶段
RAM 阶段
BOOT 阶段
ROM阶段:指的是处理器内部的ROM程序阶段,主要作用是加载存储头部的一小段程序到内部RAM上,这部分的程序一般是使用汇编来实现。
RAM阶段:是指外部DDR已经被初始化,并且存储器中的程序已经被重定位到外部DDR上,从这开始,程序的堆栈空间可以被建立起来,C语言可以开始执行。
BOOT阶段:是指开始其它外围硬件初始化和引导系统启动。
(二)计算机系统启动
计算机系统因为历史悠久,外设种类众多,它的启动流程会复杂一些,根据固件类型(BIOS或UEFI)和分区表类型(MBR或GPT)的不同,计算机的启动一般可以分为BIOS启动和UEFI启动两种。
查资料看文档发现BIOS、UEFI、LEGACY这几个概念有些混乱,没有统一的定义。对大部分来说,它们理解的引导计算机启动的程序就叫BIOS
因此在这之前,我们统一一下说法,计算通过BIOS引导系统启动,根据BIOS固件的不同和磁盘的分区类型不同,又可以分为两种方式:LEGACY(传统BIOS)和UEFI启动。
(1)计算机主板接口与组件介绍
要了解计算机的启动流程,我们先看下一台个人计算机的主板上都有些什么接口和组件
主要的组件有:电源、CPU、南桥北桥芯片组、BIOS芯片、磁盘接口、还有各种扩展接口和连接器(内存、显卡、网卡声卡等等)
与启动比较相关的是电源、CPU、南北桥芯片组,BIOS芯片、磁盘、内存
(1)ATX电源ATX是一种主板的规范、符合ATX规范的电源就叫ATX电源,它的作用是是把交流220V的电源转换为计算机内部使用的5V、12V、24V等不同压值的直流电源。
另外,它还支持电源管理, ATX电源标准接口(如PS_ON、PWR_OK等)与主板通信,以实现电源的管理和控制,包括开机、关机、睡眠模式和节能功能等。
