无忧启动论坛

标题: how to get pxe mac by memory [打印本页]

作者: babyshin    时间: 2016-2-2 00:55
标题: how to get pxe mac by memory
本帖最后由 babyshin 于 2016-2-2 11:26 编辑

pxe 指令尾行会列印mac address
查了一下是源码中的这段

  1.       grub_printf ("\nmac : ");
  2.       for (i = 0; i < pxe_mac_len; i++)
  3.         {
  4.           pc = buf;
  5.           pc = pxe_outhex (pc, pxe_mac[i]);
  6.           *pc = 0;
  7.           grub_printf ("%s%c", buf, ((i == pxe_mac_len - 1) ? '\n' : '-'));
  8.         }
复制代码


似乎可以从记忆体位址中取得mac阵列
请问各位高手: pxe_mac详细的记忆体位址为何?

作者: 不点    时间: 2016-2-2 09:34
在回答这个问题之前,提醒一下网络上有如下的教程,可供深入了解 grub4dos 的内部变量和内部函数:

http://www.rmprepusb.com/tutorials/grub4dos/grub4dos-internal-variables-and-functions

回到正题。正如楼主所注意到的,在 fsys_pxe.c 中,定义了 pxe_mac 变量:

MAC_ADDR pxe_mac;

因此,它肯定在内存中。

但是,这个地址不是固定的,不同的编译器会把它放在不同的内存地址处,不同的 grub4dos 版本,也会产生不同的地址。

既然你懂得 C 语言,你肯定了解这个现象。

也就是说,用户无法直接获得 pxe_mac 的值。


楼主没讲清楚,你要这个 mac 值究竟有什么用?如果你的理由充分,开发者可以把它放在固定变量区,让用户能够直接访问它。

另外,这个变量虽然不在固定变量区,但是它在 int13 处理程序的空间上存有一个备份,叫做 saved_pxe_mac,可以在 asm.S 中找到它的定义。

就是说,只要你用 map 建立了虚拟盘,你就有办法找到这个 saved_pxe_mac,即使你脱离了 grub4dos 环境,也能获得 saved_pxe_mac 的值。

这是因为,int13 处理程序的空间是与操作系统无关的,任何变量,只要它处于 int13 的代码空间中,那么任何操作系统都能访问它。

在 asm.S 中,它的定义是这样的:


  1.         . = int13_handler + 0x124

  2. VARIABLE(saved_pxe_mac)
  3.         
  4.         .byte        0, 0, 0, 0, 0, 0
复制代码


也就是说,它位于 int13 处理程序空间的固定偏移量 0x124 处,长度为 6 个字节。

你需要在你的操作系统中找到 int13 处理程序空间的开头,也就能够获得 pxe_mac 的值了。


作者: chenall    时间: 2016-2-2 09:35
目前没有办法,但是可以通过批处理脚本来获取,比如以下脚本

  1. pxe > (md)0x200+1
  2. cat --locate=mac (md)0x200+1 | set k=
  3. set /a k=0x%k%+6
  4. cat --skip=%k% (md)0x200+1 | set mac=
  5. echo %mac%
复制代码

作者: babyshin    时间: 2016-2-2 11:23
我是做pxe量产的,

其中有一个很重要的一环: 如何纪录本机端的硬体讯息

uuid的数据来源不稳定(某些主板会是一串0), mac address就会是很好的依据了
作者: 不点    时间: 2016-2-2 11:43
babyshin 发表于 2016-2-2 11:23
我是做pxe量产的,

其中有一个很重要的一环: 如何纪录本机端的硬体讯息

楼上 chenall 已经告诉了获得 mac 地址的方法,应该可以满足你的需要了。






欢迎光临 无忧启动论坛 (http://wuyou.net./) Powered by Discuz! X3.3