You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:39:32