目录
总流程
嵌入式SoC从上电到运行Linux系统,主要步骤就4个:1、执行SoC内置ROM中的启动程序;2、启动程序执行Uboot;3、Uboot加载内核程序;4、内核初始化完就创建init进程(第一个用户进程)。如下图,下面对这四个过程进行简要介绍
一、执行SoC内置ROM中的启动程序
这个SoC内置ROM中的启动程序在PC/服务器中就对应着BIOS,启动程序主要做下面3个事情
1、电源自检
SoC通电后,启动程序会先进行电源自检(POST),检查各硬件是否正常并进行初始化。例如初始化CPU等。
2、找到启动设备
启动设备就是存放Uboot和Linux内核映像的设备,例如SD卡、EMMC、NAND等,要是购买了Linux开发板就可以看到有专门的拨片开关用来选择启动设备。
3、执行Uboot
找到启动设备后,会跳转并执行Uboot。(对于PC/服务器,会用到MBR和PBR。而SoC就要看具体的硬件设计)
二、执行Uboot
Uboot是最常见的一种Bootloader(引导加载程序,也叫自举程序),用来初始化硬件和加载内核程序。uboot的执行过程分为两个阶段。这一部分的详细过程可以看文章最后的参考文章
第一阶段(汇编)
- 硬件初始化。设置时钟,然后关闭中断和MMU这些。
- 初始化内存空间(为加载第二阶段代码做准备)
- 把第二阶段代码拷贝到内存中,然后跳转
第二阶段(C语言)
- 初始化要用到的硬件(例如初始化串口给程序员与Uboot交互)
- 检测内存映射,确定板子上的内存长度和地址
- 为内核设置启动参数
- 把内核程序加载到内存中,然后跳转到内核来执行内核程序(在内核调用之前,中断和MMU是要一直关闭的)
三、执行内核程序
uboot启动内核后,由内核程序完成各种初始化任务,如内存管理、设备驱动程序等。初始化完成后会创建一个用户空间进程,然后该进程会创建init进程。
四、创建init进程
init是第一个用户空间进程,它的工作主要有:1、运行系统初始化脚本来启动各种系统服务,如网络服务、挂载文件系统等;2、管理系统的运行级别,例如单/多用户模式、图形界面模式等;3、运行守护进程(在后台运行的进程),例如下面的登录管理器。
登陆管理器进程:该进程处理用户的登录和注销,它会提供用户登录界面,用户登录后就启动Shell进程(命令行)或图形用户界面,进而创建用户会话。然后用户就可以使用操作系统了,这就是Linux系统开机的整个流程。
最后
补充
1、根文件系统:根文件系统会根据类型在Uboot的第二阶段或内核程序阶段挂载。
2、中断向量:在Uboot阶段设置的
参考
1、超详细分析Bootloader(Uboot)到内核的启动流程(万字长文!)_bootloader启动过程-CSDN博客
2、GPT以及网上的一些文章