bootloader基本介绍
1.什么是bootloader?
bootloader 简单来说就是引导加载程序。即在操作系统内核运行之前运行一小段程序。通过bootloader,引导启动内核操作系统。通常 bootloader 严重依赖于硬件的实现,特别是在嵌入式的世界。
2.bootloader的作用
- 设置系统时钟、初始化SDRAM;
- 对 bootloader 阶段所需要用到的硬件资源进行初始化;
- 设置启动参数,启动内核。
3.bootloader的启动过程
通常 bootloader 启动过程可分为单阶段和多阶段。以uboot(支持ARM和MIPS)为例,通常启动过程分为两阶段,即stage1和stage2。
stage1:第一阶段
第一阶段通常是用汇编写的,依赖于硬件的体系结构,通常是一些设备的初始化
硬件设备初始化(串口、时钟、SDRAM等)
为 bootloader 的 stage2 准备 RAM 空间
拷贝 bootloader 的 stage2 到 RAM
设置好栈
跳转到 stage2 的 C 语言入口点执行
stage2:第二阶段
第二阶段通常是 C 语言写的,主要是为了方便移植,通常包含以下步骤:
初始化本阶段要使用的硬件设备
检测系统内核映射
将kernel映像和根文件系统映像从 flash 上读到 RAM 空间上
为内核设置启动参数
启动内核
Linux kernel 认识
Linux kernel 是整个Linux操作系统的核心,主要功能就是负责进程管理调度、内存管理、虚拟文件系统(VFS)、网络管理、进程间通信(IPC)
如下图是 Linux 内核的整体架构。根据内核的核心内容,linux 内核提出了5个子系统,分别负责如下功能:
- Process Scheduler:也称作进程管理、进程调度。负责管理CPU资源,让每个进程尽可能公平的访问CPU。
- Memory Manager:内存管理。负责管理内存资源,以便让各个进程可以安全的共享机器的内存资源。另外内存管理还会提供虚拟内存机制,可以让进程使用多于 Memory 的内存,不用的内存会通过文件系统保存在外部非易失存储器中,需要使用的时候,再取回到内存中。
- VFS(Virtual File System ):虚拟文件系统。Linux内核将不同功能的外部设备,例如Disk设备(硬盘、磁盘、NAND Flash、Nor Flash等)、输入输出设备、显示设备等等,抽象为可以通过统一的文件操作接口(open、close、read、write等)来访问。这就是Linux系统“一切皆是文件”的体现。
- Network:网络子系统。负责管理系统的网络设备,并实现多种多样的网络标准。
- IPC (Inter-Process Communication):进程间通信。IPC不管理任何的硬件,它主要负责Linux系统中进程之间的通信。
rootfs:根文件系统
Linux 系统中的根文件系统(Root File System),简称rootfs,本质上还是一个文件系统。和普通文件系统不同的是,rootfs 是针对特定的操作系统的架构的一种实现形式。具体表现为:
- 特定的文件夹,文件夹之间的关系,即组织架构或者目录结构
- 特定的文件
Linux 系统中 rootfs 通常包含以下文件夹和文件:
- /:根文件目录
- /etc:相关的配置文件目录
- /etc/init:存放系统启动相关的配置
- /sbin:存放系统相关工具,系统命令
- /bin:存放常用的一般命令等
一个根文件系统,主要存放以下内容:
- 相关配置文件
- 系统相关应用程序
- 一般应用程序
- 可执行程序所需要的环境等
bootloader、kernel 和 rootfs 在嵌入式系统中的分区结构
通常,当我们代码编写调试完成后,就需要通过一些工具或者命令来制作固件(这里的固件不作详解),然后将固件烧录到芯片上,固化在特定的硬件设备上,这个时候,就需要了解boot loader、kernel 和 rootfs的分区组织。
可以看到,我们的应用程序,最终是放在在文件系统上执行的。
总结
一个完整嵌入式系统执行:bootloader引导启动内核;内核挂在根文件系统和普通文件系统;在文件系统下执行特定的应用程序。