【openwrt】UBOOT传递参数到内核parameters

UBOOT系列文章

第二章 UBOOT参数传递



前言

Uboot向内核传递的方式有多种,这里介绍一种简单的参数传递方式,通过bootargs传递


一、为啥要uboot参数传递?

在某些时候,需要uboot通过bootargs参数传递给内核,然后通过传入的参数进行一些特殊的操作

二、操作方法

1.uboot更改

代码如下(示例):

static void boot_prep_linux(bootm_headers_t *images)
{
   
   
	/*此处省略*/
	board_prep_linux(images);
}

需自己更改添加一个board_prep_linux函数,进行参数传递
void board_prep_linux(bootm_headers_t *images)
{
   
   
	void *fdt = images->ft_addr;
	const char *orig_bootargs;
	int nodeoffset, len;
	char *new_cmdline;
	u32 newlen;
	int ret;

	if (!(CONFIG_IS_ENABLED(OF_LIBFDT) && images->ft_len)) {
   
   
		printf("Warning: no FDT present for current image!\n");
		return;
	}

	/* find or create "/chosen" node. */
	nodeoffset = fdt_find_or_add_subnode(fdt, 0, "chosen");
	if (nodeoffset < 0)
		return;

	orig_bootargs = 
OpenWrt 中向内核模块传递编译参数,通常可以通过以下几种方式实现,具体取决于你是在开发自定义模块还是修改现有模块: ### 方法一:通过 `Makefile` 传递编译参数(适用于自定义或第三方模块) 如果你正在编写或引入一个内核模块(如 `kmod-mymodule`),可以在其 `Makefile` 中使用 `EXTRA_CFLAGS` 向内核编译器传递参数。 ```makefile define KernelPackage/kmod-mymodule TITLE:=My kernel module DEPENDS:=@TARGET_x86 FILES:=$(PKG_BUILD_DIR)/mymodule.ko endef define Build/Compile $(MAKE) -C "$(LINUX_DIR)" \ M="$(CURDIR)" \ EXTRA_CFLAGS="-DMY_DEBUG -DUSE_FEATURE_X" \ modules endef ``` - `EXTRA_CFLAGS` 会被传递内核构建系统,在编译该模块时生效。 - 注意引号的使用,避免 shell 解析错误。 --- ### 方法二:通过 `KCONFIG_CONFIG` 或 `.config` 设置内核编译选项(全局影响) 某些功能需要通过内核配置(Kconfig)启用。你可以在 OpenWrt 的配置中设置: ```bash echo 'CONFIG_MY_OPTION=y' >> .config make defconfig ``` 然后在代码中使用 `#ifdef CONFIG_MY_OPTION` 判断。 --- ### 方法三:使用 `KBUILD_CFLAGS`(不推荐,可能影响其他模块) 虽然可以使用 `KBUILD_CFLAGS`,但它会影响整个内核构建过程,建议仅用于调试。 --- ### 方法四:在 `package/kernel/modules/` 中修改现有模块 OpenWrt 的标准内核模块位于 `package/kernel/modules/` 目录下。你可以复制一个模块 Makefile(如 `netfilter.mk`),并添加自己的 `EXTRA_CFLAGS`。 例如: ```makefile $(eval $(call KernelPackage,nf-ipt)) ``` 在其 `Build/Compile` 段中加入: ```makefile EXTRA_CFLAGS += -DDEBUG_LOG -I$(SRC)/include ``` --- ### 示例:为 iptables 模块添加调试宏 ```makefile define Build/Compile $(MAKE) -C "$(LINUX_DIR)" \ M="$(CURDIR)" \ EXTRA_CFLAGS="-DDEBUG_IPTABLES -g" \ modules endef ``` --- ### 验证方法 1. 在源码中添加: ```c #ifdef MY_DEBUG printk(KERN_INFO "MY_DEBUG is enabled\n"); #endif ``` 2. 编译后加载模块,查看 `dmesg` 输出是否包含该信息。 --- ### 总结 | 方法 | 适用场景 | 推荐程度 | |------|----------|----------| | `EXTRA_CFLAGS` in Makefile | 单个模块传参 | ⭐⭐⭐⭐⭐ | | Kconfig 配置 | 功能开关 | ⭐⭐⭐⭐☆ | | 修改 .config | 全局内核配置 | ⭐⭐⭐☆☆ | | KBUILD_CFLAGS | 调试用途 | ⭐⭐☆☆☆ | 确保在 `Build/Compile` 步骤中正确引用 `$(LINUX_DIR)` 和 `M=` 参数,这是内核模块外部构建的关键。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值