ARM Linux特指运行于ARM架构处理器平台的Linux,区别于运行于PC上的X86 Linux。
ARM架构处理器多用在嵌入式系统中,通常被集成到片上系统(SoC)。由于片上系统整合外部设备控制器的多样性,对于任何一片特定的片上系统,需要对ARM Linux进行定制,以使集成在片上系统中的各项功能可用,这个过程称为ARM Linux移植。
ARM Linux移植的主要工作:1)Bootloader移植;2)ARM Linux内核移植;3)根文件系统制作。完成这三项基本工作之后,就可以在运行于片上系统之上的ARM Linux基础上开发针对特定需求的应用,包括推迟到开发阶段的驱动程序、应用程序等。
1)Bootloader移植。
ARM Linux内核被设计为尽可能平台无关,而Bootloader则负责提供板级支持包(BSP)的功能,在为ARM Linux内核提供基本的运行环境之后,如CPU可用、内存可用,便可加载ARM Linux内核,并将系统控制权完全交给ARM Linux内核。这个过程称为引导ARM Linux内核。一般来讲,Bootloader是特定于硬件平台的,但是由于某些开源Bootloader,如UBOOT的存在,使得开发人员可以对既有Bootloader进行尽可能少量的修改,便可将其用来在特定目标板上引导ARM Linux内核。
UBOOT引导ARM Linux内核的一般流程:初始化CPU环境,如关中断、设定运行模式 --> 初始化DRAM控制器,以使内存可用 --> 如有必要,初始化串口用于输出引导信息,初始化网口用于下载ARM Linux内核镜像 --> 加载ARM Linux内核镜像 --> 为ARM Linux内核准备参数,将控制流转到ARM Linux内核入口。
2)ARM Linux内核移植。
ARM Linux内核接受Bootloader的引导参数,如DRAM大小和起始地址、用作Console的设备的名称、根文件系统的位置。为了使ARM Linux内核能够正常使用片上系统芯片内部及目标板上的各种功能,在这个过程中需要在ARM Linux内核代码中加入平台特定的一些代码,通常将这些代码存放在arch/arm目录下的某个机器特定的目录中。ARM Linux内核中已经包含了大量平台特定的代码,但相比平台的多样性,这些代码还是不够的。 在编译生成ARM Linux内核镜像之前,需要对ARM Linux内核进行必要的配置,使在内核代码中实现的某项功能被加入或不加入ARM Linux内核,如加入对mini2440目标板和smdk2440目标板的支持、加入针对三星SoC串口的驱动、不加入FAT文件系统。需要说明一下,ARM Linux内核可以同时支持多种目标板(或称机器类型),但在启动的时候只会根据Bootloader在R1寄存器中指定的机器码来选定一款支持的机器类型,在执行平台无关代码之前进行与选定机器类型平台相关的初始化工作。在平台相关的初始化工作中可以将目标板上的各种功能都初始化,也可什么都不做,而将这些工作推迟到开发阶段来完成。
3)根文件系统制作。
如果ARM Linux内核启动后不需要访问文件系统,就不需要做这项工作。但是大多数情况下,ARM Linux内核在启动后会从文件系统中读取配置文件,并根据配置文件中的内容完成更多的工作,如启动必要的工作进程,使系统进入到指定的工作状态。在ARM Linux内核的启动参数中,initrd指定ARM Linux内核启动后需要执行的程序,ARM Linux内核从指定的根文件系统中加载这个程序并用其创建init进程。init进程做什么工作则是由这个指定的程序来决定的。可能的工作,如启动一个Shell程序或者打开一个图形用户界面。BusyBox提供了一个用于此目的的程序,名称为linuxrc,可以将linuxrc配置为启动一个类似于Linux中的bash的Shell程序,BusyBox同样提供了这个Shell程序。