工控网首页
>

应用设计

>

ARM嵌入式设备Linux系统启动步骤和方式

ARM嵌入式设备Linux系统启动步骤和方式

1). 简介

本文简单介绍ARM嵌入式设备基于嵌入式Linux操作系统时候的启动步骤和启动方式, 区别与X86平台,ARM平台下并没有一个标准的启动步骤,不同ARM SoC都会使用各自定义的boot ROM来实现启动过程,不过大体上面都包含有一些基本步骤。本文就基于Toradex ARM计算机模块和配套载板来介绍基于Freescale i.MX6 ARM嵌入式设备的启动步骤和方式。

2). 启动步骤

a). 电源上电,系统Reset

b). CPU内部boot ROM读取, strappingGPIO数值锁定。

c). 根据strapping GPIO值和SoC 内部fuse设置确定用于启动的设备。

d). 从启动设备起始位置读取用于配置DDRRAM和定位boot loader的配置信息。对于i.MX6平台,则使用'image vector table (IVT)' 'deviceconfiguration data (DCD)' ,如果从NAND设备启动,则还包括 'boot control blocks (BCB)'

e). DDR RAMboot ROM初始化。

f). boot loader从启动设备复制到RAM执行,至此系统控制交由bootloader.也是从这里,一些定制代码才可以在boot loader里面开始执行。当然也有一些SoC是先将boot loader复制到SDRAM执行后再由boot loader来初始化DDR RAM

Toradex ARM核心板使用定制化的U-boot作为boot loader,下面就基于此来继续bootloader加载后的启动过程。

g). U-Boot从启动设备上面读取环境变量,如果变量数据损坏或者不存在,则会提示'*** Warning - bad CRC, using default environment' ,然后加载默认初始设置.

h). U-Boot通过分析环境变量获得kernelrootfs存储位置,以及所需的kernelcommand line

i). U-Boot 自动检测系统RAMeMMC/NandFlash容量和参数

j). U-Boot 设置以太网口MAC地址,并配置好硬件准备加载Linuxkernel

k). U-Boot 加载Linux kernelRAM,至此系统控制权则转移到kernel来处理

l). 系统Kernel初始化Linux,加载rootfs,最后启动'init'来初始化Linuxuser space

3). 启动方式

a). 默认方式, U-Boot, kernelrootfs都位与模块自带的eMMC上,全部从eMMC启动。通常情况下的基本模式

b). U-Boot位于eMMC,从eMMC启动;而kernelrootfs位于SD卡,从SD卡启动。常用于切换不同的kernelrootfs版本

c). U-Boot位于eMMC,从eMMC启动;而kernelTFTP加载,rootfsNFS加载。常用于kernelapplication开发调试阶段

4). 不同启动方式演示

这里使用ToradexApalis i.MX6Q计算机模块配合ApalisEva 开发载板来进行测试,平台基本的操作上手指南请见这里

软件使用Toradex官方发布的LinuxV2.5beta3版本,请从这里下载。

a). 全部从eMMC启动

模块默认的U-Boot设置即为全部从eMMC启动,开机上电即可

b). KernelrootfsSD卡启动

./ 准备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 = 512bytes

Sector size (logical/physical): 512 bytes /512 bytes

I/O size (minimum/optimal): 512 bytes / 512bytes

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 压缩包里面的kerneldevice tree文件到FAT32分区

----------------------------------

$ cd.../Apalis_iMX6_LinuxImageV2.5/apalis-imx6_bin

$ cpuImage--3.14.28+gitr0632def1c9981e3974f724025f39b2c1588d8ee6-V2.5b3-apalis-imx6-20151215145612.bin/media/username/boot/uImage

$ cpuImage--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/

----------------------------------

./ SD卡插入Apalis Eva载板8-bit SD卡插槽, 开机上电进入uboot

----------------------------------

Apalis iMX6 # printenv

...

fdt_file=imx6q-apalis-eval.dtb //确保device tree文件和上面FAT32分区里面的命名一致

...

Apalis iMX6 # run sdboot

----------------------------------

./ 启动后就可以进行正常的应用开发测试了.

c).TFTP/NFS加载kernel/filesystem启动

./ 默认目标版系统和开发主机已经在同一局域网内并通过网内DHCP服务器自动取得IP地址,如果需要手动搭建DHCP服务器,请参考这里。

./ 配置TFTP Server

// Ubuntu 开发主机通过下面命令建立TFTPServer

----------------------------------

$ sudo apt-get install tftpd-hpa

$ sudo vi /etc/default/tftpd-hpa

//默认tftp server配置,也可以更换目录,不过需要修改目录group为”nogroup

$ sudo vi /etc/default/tftpd-hpa

TFTP_USERNAME="tftp"

TFTP_DIRECTORY="/var/lib/tftpboot"

TFTP_ADDRESS="[::]:69"

TFTP_OPTIONS="--secure"

$ sudo service tftpd-hpa start

//如已经启动,重新加载配置,则可运行

$ sudo service tftpd-hpa force-reload

----------------------------------

// 复制kerneldevice tree文件到TFTPServer文件夹

----------------------------------

$ cd .../Apalis_iMX6_LinuxImageV2.5/apalis-imx6_bin

$ sudo cpuImage--3.14.28+gitr0632def1c9981e3974f724025f39b2c1588d8ee6-V2.5b3-apalis-imx6-20151215145612.bin/var/lib/tftpboot/uImage

$ sudo cpuImage--3.14.28+gitr0632def1c9981e3974f724025f39b2c1588d8ee6-V2.5b3-imx6q-apalis-eval-20151215145612.dtb/var/lib/tftpboot/imx6q-apalis-eval.dtb

----------------------------------

./ 配置NFS Server

// Ubuntu 开发主机通过下面命令建立NFSServer

----------------------------------

$ sudo apt-get install nfs-kernel-server

$ sudo vi /etc/exports

//增加下面NFS配置, 10.20.1.111/24’为开发主机IP/Mask配置

/srv/nfs10.20.1.111/24(no_root_squash,no_subtree_check,rw,fsid=root)

$ sudo service nfs-kernel-server restart

----------------------------------

// 复制rootfs文件到NFS Server文件夹

----------------------------------

$ cd .../Apalis_iMX6_LinuxImageV2.5

$ sudo cp -Ppr rootfs/* /srv/nfs/

----------------------------------

./ 配置Apalis i.MX6目标系统

//开机上电进入Uboot,修改如下参数

----------------------------------

# setenv serverip ‘10.20.1.111’  //TFTP Server IP

# setenv nfsargs ‘ip=10.20.1.115:10.20.1.111:10.20.1.1:255.255.255.0::eth0:onroot=/dev/nfs nfsroot=10.20.1.111:/srv/nfs rw netdevwait’

// ip = 目标板IP:NFS Server IP:网关:Mask

// 启动NFS boot

# run nfsboot

----------------------------------

5). 总结

由上可见,在ARM平台使用和开发的时候可以灵活利用各种启动方式,提供更为方便和高效的开发或使用过程。

参考文档

http://developer.toradex.com/knowledge-base/linux-booting

投诉建议

提交

查看更多评论
其他资讯

查看更多

在 Linux 系统上 Docker 容器的性能影响

上游优先 - Toradex 采用主线内核支持

NXP iMX8M Plus M7核心FreeRTOS开发

嵌入式Linux上使用Ramoops

使用容器编译Yocto镜像