u-boot加载内核并挂载根文件系统(mini2440)
本文主要记录了在mini2440开发板上烧入u-boot,使用u-boot引导内核启动,并通过nfs挂载根文件系统的过程。
以下是关于本文内容的几点说明
- 本文涉及的uboot、内核和根文件系统均适用了官方光盘文件中提供的镜像,并不涉及编译和移植相关事项。
- 使用minitool通过usb的方式将uboot烧入板子的Nand Flash,并未使用JLink进行烧写。
- 宿主机环境为Ubuntu18.04,使用minicom作为串口工具
- 所有
$
开头的命令都是在宿主机下执行的。 - 所有
#
开头的命令都是通过串口在开发板上执行的。 - 所有
###
开头的是注释内容。 - 没有命令提示的部分为命令执行结果。
串口工具配置
我这里使用了minicom作为串口工具。(当然,可以根据自己喜好选用其他同类工具)
安装minicom
1 | $ sudo apt install minicom |
设置minicom
1 | $ minicom -s |
测试串口输出
刚买到的板子的Nand Flash
中有可以启动的系统,连接好串口线,打开minicom
,然后启动开发板,可以在串口输出中看到启动信息,最后进入一个linux命令行,可以执行一些linux命令试一试。
烧入u-boot
使用官方光盘中的minitools工具把u-boot烧写到板子的Nand Flash
中。
获取minitools
在光盘文件 FriendlyARM-2440-DVD/linux平台工具/MiniTools-USB下载工具
下可以找到 MiniTools-Linux-20150528.tgz
如果没有找到,可以到 FriendlyARM-2440-DVD/windows平台工具/MiniTools-USB下载工具
下找找看。
如果依然没有找到,可以找某宝客服要,也欢迎在文末评论区留言获取。
将获取到的压缩文件解压到适合的位置,我将所有mini2440板子涉及的东西都放在了 ~/board-workspace/mini2440
目录下。
1 | $ pwd |
配置minitools
运行minitools需要依赖qtwebkit4
库,先安装。
1 | $ sudo apt install libqtwebkit4 |
这里有一个 start.sh
脚本文件用于启动,原先的start.sh
使用sudo
启动MiniTools
,在Ubuntu 18.04
下会无法正常运行,我把sudo
去掉之后运行正常。
1 | $ diff start.sh start_old.sh |
烧写u-boot
运行minitools
,用USB线连接开发板和电脑,从Nor Flash
启动开发板,按以下步骤操作
- 点击Linux
- 选择u-boot镜像,
FriendlyARM-2440-DVD/images/u-boot.bin
- 点击开始烧写
测试u-boot
连好串口线,运行minicom
,从Nand Flash
启动开发板,在串口终端快速按回车键即可进入u-boot
交互模式。如下图所示:
宿主机tftp和nfs服务
TFTP(Trivial File Transfer Protocol,简单文件传输协议)是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。端口号为69。
NFS(Network File System,网络文件系统)是基于UDP/IP协议的应用,最直观的说,它能让你把宿主机上的一个目录作为开发板所使用的文件系统,这样就可以方便地与开发板传输文件。
u-boot 可以通过 tftp 从宿主机上下载 linux 内核镜像并加载内核,通过一些参数设置(下文会详细介绍),可以让内核通过 nfs 挂载根文件系统,这样,就可以方便地测试内核和驱动代码。
tftp
tftp安装与配置
1 | $ sudo apt install tftpd-hpa |
复制Linux镜像
官方光盘 FriendlyARM-2440-DVD/images/linux/
目录下有 Linux
内核镜像,直接复制到 tftpboot
目录下。
1 | $ cp ~/FriendlyARM-2440-DVD/images/linux/zImage_A70 ~/board-workspace/tftpboot/zImage |
nfs
nfs安装与配置
1 | $ sudo apt install nfs-kernel-server |
解压并适当修改根文件系统
u-boot设置
u-boot 的命令行操作方式和 Linux 类似,可以输入各种命令来控制 u-boot, 输入 ?
或 help
可以查看支持的命令。通过修改环境变量,可以在不修改源码的情况下方便的修改 u-boot 运行时的一些数据和特性。
命令
本文主要使用了以下几个 u-boot 命令
printenv
功能:打印所有环境变量
用法:printenv
setenv
功能:设置环境变量
用法:setenv <key> <value>
,其中,key
是变量名,value
是变量值。如果value
为空,则表示删除对应的环境变量
saveenv
功能:保存环境变量修改,使用setenv设置环境变量后不会掉电保存,需要保存后才不会丢失。
用法:saveenv
tftpboot
功能:通过tftp下载到内存
用法:tftpboot [memaddr] <filename>
,其中,memaddr
是内存地址,不填默认0x30008000
,filename
是要下载的文件名。
bootm
功能:从指定内存位置加载内核
用法:bootm [memaddr]
,其中,memaddr
是内存地址,不填默认0x30008000
环境变量
本文主要对以下几个环境变量进行修改
bootdelay
功能:设置uboot启动时等待用户输入的延时。单位是秒。
1 | # setenv bootdelay 3 |
ipaddr serverip gatewayip netmask
功能:设置开发板网络,服务器ip,网关,子网掩码
这里我通过路由器连接了开发板网络,宿主机的ip为192.168.31.2
, 开发板ip设置为192.168.31.3
, 路由器ip为192.168.31.1
.
这些环境变量的设置如下
1 | # setenv ipaddr 192.168.31.3 |
设置完成后使用 ping
命令测试网络连通性
bootcmd
功能:设置开发板启动时默认执行的命令
1 | # setenv bootcmd 'tftp 0x30008000 zImage; bootm 0x30008000' |
bootargs
功能:给内核传递的启动参数
1 | # setenv rootpath '/home/dhd/nfs/rootfs' |
重启进入系统
上面的环境变量设置完成后,不要忘了用 saveenv
命令保存,然后重启开发板,不加干预直接进入系统。