一、tftp加载Linux内核及rootfs
1.1 uboot内核启动命令
bootm
启动指定内存地址上的Linux内核并为内核传递参数
bootm kernel-addr ramdisk-addr dtb-addr
注:
kernel-addr: 内核的下载地址
ramdisk-addr: 根文件系统的下载地址
dtb-addr: 设备树的下载地址
若不使用相应的地址,对应的位置写“-”
eg:
bootm 0x41000000 - 0x42000000
1.2 uboot自启动参数环境变量
bootargs
eg:
setenv bootargs root=/dev/nfs nfsroot=xxx.xxx.xxx.xxx:/opt/4412/rootfs
rw console=ttySAC2,115200 init=/linuxrc ip=***.***.***.***
注:
root 根文件系统类型(nfs)
nfsroot 网络文件系统路径(xxx.xxx.xxx.xxx:/opt/4412/rootfs)
rw 操作网络文件系统的权限(rw)
console 控制台(使用串口2,波特率115200)
init init进程的位置(/linuxrc)
ip linux启动后自身的IP(***.***.***.***)
1.3 通过tftp加载内核和根文件系统
实验内容:
先把Linux内核、设备树、根文件系统放到tftp服务器上(即上次实验创建的根目录下的/tftpboot)。通过设置自启动环境变量,uboot进入自启动模式后。通过tftp,从ubuntu上把Linux内核、设备树、根文件系统加载到内存,然后运行。
实验步骤:
$ sudo chmod 777 /tftpboot/*
$ sudo service tftpd-hpa restart
# setenv ipaddr ***.***.***.***
# setenv serverip xxx.xxx.xxx.xxx
# setenv bootcmd tftp 0x41000000 uImage\;tftp 0x42000000 exynos4412-fs4412.dtb\;tftp 0x43000000 ramdisk.img\;bootm 0x41000000 0x43000000 0x42000000
# setenv bootargs root=/dev/nfs nfsroot=xxx.xxx.xxx.xxx:/opt/4412/rootfs/ rw console=ttySAC2,115200 init=/linuxrc ip=***.***.***.***
# saveenv
二、EMMC加载Linux内核及roofs
# tftp 0x41000000 uImage
# mmc write 0 0x41000000 0x800 0x2000
下载设备树到内存中
# tftp 0x41000000 exynos4412-fs4412.dtb
# mmc write 0 0x41000000 0x2800 0x800
# tftp 0x41000000 ramdisk.img
将根文件系统镜像写入到 EMMC 中指定的扇区
# mmc write 0 0x41000000 0x3000 0x2000
2、 因为要从 EMMC 驱动,所以还要修改 uboot 的启动参数
# setenv bootcmd mmc read 0 0x41000000 0x800 0x2000\;mmc read 0 0x42000000 0x2800 0x800\;mmc read 0 0x43000000 0x3000 0x2000\;bootm 0x41000000 0x43000000 0x42000000
# setenv bootcmd 'mmc read 0 0x41000000 0x800 0x2000;mmc read 0 0x42000000 0x2800 0x800;mmc read 0 0x43000000 0x3000 0x2000;bootm 0x41000000 0x43000000 0x42000000'
# saveenv
三、tftp加载Linux内核nfs挂载rootfs
3.1 通过tftp加载内核,通过nfs挂载根文件系统
$ sudo tar xvf rootfs.tar.xz
$ sudo rm rootfs.tar.xz
# setenv bootcmd tftp 0x41000000 uImage\;tftp 0x42000000 exynos4412-fs4412.dtb\;bootm 0x41000000 - 0x42000000
# saveenv
$ sudo service nfs-kernel-server restart
开发板这些文件是通过ubuntu远程共享给开发板的
test文件在ubuntu上可以执行,而在开发板上无法执行。因为不同架构的机器码和汇编语言是不同的。
如果使用gcc进行编译,则默认生成的可执行文件是x86的
如果想在开发板运行。则需用交叉编译器编译
开发板挂载根文件系统时,为什么开发板能精确的挂载到这台电脑的这个目录下的文件?
答:因为在设置bootargs时设置好了。
四、EMMC加载uboot
4.1 将uboot安装到EMMC
2、 给开发板重新上电,在 uboot 交互模式下,去下载并安装 uboot
# tftp 0x41000000 u-boot-fs4412.bin
将内核镜像安装到 EMMC 中指定的扇区
# emmc open 0 //需要先把EMMC打开
# mmc write 0 0x41000000 0x0 0x800
# emmc close 0
之前几次实验,留出了0x0-0x800的这块空间, 就是给uboot留的。
之前给SD卡刷uboot时,是从第1块扇区开始的,因为SD卡的第0块是存储分区表的。这块芯片如果使用SD卡启动,则默认从第1块开始搬移uboot,如果使用EMMC启动,则是默认从第0块开始搬移uboot。
显示如下信息表示安装成功
因为启动的是 EMMC 中的 uboot 所以环境变量还需要重新设置