阅读:2819回复:3
请教以太网驱动开发的几个问题!
我有几个问题不太明白,请那位高人不吝赐教.
1 MAC地址是从那里获得的。有的资料说从BSP得到,这样的话,使用同一个BSP开发的东东,MAC地址不就一样了吗?实际上好像我和几个同事各自有一个板子,上面的mac地址就一样。 也有说是从eeprom得到的,难道每个mac芯片上必须挂一个eeprom吗? 2 mac寄存器中multicast寄存器怎么设定?根据什么? |
|
沙发#
发布于:2002-10-19 21:35
关于网卡驱动程序中与mac地址有关的部分如下:
1,在attach()或probe()函数中从网卡的eeprom读取该块网卡的唯一地址(在以下的文字中将它称为EthernetID)到驱动程序拥有的一个变量(在以下的文字中将它称为dev_addr)中, 2,在open()函数中,驱动程序将保存在dev_addr中的EthernetID复制到网卡I/O空间中的MAC寄存器,也有网卡在其进行hardware reset后,网卡硬件自动从eeprom中将EthernetID复制到MAC寄存器。 3,IP协议程序中的输出函数调用选路输出函数,选路输出函数利用ARP协议(IPv4)得到下一眺(next hop)的mac地址,然后构造ethernet帧头,将源和目的mac地址填充(在linux中调用的是ether_header),最后调用网卡的输出函数(在linux中是hard_start_xmit)。在驱动程序的输出函数中,ethernet帧头已经构造好了。 2中的MAC寄存器很关键。网卡硬件中的程序(microcode,fireware,硬件电路?具体的我不清楚了)就是根据MAC寄存器中的值来判断共享介质上的以太帧是否属于自己。而eeprom中的EthernetID可以被驱动程序忽略,甚至可以被擦写。 关于multicast寄存器的填写,需要参照网卡的datasheet和programming guide,一般是将你的multicast address通过一个hash函数,然后再在multicast寄存器的相应位置位,这个hash函数各种网卡可能不同。 [编辑 - 10/19/02 by motif] |
|
板凳#
发布于:2002-10-21 17:01
1. 首先要问一下zhyxue兄用的是买来的网卡还是自己设计的网络适配?
如果是前者,一般网卡上都有一个eeprom用于存放MAC地址,系统启动时网卡从这儿读取。这个地址由网卡的生产商提供。driver也使用这个地址。当然写driver的时候可以覆盖这个地址,但是注意不要与网络中的其他设备的mac地址冲突。 如果自己设计硬件,自己可以指定一个地址(也要注意冲突问题,实际上mac地址是由某个机构分配的,开发的时候就马虎一点),一般也是把mac地址烧在某个rom地址上,一个产品的不同的板子要烧不同的mac地址。bsp在初始化的时候从这个地址读取这个值,这样相同的bsp运行在不同的板子上就会有不同的mac地址。 2. 关于mulicast寄存器的设定,基本如motif兄所说,该寄存器的作用像一个查找表,收到的mac帧的mac地址经过一个算法后,在这个表中查找以确定是否接受这个帧。 3. 欢迎送份...... |
|
|
地板#
发布于:2002-10-22 11:02
如果自己设计硬件,自己可以指定一个地址(也要注意冲突问题,实际上mac地址是由某个机构分配的,开发的时候就马虎一点),一般也是把mac地址烧在某个rom地址上,一个产品的不同的板子要烧不同的mac地址。bsp在初始化的时候从这个地址读取这个值,这样相同的bsp运行在不同的板子上就会有不同的mac地址。 如果是自己在rom中设的地址,一定要在网卡的驱动中将从rom中读取的地址写到网卡的MAC寄存器中,否则无法接收帧。 |
|