首页 > 编程知识 正文

uboot如何加载内核(uboot为什么进入命令行)

时间:2023-05-03 12:04:18 阅读:74791 作者:4717

uboot有两种启动Linux内核和rootfs的方法。 一种方法是直接从flash(NAND或emmc )启动,另一种方法是从网络启动。 这使用了两个非常重要的环境变量bootcmd和bootargs。

另一方面,bootcmd和bootargs环境变量bootcmd存储uboot的缺省命令,并在uboot倒计时结束时运行bootcmd命令。 这些命令通常用于启动Linux内核。 例如,将EMMC或NAND flash Linux内核镜像文件和设备树文件导入DRAM中,然后启动Linux内核。 bootcmd环境变量的值可以在uboot启动后进入命令行进行设置。 如果EMMC或NAND中没有存储bootcmd的值,uboot将使用默认值。

bootargs维护uboot传递给Linux内核的参数。 bootargs是设置Linux内核使用的许多参数的值。 常见参数如下:

1、控制台用于设置linux终端(或称为控制台),即通过什么设备与linux进行交互、是串行端口还是液晶屏? 如果是串行的话,我想是串行数之类的。 通常将串行端口设置为Linux终端,以便计算机可以通过SecureCRT与Linux进行交互。

2、root root用于设置根文件系统的位置。 例如,root=/dev/mmcblk1p2表示根文件系统存储在mmcblk1设备的分区2中。 root后面有“rootwait rw”。 rootwait表示等待mmc设备初始化完成后再装载。 否则,在mmc设备尚未初始化之前挂载根文件系统将导致错误。 rw表示根文件系统是可读写的。 如果不添加rw,则根文件系统无法进行写入操作,可能只能进行读取操作。

3、rootfstype此选项通常设置为与用于指定根文件系统类型的根文件系统一起使用。 如果根文件系统为ext格式,则此选项无关紧要。 如果根文件系统是yaffs、jffs或ubifs,则必须设置此选项以指定根文件系统的类型。

二.从EMMC启动Linux系统从EMMC启动意味着将编译的Linux镜像文件zImage和设备树文件保存在EMMC中,uboot从EMMC读取这两个文件并启动,然后引导

setenv bootargs ' console=tty mxc 0,115200 root=/dev/MMC bl k1 p2 rootwaitrw ' setenv bootcmd ' MMC dev 1; fatloadMMC1:180800000zimage; fatloadmmc 1:18300000 test.dtb; bootz 80800000 - 83000000;' saveenvboot前两个命令setenv和saveenv以及命令setenv用于设置或更改环境变量的值。 saveenv命令保存更改的环境变量。 另一个boot命令用于启动Linux系统。

uboot传递给linux内核的参数存储在bootargs环境变量中,并存储linux终端是什么以及根文件系统的位置。

uboot命令:

setenv bootcmd 'mmc dev 1; fatloadMMC1:180800000zimage; fatloadmmc 1:18300000 test.dtb; bootz 80800000 - 83000000;' 使用的命令如下

1、mmc dev命令mmc dev命令用于在当前MMC设备之间切换,命令格式如下:

MMC dev [ dev ] [部件]

[dev]用于设置要切换的MMC设备编号,[part]是分区编号。 如果不写分区号,则默认值为分区0。

使用以下命令切换到MMC 1:

切换到MMCdev1//MMC1

2、fatload命令fatload命令用于将指定文件读取到DRAM中,命令格式如下:

fat load [ dev [ :部件] [ [ bytes [ pos ] ] ]

接口是mmc等接口,dev是设备编号,part是分区,addr是存储在DRAM中的起始地址,filename是要读取的文件的名称。 bytes表示要读取多少字节的数据,如果bytes为0或省略,则表示要读取整个文件。 pos是指从文件的起始地址读取的文件的偏移,如果为0或省略,则从文件的起始地址读取。 已将EMMC分区1的zImage文件读取到DRAM的0X80800000地址。 命令如下:

fatloadMMC1:180800000zimage

3、bootz命令为了启动Linux,首先需要将Linux镜像文件复制到DRAM中,如果

用到设备树的话也需要将设备树拷贝到 DRAM 中。可以从 EMMC 或者 NAND 等存储设备中将 Linux 镜像和设备树文件拷贝到 DRAM,也可以通过 nfs 或者 tftp 将 Linux 镜像文件和设备树文件下载到 DRAM 中。不管用那种方法,只要能将 Linux 镜像和设备树文件存到 DRAM 中就行,然后使用 bootz 命令来启动, bootz 命令用于启动 zImage 镜像文件, bootz 命令格式如下:
  bootz [addr [initrd[:size]] [fdt]]
  命令 bootz 有三个参数, addr 是 Linux 镜像文件在 DRAM 中的位置, initrd 是 initrd 文件在DRAM 中的地址,如果不使用 initrd 的话使用‘-’代替即可, fdt 就是设备树文件在 DRAM 中的地址。

三、从网络启动 Linux 系统

  从网络启动 linux 系统的目的就是为了调试。也就是将 linux 镜像文件和根文件系统都放到 Ubuntu 下某个指定的文件夹中,这样每次重新编译 linux 内核或者某个 linux 驱动以后只需要使用 cp 命令将其拷贝到这个指定的文件夹中即可。我们可以通过 tftp 从 Ubuntu 中下载 zImage 和设备树文件,根文件系统的话可以通过 nfs 挂载。

setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.1.250:/home/nfs/rootfs,proto=tcp rw ip=192.168.1.251:192.168.1.250:192.168.1.1:255.255.255.0::eth0:off' //设置 bootargssetenv bootcmd 'tftp 80800000 zImage; tftp 83000000 Test.dtb; bootz 80800000 - 83000000'saveenvboot 1、NFS挂在rootfs

  uboot 里面的 bootargs 环境变量会设置“root”的值,所以我们将 root 的值改为 NFS 挂载。格式如下:

root=/dev/nfs nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>] ip=<client-ip>:<server-ip>:<gwip>:<netmask>:<hostname>:<device>:<autoconf>:<dns0-ip>:<dns1-ip>

  < server-ip>:服务器 IP 地址,也就是存放根文件系统主机的 IP 地址,那就是 Ubuntu 的 IP地址,比如我的 Ubuntu 主机 IP 地址为192.168.1.250。
  < root-dir>: 根文件系统的存放路径,比如我的就是/home/nfs/rootfs。
  < nfs-options>: NFS 的其他可选选项,一般不设置。
  < client-ip>: 客户端 IP 地址,也就是我们开发板的 IP 地址, Linux 内核启动以后就会使用此 IP 地址来配置开发板。此地址一定要和 Ubuntu 主机在同一个网段内,并且没有被其他的设备使用,在 Ubuntu 中使用 ping 命令 ping 一下就知道要设置的 IP 地址有没有被使用,如果不能ping 通就说明没有被使用,那么就可以设置为开发板的 IP 地址,比如我就可以设192.168.1.251。
  < server-ip>: 服务器 IP 地址,前面已经说了。
  < gw-ip>: 网关地址,我的就是 192.168.1.1。
  < netmask>:子网掩码,我的就是 255.255.255.0。
  < hostname>:客户机的名字,一般不设置,此值可以空着。
  < device>: 设备名,也就是网卡名,一般是 eth0, eth1….
  < autoconf>: 自动配置,一般不使用,所以设置为 off。
  < dns0-ip>: DNS0 服务器 IP 地址,不使用。
  < dns1-ip>: DNS1 服务器 IP 地址,不使用。
  另外:“proto=tcp”表示使用 TCP 协议,“rw”表示 nfs 挂载的根文件系统为可读可写。

2、网络下载镜像文件 zImage 和设备树文件

  从网络下载可以使用tftp 命令或 nfs 命令

1、tftp 命令

  tftp 命令是用于通过网络下载东西到 DRAM 中,tftp 命令使用的 TFTP 协议。uboot 中的 tftp 命令格式如下:

tftpboot [loadAddress] [[hostIPaddr:]bootfilename]

  loadAddress 是 文 件 在 DRAM 中 的存 放 地 址 ,
[[hostIPaddr:]bootfilename]是要从 Ubuntu 中下载的文件。但是 tftp 命令不需要输入文件在 Ubuntu 中的完整路径,只需要输入文件名即可。比如我们现在将 tftpboot 文件夹里面的 zImage 文件下载到开发板 DRAM 的 0X80800000 地址处,命令如下:
  tftp 80800000 zImage

2、nfs 命令

  nfs(Network File System)网络文件系统,通过 nfs 可以在计算机之间通过网络来分享资源,比如我们将 linux 镜像和设备树文件放到 Ubuntu 中,然后在 uboot 中使用 nfs 命令将 Ubuntu 中的 linux 镜像和设备树下载到开发板的 DRAM 中。这样做的目的是为了方便调试 linux 镜像和设备树,也就是网络调试,通过网络调试是 Linux 开发中最常用的调试方法。原因是嵌入式 linux开发不像单片机开发,可以直接通过 JLINK 或 STLink 等仿真器将代码直接烧写到单片机内部的 flash 中,嵌入式 Linux 通常是烧写到 EMMC、 NAND Flash、 SPI Flash 等外置 flash 中,但是嵌入式 Linux 开发也没有 MDK, IAR 这样的 IDE,更没有烧写算法,因此不可能通过点击一个“download”按钮就将固件烧写到外部 flash 中。虽然半导体厂商一般都会提供一个烧写固件的软件,但是这个软件使用起来比较复杂,这个烧写软件一般用于量产的。其远没有 MDK、 IAR的一键下载方便,在 Linux 内核调试阶段,如果用这个烧写软件的话将会非常浪费时间,而这个时候网络调试的优势就显现出来了,可以通过网络将编译好的 linux 镜像和设备树文件下载到 DRAM 中,然后就可以直接运行。
  我们一般使用 uboot 中的 nfs 命令将 Ubuntu 中的文件下载到开发板的 DRAM 中,在使用之前需要开启 Ubuntu 主机的 NFS 服务,并且要新建一个 NFS 使用的目录,以后所有要通过NFS 访问的文件都需要放到这个 NFS 目录中。uboot 中的 nfs 命令格式如下所示:

nfs [loadAddress] [[hostIPaddr:]bootfilename]

  loadAddress 是要保存的 DRAM 地址, [[hostIPaddr:]bootfilename]是要下载的文件地址。
  例如:使用 nfs 命令来将 zImage 下载到开发板 DRAM 的 0X80800000 地址处,命令如下:
  nfs 80800000 192.168.1.253:/home/nfs/zImage

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。