如何通过U-boot启动Ubuntu for arm?

如何通过U-boot启动Ubuntu for arm?

如何通过 U-boot 启动 Ubuntu for arm?我有一个仅支持 U-boot 的固件。

答案1

由于硬件制造商通常希望保持硬件的封闭性,因此没有通用的 ARM 安装指南和 U-boot。因此,安装难度完全取决于硬件和硬件制造商。

查看官方文档部分5.1当您需要使用 u-boot 时,有一个通用的方法来识别和调整设置,但也请阅读第 3.7 节:

3.7 第 1 部分:

3.7.1. 带有 U-Boot 固件的系统

如前所述,遗憾的是 ARM 系统上的系统固件没有标准。即使是使用名义上相同固件的不同系统的行为也可能大不相同。这是因为使用 ARM 架构的大部分设备都是嵌入式系统,制造商通常会为其构建大量定制的固件版本并包含特定于设备的补丁。不幸的是,制造商通常不会将他们的更改和扩展提交给主线固件开发人员,因此他们的更改不会集成到原始固件的较新版本中。

因此,即使是新出售的系统也经常使用基于多年前制造商修改的固件版本的固件,而该固件的主线代码库在此期间已经发生了很大的变化,并提供了附加功能或在某些方面表现出不同的行为。除此之外,同一固件的不同制造商修改版本之间的板载设备命名并不一致,因此几乎不可能为基于 ARM 的系统提供可用的独立于产品的指令。

如果您确实有一个已知的系统,第 5.1.3.1 节详细介绍了如何执行此操作。不过,这里有一般的指导原则,您可能需要根据具体情况进行调整。

5.1.3.1. U-Boot 中的 TFTP 启动

使用 U-Boot 固件的系统上的网络启动包括三个步骤:

  • a) 配置网络,
  • b) 将映像(内核/初始 ramdisk/dtb)加载到内存中
  • c)实际执行先前加载的代码。

首先,你必须配置网络,可以通过 DHCP 自动配置

setenv autoload no
dhcp

或者手动设置几个环境变量

setenv ipaddr <ip address of the client>
setenv netmask <netmask>
setenv serverip <ip address of the tftp server>
setenv dnsip <ip address of the nameserver>
setenv gatewayip <ip address of the default gateway>

如果你愿意,可以通过运行以下命令使这些设置永久生效:

saveenv

之后,您需要将映像(内核/初始 ramdisk/dtb)加载到内存中。这可以通过 tftpboot 命令完成,该命令必须提供映像在内存中的存储地址。不幸的是,内存映射可能因系统而异,因此没有通用规则来确定哪些地址可用于此目的。

在某些系统上,U-Boot 预定义了一组具有合适加载地址的环境变量:kernel_addr_r、ramdisk_addr_r 和 fdt_addr_r。您可以通过运行来检查它们是否已定义

printenv kernel_addr_r ramdisk_addr_r fdt_addr_r

如果未定义,则必须检查系统文档以获取适当的值并手动设置它们。对于基于 Allwinner SunXi SOC 的系统(例如 Allwinner A10,架构名称为“sun4i”或 Allwinner A20,架构名称

“sun7i”), you can e.g. use the follwing values:

setenv kernel_addr_r 0x46000000
setenv fdt_addr_r 0x47000000
setenv ramdisk_addr_r 0x48000000

定义加载地址后,你可以使用以下命令从先前定义的 tftp 服务器将图像加载到内存中

tftpboot ${kernel_addr_r} <filename of the kernel image>
tftpboot ${fdt_addr_r} <filename of the dtb>
tftpboot ${ramdisk_addr_r} <filename of the initial ramdisk image>

第三部分是设置内核命令行并实际执行加载的代码。U-Boot 将“bootargs”环境变量的内容作为命令行传递给内核,因此内核和安装程序的任何参数 - 例如控制台设备(请参阅第 5.3.1 节“启动控制台”)或预置选项(请参阅第 5.3.2 节“Ubuntu 安装程序参数”和附录 B,使用预置自动安装) - 都可以使用以下命令进行设置

setenv bootargs console=ttyS0,115200 rootwait panic=10

执行先前加载的代码的具体命令取决于所使用的图像格式。对于 uImage/uInitrd,命令为

bootm ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r}

并且使用原生 Linux 镜像

bootz ${kernel_addr_r} ${ramdisk_addr_r}:${filesize} ${fdt_addr_r}

注意:启动标准 Linux 映像时,在内核和 dtb 之后加载初始 ramdisk 映像非常重要,因为 U-Boot 将文件大小变量设置为最后加载的文件的大小,而 bootz 命令需要 ramdisk 映像的大小才能正常工作。如果要启动特定于平台的内核(即没有设备树的内核),只需省略 ${fdt_addr_r} 参数即可。

相关内容