服务器测评网
我们一直在努力

ARM Linux启动过程中U-Boot与Linux内核是如何交接的?

上电与固件初始化

ARM Linux启动的第一步始于硬件上电复位(POR),当电源稳定后,芯片内部的复位电路会触发CPU执行预设地址处的指令,在大多数ARM平台上,这个地址通常是片上系统(SoC)集成的固化ROM(Boot ROM)或可编程只读存储器(PROM),Boot ROM包含初始引导程序(如二级程序加载器SPL或固化引导代码),其核心任务是进行最底层的硬件初始化,包括配置时钟系统、初始化内存控制器(通常是DDR SDRAM控制器),以及设置基本的调试接口(如UART或JTAG),这一阶段不涉及操作系统,仅确保硬件基础可用,为后续代码加载做准备。

ARM Linux启动过程中U-Boot与Linux内核是如何交接的?

引导加载程序(Bootloader)启动

硬件初始化完成后,Boot ROM会根据预设的启动介质优先级(如eMMC、SD卡、NAND闪存或网络)加载引导加载程序,在ARM Linux生态中,常见的引导加载程序包括U-Boot、Das U-Boot或轻量级的ATF(ARM Trusted Firmware),引导加载程序被加载到内存(通常是RAM)的特定地址(如0x40000000)后,CPU开始执行其代码,引导加载程序的主要职责包括:

  • 硬件进一步初始化:配置串口、网卡、存储控制器等外设,为操作系统提供完整的硬件环境。
  • 加载内核与设备树:从存储介质中读取Linux内核镜像(zImage或Image)和设备树blob(DTB),并将它们加载到RAM中,设备树是ARM Linux的关键特性,用于描述硬件拓扑结构,解决传统嵌入式系统中硬件配置硬编码的问题。
  • 启动参数传递:通过启动参数(如ATAGs或设备树中的chosen节点)向内核传递内存布局、根文件系统位置、启动命令行等信息。

Linux内核初始化

引导加载程序完成加载后,会跳转到内核入口点(通常在arch/arm/kernel/head.S中定义),内核启动过程可分为以下阶段:

ARM Linux启动过程中U-Boot与Linux内核是如何交接的?

  • 体系结构相关初始化:CPU设置(如MMU、缓存、异常向量表)、内存管理单元(MMU)初始化,以及解压压缩的内核镜像(若使用zImage)。
  • 设备树解析:内核解析设备树,动态识别硬件资源(如CPU数量、内存节点、外设地址),并生成对应的平台设备。
  • 核心子系统初始化:包括进程调度器、中断控制器(如GIC)、定时器、以及虚拟文件系统(VFS)等核心内核组件的初始化。
  • 驱动模型构建:基于设备树信息,内核通过driver model框架逐个初始化设备驱动,如串口驱动、存储驱动(如MMC、SATA)和网卡驱动。

内核启动与第一个进程

内核初始化接近完成时,会调用start_kernel()函数,最终通过rest_init()创建第一个用户态进程——init进程(PID为1)。init进程是所有用户态进程的祖先,其任务是根据配置文件(如/init/rc.confsystemd配置)启动系统服务,在嵌入式系统中,init进程可能直接挂载根文件系统(如initramfs或直接挂载的块设备文件系统),并启动系统守护进程(如/sbin/initsystemd或轻量级的busybox init)。

用户态空间启动

随着init进程的启动,系统进入用户态空间,这一阶段的主要任务包括:

ARM Linux启动过程中U-Boot与Linux内核是如何交接的?

  • 文件系统挂载:根据/etc/fstabsystemd单元文件挂载必要的文件系统,如/proc/sys/tmp以及用户数据分区。
  • 服务启动:通过systemdSysVinitOpenRC等初始化系统启动后台服务,如网络管理(NetworkManager)、日志服务(syslog)、设备管理(udev)以及业务相关的应用程序。
  • 用户交互:对于带图形界面的系统,会启动显示管理器(如lightdm)和桌面环境(如LXDE、GNOME);对于无界面系统,则可能直接提供命令行终端(如getty)。

ARM Linux启动过程是一个从硬件到软件、从内核态到用户态的渐进式初始化流程,从Boot ROM的底层硬件配置,到引导加载程序加载内核与设备树,再到内核解析硬件并启动核心子系统,最终由用户态init进程构建完整的系统服务环境,每一步都紧密衔接,共同实现从“上电”到“可用系统”的转变,这一过程充分体现了ARM Linux在嵌入式领域的灵活性与可扩展性,使其能够适配从嵌入式设备到边缘计算平台的多样化硬件平台。

赞(0)
未经允许不得转载:好主机测评网 » ARM Linux启动过程中U-Boot与Linux内核是如何交接的?