嵌入式Linux系统运行基础组件及其概念

系统运行基础组件:uboot、内核(kernel)、设备树(dtb)、根文件系统(rootfs)

Linux烧录文件
u-boot
【u-boot.imx】 u-boot的镜像文件
内核(kernel) zImage】 内核的镜像文件
设备树(dtb) 【xx.dtb】
根文件系统(rootfs) 【rootfs.tar.bz2】rootfs打包

uboot

U-Boot 的主要作用是用来启动操作系统内核,它分为两个阶段,即 boot + loaderboot 阶段启动系统,初始化硬件设备,建立内存空间映射图,将系统的软硬件带到一个合适的状态,loader 阶段将操作系统内核文件加载至内存,之后跳转到内核所在地址运行。

下载模式:(开发人员调试)从内存中的 ELF 镜像启动,从内存启动应用程序镜像,使用 BOOTP/TFTP 协议通过网络启动镜像,打印控制台设备和信息,打印有关文件系统的信息,列出目录中的文件等等。

启动模式:直接可以启动操作系统运行。

第一阶段:
  • 硬件设备初始化。
  • 加载 U-Boot 第二阶段代码到 RAM 空间。
  • 设置好栈。
  • 跳转到第二阶段代码入口。
第二阶段:
  • 初始化本阶段使用的硬件设备。
  • 检测系统内存映射。
  • 将内核从存储区域(FlashSD CardeMMC)读取到 RAM 中。
  • 为内核设置启动参数。
  • 调用内核

 

内核(kernel)

Linux 内核采用宏内核架构,即 Linux 大部分功能都会在内核中实现,如进程管理、内存管理、设备管理、文件管理以及网络管理等功能,它们是运行在内核空间中(也可以称之为特权模式下运行)。而微内核,它仅仅是将内核的基本功能放入内核中,如进程管理、进程调度等,而其他的设备管理、文件管理等功能都放在内核空间之外(即运行在非特权模式下)。

Linux 内核组成

Linux 内核主要由 5 部分组成,分别为:进程管理子系统,内存管理子系统,文件子系统,网络子系统,设备子系统。

由系统调用层(系统调用子系统)进行统一管理,应用层通过系统调用层的函数接口与内核进行交互,用户应用程序执行的

地方是用户空间,用户空间之下则是内核空间Linux 内核正是位于内核空间中。

嵌入式Linux系统运行基础组件及其概念

 

设备树(dtb)

  • 设备树源码(Device Tree SourceDTS
  • 设备树编译工具(Device Tree Compiler,DTC)
  • 二进制格式设备树(Device Tree BlobDTB

因为 Uboot Linux 不能直接识别 DTS 文件,它们只能识别二进制文件,所以需要把 DTS 文件编译成 DTB 文件,而 DTC 就是将设备树源码文件(.dts / .dtsi)编译成二进制格式设备树文件(.dtb)的编译工具,它位于 Linux 内核源码的 scripts/dtc 目录。

Linux 的设备树中,可描述的硬件信息包括以下几类:
  • CPU 的数量和类别
  • 存基地址和大小
  • 总线和桥
  • 外设连接
  • 中断控制器和中断使用情况
  • GPIO 控制器和 GPIO 使用情况
  • Clock 控制器和 Clock 使用情况

 DTS 的加载过程:

嵌入式Linux系统运行基础组件及其概念

1、将硬件配置和系统运行参数组成 Device Tree Source (DTS/DTSI)文件
2、用DTC 工具将DTS/DTSI 文件编译成DTB 文件
3、加载到 Linux 内核中,让内核来识别这些信息
4、在系统启动时,BootLoader 会将保存在 flash 中的 DTB 拷贝到内存,并把 DTB 在内存中的起始地址传递给内核
 

 

根文件系统(rootfs)

根文件系统首先是内核启动时所 mount(挂载)的第一个文件系统,内核代码映像文件保存在根文件系统中,而系统引导启动程序会在根文件系统挂载之后从中把一些基本的初始化脚本和服务等加载到内存中去运行。

  • 根文件系统(rootfs)是 linux 在初始化时加载的第一个文件系统,而非文件管理子系统中的文件系统。
  • 根文件系统包括根目录和真实文件系统
  • 根文件系统包含系统引导和使其他文件系统得以挂载(mount)所必要的文件
  • 根文件系统包含 Linux 启动时所必须的目录和关键性的文件
  • 根文件系统还包括了许多的应用程序 bin 目录等
  • 根文件系统是 Linux 内核启动以后挂载(mount)的第一个文件系统,然后从根文件系统中读取初始化脚本,比如 rcSinittab 等。根文件系统和 Linux 内核是分开的,单独的 Linux 内核是没法正常工作的,必须要搭配根文件系统。如果不提供根文件系统,Linux 内核在启动的时候就会提示内核崩溃(Kernel panic)的提示。

  • 根文件系统的目录名字为‘/’

根目录下子目录和文件:
 
 
/bin
系统需要的可执行文件,一般都是一些命令,比如 lsmv 等命令。此目录下的命令所有的客户都可以使用。
/dev
设备文件
/etc
配置文件
/lib
Linux 所必须的库文件。共享库。命令和用户编写的应用程序要使用这些库文件
/mnt
临时挂载目录,一般是空目录,可以在此目录下创建空的子目录(如/mnt/sd/mnt/usb)
/proc
一般是空目录,文件都是临时存在,一般用来存储系统运行信息文件。(虚拟文件系统,没有实际的存储设备)
/usr
(Unix Software Resource)Unix 操作系统软件资源目录
/var
存放一些可以改变的数据
/sbin
存放可执行文件,但是此目录下的文件或者说命令只有管理员才能使用,主要用户系统管理。
/sys
系统设备管理的重要目录,此目录通过一定的组织结构向用户提供详细的内核数据结构信息
/opt
可选的文件、软件存放区,由用户选择将哪些文件或软件放到此目录中。