如何通过Linux内核命令行及U-Boot层修改MAC地址
MAC地址修改的两种实用方案:内核命令行与U-Boot层操作
下面我会详细说明这两个需求的实现方法,都是嵌入式开发里常用的操作:
一、通过Linux内核命令行参数修改MAC地址
如果你想直接通过内核启动参数来设置MAC地址,核心是给对应网卡驱动传递指定参数。不同网卡驱动的参数名可能略有差异,最常见的是在bootargs里添加[网卡接口名].macaddr=XX:XX:XX:XX:XX:XX。
举个实际例子,假设你的网卡接口是eth0,要设置MAC为11:22:33:44:55:66,那么内核命令行可以这么写:
console=ttyAMA0,115200n8 root=/dev/ram0 rw initrd=0x40000000 eth0.macaddr=11:22:33:44:55:66
注意:有些驱动可能直接用macaddr作为参数名,不需要加网卡接口前缀,具体得看你用的网卡驱动文档来确认。
二、U-Boot层修改MAC地址及驱动层获取
1. U-Boot侧的具体操作
在U-Boot里修改MAC地址是很常用的操作,通过环境变量ethaddr就能搞定,步骤如下:
# 先配置bootargs,把ethaddr变量传递给内核 setenv bootargs 'console=ttyAMA0,115200n8 root=/dev/ram0 rw initrd=0x40000000 ethaddr=${ethaddr}' # 设置你想要的MAC地址 setenv ethaddr 11:22:33:44:55:66 # 保存环境变量,这样重启后设置不会丢失 saveenv
执行saveenv后,U-Boot会把这个MAC地址写到板子的非易失存储(比如SPI Flash)里,下次启动时会自动加载这个环境变量。
2. 驱动层获取U-Boot传递的MAC地址
在Linux驱动中,你可以通过解析内核命令行里的ethaddr参数来拿到U-Boot传过来的MAC地址,这里给你一段可用的代码片段:
#include <linux/init.h> #include <linux/kernel.h> #include <linux/string.h> #define MAX_ADDR_LEN 6 static unsigned char my_ethaddr[MAX_ADDR_LEN]; /* 解析内核命令行中的ethaddr参数 */ static int __init ethaddr_setup(char *line) { char *ep; int i; printk("command line : %s\n", line); memset(my_ethaddr, 0, MAX_ADDR_LEN); // 逐个字节解析MAC地址的十六进制值 for (i = 0; i < MAX_ADDR_LEN; i++) { my_ethaddr[i] = simple_strtoul(line, &ep, 16); if (*ep == ':' || *ep == '\0') { line = ep + 1; } else { // 如果格式不对,就清空MAC地址 memset(my_ethaddr, 0, MAX_ADDR_LEN); break; } } return 1; } __setup("ethaddr=", ethaddr_setup);
这段代码用__setup宏注册了一个命令行参数解析函数,当内核启动时检测到ethaddr=参数,就会调用ethaddr_setup来解析地址并保存到my_ethaddr数组里,之后驱动里就可以直接用这个数组里的MAC地址了。
内容的提问来源于stack exchange,提问作者andy
相关产品推荐
相关产品推荐

