问:bootz命令在启动Linux内核时,如果不加任何参数,它从哪里启动内核?
在 U-Boot 中,bootz
命令用于启动 zImage 格式的 Linux 内核。如果 不加任何参数,它的默认行为是:
1. bootz
命令的基本语法
bootz [kernel_addr] [ramdisk_addr] [fdt_addr]
其中:
kernel_addr
:内核镜像(zImage
)的内存地址。ramdisk_addr
:可选,initrd
(初始 RAM 盘)的地址,通常用于无根文件系统启动。fdt_addr
:可选,设备树文件(DTB)的地址,用于设备树架构(如 ARM)。
如果 不加任何参数:
bootz
那么 U-Boot 默认会从环境变量中获取 loadaddr
作为内核地址。
2. bootz
默认使用的内存地址
在 U-Boot 的环境变量中,通常有一个 loadaddr
变量,指向默认的内核加载地址:
loadaddr=0x80800000
因此,如果执行:
bootz
U-Boot 默认会尝试从 0x80800000
这个地址启动内核,等效于:
bootz 0x80800000
3. bootz
默认启动失败的情况
如果 该地址没有正确加载内核(zImage),那么 bootz
会报错:
Wrong Image Format for bootm command
ERROR: can't get kernel image!
这说明 U-Boot 在 loadaddr
指定的地址没有找到正确的 zImage。
4. 典型的 bootz
启动流程
通常,U-Boot 在启动时会先 加载内核到 loadaddr
位置,再执行 bootz
:
fatload mmc 1:1 ${loadaddr} zImage # 从 u-boot中的编号为1MMC设备的boot1(Boot Partition 1)加载内核到内存
bootz # 使用默认地址 (${loadaddr}) 启动
或者:
bootz ${loadaddr} - ${fdt_addr} # 注意:符号-不是减的意思,而是代表不使用第2个参数。
这样 bootz
会:
- 从
loadaddr
加载zImage
(即0x80800000
)。 -
表示 不使用 ramdisk。- 从
fdt_addr
加载设备树(DTB)。
5. 结论
如果不加参数执行 bootz
:
- U-Boot 默认使用
loadaddr
变量作为内核地址(通常是0x80800000
)。 - 如果该地址没有加载 zImage,则会报错。
- 建议在
bootz
之前,确保正确加载了内核(fatload、tftp 等)。
如果你的系统报错,检查:
printenv loadaddr
printenv fdt_addr
md.l ${loadaddr} 10 # 查看内核数据是否存在
如果 loadaddr
处没有正确的 zImage
,需要先加载它再执行 bootz
。