绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
关于inb和inw的疑问
2020-05-19 11:35:22

问题:
初学linux内核,在阅读网络设备驱动程序时对inb和inw函数的用法感到不解:

(1)ISA网卡驱动程序的探测过程(函数netcard_probe1()中),从起始端口读取3字节网卡硬件地址进行校验:
if ( inb(ioaddr+0) != SA_ADDR0 ¦ ¦ inb(ioaddr+1) != SA_ADDR1 ¦ ¦ inb(ioaddr+2) != SA_ADDR3 )
{ return -ENODEV; }
...
for ( i=0; i <6; i++ )
printk("%2.2x" , dev->dev_addr = inb(ioaddr+i));

(2)在接收函数中(函数net_rx()),出现:
int status = inw(ioaddr);
int pkt_len = inw(ioaddr);
分别表示读取帧状态码和帧长度,是从同一个端口读到的一个包中的两个不同数据

那么,为什么(1)中三个字节的硬件地址是在三个连续端口中读出来的(inb中的"+0"、"+1"、"+2"),而(2)中帧状态码和长度却是同一个端口呢?
而且如果对同一端口的连续读取会得到不同的数据,在(1)中,读取地址校验完后的打印过程(inb(ioaddr+i))还能确定是校验时读取的硬件地址数据么?

请高手指教,谢谢!

解答:

>>那么,为什么(1)中三个字节的硬件地址是在三个连续端口中读出来的(inb中的"+0"、"+>>>1"、"+2"),而(2)中帧状态码和长度却是同一个端口呢?
>>而且如果对同一端口的连续读取会得到不同的数据,在(1)中,读取地址校验完后的打印过程>>(inb(ioaddr+i))还能确定是校验时读取的硬件地址数据么?
ISA网卡通过连续的3个8-bit IO端口来得到硬件的识别码。并将内部的RAM影射到一个16bit的IO端口,并且有一个counter计数器跟踪每次的读操作,每次读,counter增加,内部寻址是base+counter 的方式。
这些都是硬件决定的,读代码不能脱离Spec


文章来源CU社区:【求助】关于inb和inw的疑问

分享好友

分享这个小栈给你的朋友们,一起进步吧。

内核源码
创建时间:2020-05-18 13:36:55
内核源码精华帖内容汇总
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • 飘絮絮絮丶
    专家
戳我,来吐槽~