linux - 是否有 Linux 或 U-Boot 支持在启动时从芯片读取 MAC 地址?

标签 linux mac-address u-boot

我的公司构建的定制硬件数量如此之少,以至于购买整 block MAC 地址在经济上没有意义。什么芯片(如果有的话)可以设计到我的嵌入式 Linux 板中,用于在启动时自动分配全局唯一的 MAC 地址?

我已经搜索了 Linux 和 u-boot 驱动程序支持 MAC 芯片和 EUI-48 芯片,但一无所获。 MicroChip 部件号 24AA02E48 是一个 I2C 芯片,它包含一个适合用作 MAC 地址的 EUI-48 地址。还有 DS2502-48,一个串行单线芯片,我们之前通过编写一个单独的 u-boot 应用程序来读取它的 MAC 地址,并将它分配给 U-Boot ethaddr 环境变量,但那是一个手册我想消除的步骤。 1-wire 时序非常紧张,以至于 u-boot 应用程序有时无法正确读取 MAC 地址,因此我们从未完全自动化该过程。

是否有任何 Linux 或 u-boot 驱动程序可以配置为在启动时自动读取 MAC 地址芯片?

最佳答案

据我所知,你根本不需要芯片。 MAC 标准允许您生成“本地管理”的 MAC 地址,该地址不能保证全局唯一性。对于像您这样的小型制造商,这几乎总是足够好,这就是标准允许这样做的原因。

在选择号码时一定要遵循这些标准,例如将 U/L 位设置为“1”以保证它不会与注册地址匹配(U/L 位 ==“0”)。生成有效本地 MAC 地址的“tl;dr”方法是使前三对“02:00:00:”和后三对随机十六进制数字;但如果您正在构建硬件,我建议您花时间阅读标准或至少阅读维基百科页面。

如果伪随机数字偶然发生冲突,请尽可能为客户提供更改默认 MAC 选择的方法。就算有注册地址,让客户自己改也是好的。有时,管理员会调整 MAC,使路由和/或负载平衡更容易,并且有时他们需要避开由认为硬编码“00:00:00:00:00: 00"或选择 12 个随机的十六进制数字。

至于从 Linux 驱动程序或 U-Boot 读取 MAC,我不知道你的设备,但我发现使用 U-Boot 最简单,因为它工作在较低的级别。 U-Boot 将它找到的 MAC 存储在环境变量“ethaddr”、“eth1addr”和“eth2addr”中。命令“printenv”是查看它们的一种方式。这是一个恰好在我面前的董事会的例子:

U-Boot# printenv ethaddr eth1addr eth2addr
ethaddr=98:5d:ad:43:dd:38
eth1addr=98:5d:ad:43:dd:3a
## Error: "eth2addr" not defined

U-Boot 命令“bdinfo”也可能有用。再次来 self 面前的董事会:

U-Boot# bdinfo
arch_number = 0x0000106E
boot_params = 0x80000100
DRAM bank   = 0x00000000
-> start    = 0x80000000
-> size     = 0x20000000
eth0name    = cpsw
ethaddr     = 98:5d:ad:43:dd:38
current eth = cpsw
ip_addr     = <NULL>
baudrate    = 115200 bps
TLB addr    = 0x9FFF0000
relocaddr   = 0x9F753000
reloc off   = 0x1EF53000
irq_sp      = 0x9F332F38
sp start    = 0x9F332F28

U-Boot 甚至包括一个可选的“gen_eth_addr”工具来生成有效的本地管理地址。这是一个用法示例,摘自他们的维基页面:https://www.denx.de/wiki/DULG/WhereCanIGetAValidMACAddress

$ make tools/gen_eth_addr
cc     tools/gen_eth_addr.c   -o tools/gen_eth_addr
$ tools/gen_eth_addr
ba:d0:4a:9c:4e:ce

关于linux - 是否有 Linux 或 U-Boot 支持在启动时从芯片读取 MAC 地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43637540/

相关文章:

linux - Zynq Linux Kernel加载地址

arm - 用于 u-boot 的 linux 内核的内存位置

linux-kernel - 带有冗余环境的 U-boot,fw_setenv 不会同时更新两个环境

linux - 在 lyx 演示文稿中插入视频剪辑并在 GNU/Linux 中播放

ruby - Vagrant:在 private_network 中设置 VM 的 MAC 地址(hostonly)

linux - 我的 git 1.8.4.2-1 有什么问题?

random - BLE IoT 设备通常如何生成其私有(private) MAC 地址?

java - 在Android上使用mac地址创建tcp连接

linux - 从 bash 脚本终止 ssh 或\和远程进程

linux - fail2ban ipv6 支持不起作用