【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读取, 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/
----------------------------------
./ 将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/file system启动
./ 默认目标版系统和开发主机已经在同一局域网内并通过网内DHCP服务器自动取得IP地址,如果需要手动搭建DHCP服务器,请参考这里。
./ 配置TFTP Server
// 在Ubuntu 开发主机通过下面命令建立TFTP Server
----------------------------------
$ 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
----------------------------------
// 复制kernel和device tree文件到TFTP Server文件夹
----------------------------------
$ cd .../Apalis_iMX6_LinuxImageV2.5/apalis-imx6_bin
$ sudo cp uImage--3.14.28+gitr0632def1c9981e3974f724025f39b2c1588d8ee6-V2.5b3-apalis-imx6-20151215145612.bin /var/lib/tftpboot/uImage
$ sudo cp uImage--3.14.28+gitr0632def1c9981e3974f724025f39b2c1588d8ee6-V2.5b3-imx6q-apalis-eval-20151215145612.dtb /var/lib/tftpboot/imx6q-apalis-eval.dtb
----------------------------------
./ 配置NFS Server
// 在Ubuntu 开发主机通过下面命令建立NFS Server
----------------------------------
$ sudo apt-get install nfs-kernel-server
$ sudo vi /etc/exports
//增加下面NFS配置, ‘10.20.1.111/24’为开发主机IP/Mask配置
/srv/nfs 10.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:on root=/dev/nfs nfsroot=10.20.1.111:/srv/nfs rw netdevwait’
// ip = 目标板IP:NFS Server IP:网关:Mask
// 启动NFS boot
# run nfsboot
----------------------------------
5). 总结
由上可见,在ARM平台使用和开发的时候可以灵活利用各种启动方式,提供更为方便和高效的开发或使用过程。
【ARM-Linux开发】ARM嵌入式设备Linux系统启动步骤和方式的更多相关文章
- 【Linux开发】如何查看Linux kernel的内置模块驱动列表和进程ID
[Linux开发]如何查看Linux kernel的内置模块驱动列表和进程ID 标签:[Linux开发] 命令: cat /lib/modules/$(uname -r)/modules.builti ...
- 【DSP开发】【Linux开发】IIC设备驱动程序
IIC设备是一种通过IIC总线连接的设备,由于其简单性,被广泛引用于电子系统中.在现代电子系统中,有很多的IIC设备需要进行相互之间通信 IIC总线是由PHILIPS公司开发的两线式串行总线,用于连接 ...
- 基于QEMU的ARM Cortex-A9开发板Vexpress-ca9的Linux内核的编译和运行
宿主机:Ubuntu16.04 x64(Linux内核4.4.0) 交叉编译工具链:gcc-arm-linux-gnueabiarm-linux-gcc:4.4.3QEMU:2.5.0Linux ke ...
- 【Linux开发】彻底释放Linux线程的资源
Linux系统中程序的线程资源是有限的,表现为对于一个程序其能同时运行的线程数是有限的.而默认的条件下,一个线程结束后,其对应的资源不会被释放,于是,如果在一个程序中,反复建立线程,而线程又默认的退出 ...
- 【Linux开发】如何更改linux文件的拥有者及用户组(chown和chgrp)
本文整理自: http://blog.163.com/yanenshun@126/blog/static/128388169201203011157308/ http://ydlmlh.iteye.c ...
- .NET Core / C# 开发 IOT 嵌入式设备的个人见解
https://www.cnblogs.com/whuanle/p/10589496.html
- 嵌入式设备上的 Linux 系统开发
转载:http://www.ibm.com/developerworks/cn/linux/embed/embdev/index.html 如果您刚接触嵌入式开发,那么大量可用的引导装载程序(bo ...
- 嵌入式Linux开发教程:Linux常见命令(上篇)
摘要:这是对周立功编著的<嵌入式Linux开发教程>的第7期连载.本期刊载内容有关LinuxLinux常见命令中的导航命令.目录命令和文件命令.下一期将连载网络操作命令.安装卸载文件系统等 ...
- 嵌入式Linux开发——内容介绍与开发环境的搭建
嵌入式Linux开发步骤 设计自己的硬件系统 编写Bootloader 裁剪自己的Linux内核 开发移植设备驱动 构建根文件系统 开发应用程序 嵌入式Linux学习要点 熟练使用开发工具和相关指令集 ...
随机推荐
- wordpress调用指定分类除外的置顶文章
我们有时需要根据实际需要进行一些设置,比如wordpress调用指定分类除外的置顶文章,如何实现呢?随ytkah一起来看看吧,用如下代码插入到需要调取的位置 <div class="r ...
- Object archiving
https://developer.apple.com/library/content/documentation/General/Conceptual/DevPedia-CocoaCore/Arch ...
- node.js – 服务器端的客户端证书验证,DEPTH_ZERO_SELF_SIGNED_CERT错误
我正在使用节点0.10.26并尝试建立与客户端验证的https连接. 服务器代码: var https = require('https'); var fs = require('fs'); proc ...
- Ansible自动部署tomcat
1.首先准备3台机器 ansible机器:192.168.52.34 目标主机:192.168.52.35 目标主机:192.168.52.36 2.关闭防火墙 [root@localhost ~]# ...
- 【转载】java.util.ServiceConfigurationError: com.sun.tools.attach.spi.AttachProvider
https://blog.csdn.net/zqz_zqz/article/details/80922164 window上运行以下代码获取jvm进程: List<VirtualMachineD ...
- 3495: PA2010 Riddle 2-sat 前缀优化
3495: PA2010 Riddle 2-sat 前缀优化 链接 bzoj 思路 不想说啥了,看hwim的吧,我去睡觉了zZ. 代码 /******************************* ...
- 终于明白为什么要加 final 关键字了!
阅读本文大概需要 2.8 分钟. 来源: www.jianshu.com/p/acc8d9a67d0c 在开发过程中,由于习惯的原因,我们可能对某种编程语言的一些特性习以为常,特别是只用一种语言作为日 ...
- fdisk、mkfs.ext4、make_ext4fs、img2simg、simg2img
一个典型的嵌入式系统是由uboot+kernel+rootfs组成的,其中uboot和kernel都是二进制,rootfs存在文件系统. 二进制在烧录的时候比较简单,将二进制数据写入存储设备固定地址: ...
- win10教育版永久激活密钥 win10教育版激活码 win10教育版产品密钥2018(第三种方法亲测可用!)
有没有最新win10教育版激活密钥?win10教育版功能比较全面,增加了一些学术上需要的功能.有用户装了win10教育版,提示需要产品密钥,网上找到的win10教育版永久激活码大多失效,这边小编为大家 ...
- KCP TCP是为流量设计的(每秒内可以传输多少KB的数据),讲究的是充分利用带宽。而KCP是为流速设计的(单个数据包从一端发送到一端需要多少时间)
http://www.skywind.me/blog/archives/1048 KCP是一个快速可靠协议,能以比 TCP浪费10%-20%的带宽的代价,换取平均延迟降低 30%-40%,且最大延迟降 ...