ARM嵌入式设备Linux系统启动步骤和方式
1). 简介
本文简单介绍ARM嵌入式设备基于嵌入式Linux操作系统时候的启动步骤和启动方式, 区别与X86平台,ARM平台下并没有一个标准的启动步骤,不同ARM SoC都会使用各自定义的boot ROM来实现启动过程,不过大体上面都包含有一些基本步骤。本文就基于Toradex ARM计算机模块和配套载板来介绍基于Freescale i.MX6 ARM嵌入式设备的启动步骤和方式。
2). 启动步骤
a). 电源上电,系统Reset。
b). CPU内部boot ROM读取, strapping GPIO数值锁定。
c). 根据strapping GPIO值和SoC 内部fuse设置确定用于启动的设备。
d). 从启动设备起始位置读取用于配置DDR RAM和定位boot loader的配置信息。对于i.MX6平台,则使用'image vector table (IVT)' 和 'device configuration data (DCD)' ,如果从NAND设备启动,则还包括 'boot control blocks (BCB)'。
e). DDR RAM被boot ROM初始化。
f). boot loader从启动设备复制到RAM执行,至此系统控制交由boot loader.也是从这里,一些定制代码才可以在boot loader里面开始执行。当然也有一些SoC是先将boot loader复制到SDRAM执行后再由boot loader来初始化DDR RAM。
Toradex ARM核心板使用定制化的U-boot作为boot loader,下面就基于此来继续boot loader加载后的启动过程。
g). U-Boot从启动设备上面读取环境变量,如果变量数据损坏或者不存在,则会提示'*** Warning - bad CRC, using default environment' ,然后加载默认初始设置.
h). U-Boot通过分析环境变量获得kernel和rootfs存储位置,以及所需的kernel command line
i). U-Boot 自动检测系统RAM和eMMC/Nand Flash容量和参数
j). U-Boot 设置以太网口MAC地址,并配置好硬件准备加载Linux kernel
k). U-Boot 加载Linux kernel到RAM,至此系统控制权则转移到kernel来处理
l). 系统Kernel初始化Linux,加载rootfs,最后启动'init'来初始化Linux user space
3). 启动方式
a). 默认方式, U-Boot, kernel和rootfs都位与模块自带的eMMC上,全部从eMMC启动。通常情况下的基本模式
b). U-Boot位于eMMC,从eMMC启动;而kernel和rootfs位于SD卡,从SD卡启动。常用于切换不同的kernel和rootfs版本
c). U-Boot位于eMMC,从eMMC启动;而kernel从TFTP加载,rootfs从NFS加载。常用于kernel和application开发调试阶段
4). 不同启动方式演示
这里使用Toradex Apalis i.MX6Q 计算机模块配合Apalis Eva 开发载板来进行测试,平台基本的操作上手指南请见这里。
软件使用Toradex官方发布的Linux V2.5beta3版本,请从这里下载。
a). 全部从eMMC启动
模块默认的U-Boot设置即为全部从eMMC启动,开机上电即可
b). Kernel和rootfs从SD卡启动
./ 准备SD卡:将SD卡(几百MB容量以上,这里使用8GB)分为2个分区,第一个分区为FAT32格式,一般几十MB即可,这里演示操作为1GB;另外一个分区为ext3格式,分配为剩下SD卡容量。
----------------------------------
$ sudo fdisk /dev/sdc
...
命令(输入 m 获取帮助): p
Disk /dev/sdc: 7744 MB, 7744782336 bytes
255 heads, 63 sectors/track, 941 cylinders, total 15126528 sectors
Units = 扇区 of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
设备 启动 起点 终点 块数 Id 系统
/dev/sdc1 2048 2099199 1048576 c W95 FAT32 (LBA)
/dev/sdc2 2099200 15126527 6513664 83 Linux
$ sudo mkfs.vfat -F 32 -n boot /dev/sdc1
$ sudo mkfs.ext3 -L fs /dev/sdc2
----------------------------------
./ 制作启动SD卡
// 复制Linux image 压缩包里面的kernel和device tree文件到FAT32分区
----------------------------------
$ cd .../Apalis_iMX6_LinuxImageV2.5/apalis-imx6_bin
$ cp uImage--3.14.28+gitr0632def1c9981e3974f724025f39b2c1588d8ee6-V2.5b3-apalis-imx6-20151215145612.bin /media/username/boot/uImage
$ cp uImage--3.14.28+gitr0632def1c9981e3974f724025f39b2c1588d8ee6-V2.5b3-imx6q-apalis-eval-20151215145612.dtb /media/simon/boot/imx6q-apalis-eval.dtb
----------------------------------
// 复制Linux image 压缩包里面的rootfs文件夹内容到ext3分区
----------------------------------
$ cd .../Apalis_iMX6_LinuxImageV2.5
$ sudo cp -Ppr rootfs/* /media/simon/fs/
----------------------------------
./ 将S
- Linux嵌入式系统开发平台选型探讨(11-09)
- 基于ARM体系的嵌入式系统BSP的程序设计方案(04-11)
- 在Ubuntu上建立Arm Linux 开发环境(04-23)
- 达芬奇数字媒体片上系统的架构和Linux启动过程(06-02)
- SQLite嵌入式数据库系统的研究与实现(02-20)
- 革新2410D开发板试用手记(04-21)