启动开发板以后,首先执行的是U-boot,也就是引导装入程序。先说一下U-boot,它类似于我们计算机中的BIOS,在系统上电以后,他会完成下面几个重要的任务:
初始化相关的硬件组件
初始化系统内存,准备将系统的控制权交给相应的系统
分配系统的资源
提供相应的机制,用于定位和加载系统镜像
加载操作系统,并将控制权移交给操作系统
这个过程其实就是一些底层硬件初始化的工作,包括包括串行通信端口的配置,内部时钟配置以及一些子硬件系统(I2C、DRAM、Flash、网络子系统等)的配置。另外,U-boot有一个控制台模式,它会等待用户一段时间,等待用户给他一个信息(回车),让他进入控制台模式。如果等待的时间过了用户没有任何操作,系统就继续往下走了。
在U-boot完成初始化工作以后,它剩下的唯一工作就是加载并启动linux操作系统的内核了。当U-boot开始加载指定物理地址的操作系统内核以后,U-boot引导装入程序的使命就到此结束了,接下来系统由linux内核接管。要注意此时和BIOS的区别,此时linux操作系统内核从U-boot那里接手了所有的内存以及系统资源,U-boot无法再获得控制权,如果U-boot想再获得控制权,唯一的办法就是重新启动。
当linux内核开始启动以后,开始打印各种设备信息,此时做的工作就是对各个外设进行驱动初始化,让他们各就各位。在执行完这些操作以后就要开始挂载根文件系统了。
题外话:什么是根文件系统?他就类似于windows里面的文件管理器,通常文件系统中包含了很多的应用程序、系统库以及组成GNU/Linux系统的各种使用工具。在加载文件系统的时候,会执行里面的应用程序,一条条执行,也就出现的我们的操作系统。文件系统还包含了还预定义的系统目录树以及文件,这也就是我们操作系统的工作目录。
到目前这个时候,还是内核在进行工作,内核拥有所有的系统内存以及能够使用所有资源的权限,因此可以访问所有物理地址的内存以及所有的I/O子系统。
当内核完成挂载文件系统的工作以后,就要开始运行一个启动名为init的应用程序。此时,系统便进入了用户空间,在这种操作模式下,将不能再像内核进程中那样直接访问所有的资源权限。这也就解释了我们在编写程序的时候通过内核系统的调用来请求相应的内核服务。
最后,需要提的是,我们所有的用户空间进程以及应用程序都是在虚拟内存空间中执行的。虚拟内存空间由内核进行随机分配和管理,内核和处理器的内存管理单元(也就是MMU)配合,完成虚拟地址到物理地址的转换。这种体系结构的最大好处就是,一个用户进程的内存空间进程的错误不会引起其他内存空间的错误。
————————————————
在原作者基础上,对封面图作一点优化
启动流程也可大致分为以下几步
[1]iROM固化代码(基本硬件初始化,判别启动方式(SD/USB/EMMC),
读取存储介质一部分数据到iRAM
)
[2]iRAM代码运行bootloader第一阶段(初始化系统时钟,初始化内存,搬移bootloader到内存)
[3]内存中运行bootloader第二阶段(初始化基本的硬件设备(串口,EMMC,SD),加载OS到内存)
[4]内存中运行操作系统(Linux,windows CE,Mac OS)
[5]挂载文件系统
[6]运行应用程序
bootloader = BIOS + 引导程序
转载自 Zhang_S_Q
原文链接:https://blog.youkuaiyun.com/Zhang_S_Q/article/details/98644778