kernel 接收 uboot 的传参
时间: 2024-05-01 22:09:45 浏览: 12
当 u-boot 启动时,它会将一些参数传递给 kernel,这些参数可以是启动命令行中指定的参数或者是 u-boot 配置中指定的参数。kernel 可以通过读取某些固定的内存地址来获取这些参数,这些地址是由 u-boot 定义的。
在 ARM 平台上,通过设置 ATAGS(Android Tagged Memory)或者 FDT(Flattened Device Tree)来传递参数,其中 FDT 已经成为了主流的传参方式。ATAGS 是一种传统的 ARM 平台的参数传递方式,它通过一系列的 tag 来传递参数,每个 tag 都有不同的类型和结构。FDT 是一种基于设备树的传参方式,它通过将设备树数据结构加载到某个固定的内存地址来传递参数,kernel 可以直接从设备树中获取需要的参数。
总的来说,kernel 接收 uboot 的传参的方式主要有两种:读取 ATAGS 或者读取 FDT。具体的细节可以参考相关的文档和代码实现。
相关问题
uboot向kernel传参
在u-boot中,可以使用以下命令设置内核启动参数:
```
setenv bootargs console=ttyS0,115200 root=/dev/mmcblk0p1 rootwait rw
```
这将设置内核启动参数为:使用串口0作为控制台,挂载mmcblk0p1作为根文件系统,等待根文件系统挂载完成后以读写模式启动。
在启动内核时,u-boot会将bootargs变量传递到内核中。内核可以通过解析此变量来获取启动参数。例如,在Linux内核中,可以使用以下函数获取启动参数:
```c
extern char *command_line;
static int __init setup_command_line(char *str)
{
command_line = str;
return 0;
}
early_param("cmdline", setup_command_line);
```
在这个例子中,`command_line`变量将保存传递给内核的启动参数。`setup_command_line`函数将在内核启动时被调用,将传递给内核的启动参数保存到`command_line`变量中。`early_param`宏将`setup_command_line`函数注册为早期参数处理函数,在内核启动时被调用。
如何将单独的kernel与uboot
将单独的kernel与uboot,可以按照以下步骤进行:
1. 首先,需要将uboot和kernel分别编译成独立的二进制文件。可以使用交叉编译工具链进行编译。
2. 然后,将编译好的uboot和kernel分别烧录到设备的flash中。
3. 在uboot中设置bootcmd,指定从flash中加载kernel并启动。可以使用以下命令设置bootcmd:
```
setenv bootcmd 'sf read ${loadaddr} ${kernel_flash_offset} ${kernel_size}; bootm'
saveenv
```
其中,${loadaddr}是内存中加载kernel的地址,${kernel_flash_offset}是kernel在flash中的偏移量,${kernel_size}是kernel的大小。
4. 在uboot中设置kernel的启动参数。可以使用以下命令设置启动参数:
```
setenv bootargs 'console=ttyS0,115200 root=/dev/mmcblk0p1 rootwait'
saveenv
```
其中,'console=ttyS0,115200'是指定控制台输出的方式和波特率,'root=/dev/mmcblk0p1'是指定root文件系统的位置,'rootwait'是等待root文件系统准备好。
5. 最后,重启设备,uboot会自动加载kernel并启动。