直接读取PCI网卡的MAC地址的原理与方法

—213—

直接读取PCI 网卡的MAC 地址的原理与方法

李全忠,王希超

(山东农业大学信息学院,泰安 271018)

摘 要:以RTL8139网卡为例,分析了从串行存储芯片AT93C46中直接读取MAC 地址的原理与方法,给出了相应的Delphi 语言实现程序,从而较好地解决了在应用程序中直接读取可靠的MAC 地址的技术问题。 关键词:PCI 总线;RTL8139网卡;AT93C46芯片;MAC

Principle and Method to Read MAC Address

of PCI Network Card Directly

LI Quanzhong, WANG Xichao

(College of Information, Shandong Agricultural University,Taian 271018)

【Abstract 】The principle and method to read MAC address directly from serial memory chip AT93C46 are analyzed and the relative executable program is given in Delphi.This provides the technique of reading MAC address directly from applied programs. 【Key words 】PCI Bus ;RTL8139 network card ;AT93C46 chip ;MAC

计 算 机 工 程Computer Engineering 第31卷 第18期

Vol.31 № 18 2005年9月

September 2005

·开发研究与设计技术·

文章编号:1000—3428(2005)18—0213—03

文献标识码:A

中图分类号:TP393

每块网卡都有一个全球唯一的48位(6B )的MAC 地址,在网络通信中起到区分每个节点的作用,有时也称MAC 地址为节点地址。正是由于MAC 地址数据的这个性质特点,使它成了不少应用软件实施保护的“指纹”,或用作安全方面的身份标志。然而,对于这类应用程序笔者实验发现,只要对Win9X 注册表中的MAC 数据进行相应变更,或对其PCI 网卡IO 空间的IDR0-IDR5寄存器进行相应改写,这些应用程序便能在这样的机器上正常运行。显见,这类程序在获取MAC 地址的途径上考虑不周,换言之,它们为了省事便简单地从存放MAC 拷贝的存储单元中读取MAC 地址。经进一步分析发现,即使在应用程序中通过NetBIOS 提供的API 接口函数获取MAC 地址,同样也是不可靠的,因为事实上利用上述API 函数获得MAC 地址的实质仍是从IDR0~IDR5寄存器中读取数据。那么,如何获取原本的MAC 地址?下面以RTL8139型网卡为例进行分析与探讨。

1 读取MAC 地址的基本思路

当电脑加电或网卡重启时,网卡自身就要做一些初始化工作。在这个过程中,RTL8139网卡的主控芯片8139就会从AT93C46(EEPROM )存储器中读取网卡的MAC 地址,然后存放到主控芯片IO 空间的偏移地址为0000-0005H 的6个8位可读写寄存器IDR0-IDR5中。即这6个寄存器存储的是MAC 地址的拷贝。

网卡工作时使用的MAC 就是从寄存器IDR0-IDR5中读取的,而不是从AT93C46中读取的,只有网卡重启时,才从AT93C46中读取MAC 地址。显然,获取原本的MAC 地址的基本思路是从AT93C46存储芯片中直接读取。

2 读取MAC 地址的基本原理

AT93C46是一个串行EEPROM 存储器。分析表明,要想从AT93C46中直接读取MAC 地址,就要根据AT93C46的控制时序和操作规范对其进行编程,而程序中的各种控制

信号和数据信号的传输与响应是通过它的命令寄存器93C46CR 实现的,显然,对AT93C46编程其实就是对93C46CR 编程。93C46CR 是一个8位的寄存器,其口地址为RTL8139的IO 空间基址偏移50H ,RTL8139的IO 空间基址由其配置空间的偏移10-13H 处的双字寄存器给出。

至此,可归结出读取MAC 地址的主要步骤:(1)检测RTL8139网卡是否存在。若存在,则进行下一步,否则退出;(2)获得RTL8139网卡的IO 空间基址,从而得到AT93C46的命令寄存器口地址;(3)对AT93C46编程,读取其存储器芯片中的MAC 地址。

3 读取MAC 地址的实现过程

3.1 获得RTL8139网卡的IO 空间基址

RTL8139网卡同其它PCI 总线设备一样,都有一个配置空间。配置空间是一个容量为256B 具有特定记录格式的地址空间。当电脑启动时,BIOS 便对PCI 设备的配置空间进行合理配置,包括对一些寄存器设置和存储器映射等。只有经过配置后的配置空间才能进行读写操作。表1 列出了RTL8139网卡配置空间中的关键字段。

表1 RTL8139网卡配置空间中的关键字段

这里的VID 、DID 字段是用来识别特定PCI 设备的标志;对PCI 网卡而言,偏移10-13H 是网卡的IO 空间基址寄存器。

作者简介:李全忠(1961—),男,副教授,研究方向为系统分析与网络数据库开发;王希超,副教授

收稿日期:2004-06-11 E-mail :lqz@https://www.360docs.net/doc/b211284811.html,

偏移量 长度

功能描述

00-01H 字 主控芯片制造商标志VID ,只读,RTL8139的VID=10EC

02-03H 字 设备标志DID ,只读,RTL8139的DID=8139

10-13H

双字 IO 空间基址寄存器,可读写

—214

—对配置空间的读写操作是通过PCI 协议规定的两个特定的32位IO 寄存器CF8H 和CFCH 实现的。CF8H 称为配置地址寄存器,用于产生配置空间的地址,CFCH 称为配置数据寄存器,用于保存配置空间的读写数据。配置地址寄存器格式如图1。

在配置地址寄存器中,当使能位为1时表示可以对配置空间进行读写操作;总线号为系统的256个总线之一,在AT 系列机指PCI 插槽的总线号,一般为0~5;设备号为PCI 设备的编号;功能号用区分多功能设备,单功能网卡设备为000b ;6位寄存器号用于寻址该PCI 设备配置空间64

个双字寄存器。

在Delphi 语言中若变量PCIID 的值为“813910EC ”,即RTL8139网卡的VID 和DID 标志,则下面的函数返回的是RTL8139网卡的IO 空间基址(如果RTL8139网卡存在的话),相应的AT93C46命令寄存器的口地址(程序中记作CR93C46)为$50+Get8139IO(PCIID)。

function Get8139IO(PCIID:String):Word; var

Bus,Device:Byte; O_Add,I_Dat:Integer; begin

Result:=$ffff; for Bus:=0 to 5 do for Device:=0 to 31 do begin

O_Add:=$80000000+Bus*$10000+(Device*8)*$100; asm mov dx,$cf8 mov eax,O_Add out dx,eax mov dx,$cfc in eax,dx mov I_Dat,eax end;

if IntToHex(I_Dat,8)=PCIID then // 若RTL8139 //网卡存在

begin

O_Add:=$80000000+Bus*$10000+(Device*8)*$100+$10; asm mov dx,$cf8 mov eax,O_Add out dx,eax mov dx,$cfc in eax,dx and eax,$fffe

mov @Result,ax // 返回//IO 空间基址

end; end; end; end;

应当指出,对于IO 空间基址,最低两位读出时固定为

01b ,对地址本身无效,应当屏蔽掉,对于AT 机IO 有效地址为16位,因此高16位也应该屏蔽掉。 3.2 读取AT93C46存储器中的MAC 地址

AT93C46是一个1k 位的EEPROM ,它可以是8位或16位存储模式。在RTL8139主控芯片下使用的是16位存储模式,即以字为单位进行编址和寻址。其中网卡的MAC 地址存储在它的第7~9连续的3个字中。每个字包含MAC 地址中的两个字节,且低字节在前高字节在后。

AT93C46的命令寄存器是1个8位寄存器,其功能见 表2。

表2 AT93C46的命令寄存器功能描述

由表2知道,AT93C46命令寄存器的低4位与AT93C46芯片的管脚一一对应,即可通过读写AT93C46的命令寄存器来读写AT93C46存储器,从而获得MAC 地址。读取AT93C46存储器的指定字地址上的16位数据的时序图如图2。

图2中的0N A A L (5A A N =)为字地址,地址之前的110b 为读操作译码指令码,0N D D L (15D D N =)为相应字地址上的16位数据,它之前的0b 为哑元位。

在Delphi 语言中若变量Addr 的值为7(8,9),则下面的函数返回的是该地址所存储的16位数据,即MAC 地址的前两字节(中间两字节,最后两字节)。这里的CR93C46表示AT93C46的命令寄存器口地址,可由$50+Get8139IO (PCIID)计算得到。

function Read_93C46(const Addr:Byte;const CR93C46:Word): Word;

begin asm

// 7 6 5 4 3 2 1 0

//eem1 eem0 nc nc eecs eesk eedi eedo(93C46命令寄存器) // cs sk di do(AT93C46管脚) push ebx xor bx,bx mov dx,CR93C46 //out 1b

mov al,8ah // 1000 1010b:cs=1,sk=0,di=1 out dx,al

mov al,8eh // 1000 1110b:cs=1,sk=1,di=1 out dx,al //out 1,0,A5,…,A0b

位 符号 功能描述 7-6 EEM1-0 =10b ,表示93C46编程模式 5-4 --- 不用

3 EECS 对应93C46的CS(Chip Select)脚

2 EESK 对应93C46的SK(Serial Data Clock)脚 1 EEDI 对应93C46的DI(Serial Data Input)脚 0 EEDO 对应93C46的DO(Serial Data Output)脚

31 30 24 23 16 15 11 10 8 7 2 10 使能位 保留 总线号 设备号功能号 寄存器号00图1 配置空间地址寄存器格式

—215—

mov cx,8 mov ah,Addr or ah,80h @@L0: shl ah,1 jc @@L1

mov al,88h // 1000 1000b:cs=1,sk=0,di=0 out dx,al

mov al,8ch // 1000 1100b:cs=1,sk=1,di=0 out dx,al jmp @@L2

@@L1: mov al,8ah // 1000 1010b:cs=1,sk=0,di=1 out dx,al

mov al,8eh // 1000 1110b:cs=1,sk=1,di=1 out dx,al @@L2: loop @@L0

//in 0,D15,…,D0b 循环送入BX 寄存器 mov cx,16 //

@@L3: mov al,88h // 1000 1000b:cs=1,sk=0,di=0 out dx,al

mov al,8ch // 1000 1100b:cs=1,sk=1,di=0 out dx,al shl bx,1 in al,dx and al,01h jz @@L4 or bx,1 @@L4: loop @@L3

mov al,88h // 1000 1000b:cs=1,sk=0,di=0 out dx,al

mov al,00h // 0000 0000b:cs=0,sk=0,di=0 out dx,al xchg bh,bl mov @Result,bx pop ebx end; end;

4 结束语

在应用程序中直接读取PCI 网卡的MAC 地址,确实显

得有些复杂且还有一定的实现难度,但是由此获得的MAC 地址数据却是准确可靠的。另外,利用本文所提供的思想方法,可进一步实现在应用程序中直接修改某些PCI 网卡的MAC 地址,不再赘述。

参考文献

1 Shanley T, Anderson D. PCI System Architecture.Mindshare,Inc., 1999

2 RTL8139C(L) Enhanced PCI/Mini-PCI/Cardbus 3.3V Single- chip 10/100M Fast Ethernet Controller with Power Management. https://www.360docs.net/doc/b211284811.html,

3 李金忠,岳 训,费玉奎.直接读取网卡节点地址的原理与方法.计算机工程, 2003,29(14): 181-182

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

(上接第179页)

(a) Yale B

(b) CMU PIE

图2 SQI 消除光照的实验结果

(a)在CMU PIE 上

(b) 在Yale B 上

图3 自商图像和 Relighting 算法的识别结果 5 结论

介绍了一种新的称为自商图像的商图像概念,作为人脸图像的一种不随光照变化的表示方法。根据 Lambertian 模型对自商图像算法的不随光照变化和随光照变化的特性进行了分析,并建立了 QI 和 SQI 之间的关系,分析了它们之间的差异。利用多尺度各向异性滤波实现了自商图像算法。实验结果显示 SQI 方法可以显著提高不同光照条件下人脸图像的识别率。

参考文献

1 Jobson D J, Rahman Z, Woodell G A. Properties and Performance of a Center/Surround Retinex. IEEE Transactions on Image Processing, 1997, 6(3):451-462

2 Jobson D J, Rahman Z, Woodell G A. A Multiscale Retinex for Bridging the Gap Between Color Images and the Human Observation of Scenes. IEEE Transactions on Image Processing, 1997,6(7): 965-976

3 Gross R,Brajovie V

. An Image Preprocessing Algorithm for Illumination Invariant Face Recognitoin. In: 4th International Conference on Audio and Video Based Biometric Person Authentication,2003: 10-18

4 Epstein R, Yuille A L, Bellumeur P N. Learning Object Reorie-ntations form Lighting Variation. In Object Rep. in Computer Vision 2, Springer-verlag, 1996:179-199

5 Sim T, Baker S, Bsat M. The CMU Pose, Illumination, and Expression (PIE)Database. In: Proceedings of the IEEE International Conference on Automatic Face and Gesture Recognition,2002-05

相关主题
相关文档
最新文档