详细说明嵌入式linux中bootcmd与bootargs差异
bootcmd
和 bootargs
是在嵌入式系统开发,特别是基于U-Boot(一个广泛应用的开源引导加载程序)环境中常见的两个重要参数,它们的区别如下:
功能用途
- bootcmd:
- 定义:
bootcmd
是U-Boot中的一个环境变量,用于定义一系列在启动过程中自动执行的命令。这些命令通常用于初始化硬件设备、设置内存参数、加载内核镜像和设备树文件等操作,引导系统进入内核启动阶段。 - 示例场景:在开发板启动时,
bootcmd
可能会包含设置网络参数以通过网络加载内核镜像的命令,或者从NAND Flash、SD卡等存储设备读取内核镜像到内存的操作。例如,对于通过网络加载内核镜像的情况,bootcmd
可能类似如下设置:
- 定义:
setenv bootcmd 'tftpboot 0x80007FC0 uImage; tftpboot 0x80F00000 my - dtb.dtb; bootm 0x80007FC0 - 0x80F00000'
此命令首先通过TFTP协议将内核镜像 uImage
下载到内存地址 0x80007FC0
,然后将设备树文件 my - dtb.dtb
下载到内存地址 0x80F00000
,最后使用 bootm
命令启动内核,指定内核镜像地址以及设备树文件地址。
- bootargs:
- 定义:
bootargs
同样是U-Boot的环境变量,它主要用于传递内核启动参数给Linux内核。这些参数告知内核如何初始化硬件设备、挂载根文件系统以及配置系统运行时的各种设置等。 - 示例场景:比如要设置内核启动时的根文件系统类型为
ext4
,根文件系统所在设备为/dev/mmcblk0p2
,并启用串口控制台输出,bootargs
可以设置为:
- 定义:
setenv bootargs 'console = ttyS0,115200 root = /dev/mmcblk0p2 rootfstype = ext4 rw'
这里 console = ttyS0,115200
表示使用串口 ttyS0
作为控制台,波特率为115200;root = /dev/mmcblk0p2
指明根文件系统位于 mmcblk0
设备的第二个分区;rootfstype = ext4
说明根文件系统类型是 ext4
;rw
表示以读写方式挂载根文件系统。
执行时机与作用对象
- bootcmd:
- 执行时机:在U-Boot启动流程中,当U-Boot完成自身初始化后,会检查并执行
bootcmd
中定义的命令序列。它在U-Boot环境内执行,目的是为内核启动做准备工作,比如初始化硬件设备、准备内存空间等。 - 作用对象:其操作主要针对U-Boot自身以及底层硬件设备,为内核的加载和启动创造条件。
- 执行时机:在U-Boot启动流程中,当U-Boot完成自身初始化后,会检查并执行
- bootargs:
- 执行时机:当
bootcmd
执行完加载内核镜像和设备树文件等操作,并通过特定命令(如bootm
)启动内核时,U-Boot会将bootargs
中设置的参数传递给内核。所以它是在内核启动阶段起作用。 - 作用对象:直接作用于Linux内核,影响内核的启动配置和运行时的一些基本设置。
- 执行时机:当
配置内容特点
- bootcmd:
- 内容特点:包含一系列U-Boot命令,这些命令以字符串形式存储在
bootcmd
变量中,命令之间通常用分号(;)分隔。命令内容围绕硬件初始化、数据传输(如从存储设备读取数据到内存)、网络操作等与U-Boot引导流程紧密相关的操作。 - 可变性:
bootcmd
的配置可能因硬件平台不同而有较大差异,例如不同的存储设备接口(NAND Flash、SD卡、eMMC等)需要不同的命令来读取数据;不同的网络芯片可能需要不同的网络参数设置命令。同时,开发人员也可能根据项目需求,如调试需求、特定的启动流程定制,对bootcmd
进行灵活修改。
- 内容特点:包含一系列U-Boot命令,这些命令以字符串形式存储在
- bootargs:
- 内容特点:是一组以键值对形式组成的内核启动参数,参数之间用空格分隔。这些参数主要涉及内核如何识别和配置硬件设备、文件系统挂载方式、系统运行模式等内核层面的设置。
- 可变性:虽然也会因硬件平台和项目需求有所不同,但相对来说,在同一类硬件平台上,
bootargs
的基本参数结构和大部分参数内容较为相似。例如,对于基于ARM架构的开发板,串口控制台参数console
的设置方式基本一致,只是具体的串口设备名称和波特率可能因硬件设计不同而有所变化。