bootm ? ?
????????启动指定内存地址上的Linux内核并为内核传递参数 ?? ?
????????bootm kernel-addr ramdisk-addr dtb-addr ?? ?
????????注: ?? ? ? ?
????????????????kernel-addr:?? ?内核的下载地址 ? ?? ? ? ?
????????????????ramdisk-addr:?? ?根文件系统的下载地址 ??? ? ?? ? ? ?
????????????????dtb-addr:?? ??? ?设备树的下载地址 ?? ? ? ?
????????????????若不使用相应的地址,对应的位置写“-” ?? ?
????????eg: ?? ? ? ?
????????????????bootm 0x41000000 - 0x42000000?? ?
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(***.***.***.***)
实验内容:
????????先把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
# 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
?
$ 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时设置好了。
?
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 所以环境变量还需要重新设置
?