QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2006|回复: 1

【求助】关于inb和inw的疑问

[复制链接]
发表于 2008-4-15 22:50:11 | 显示全部楼层 |阅读模式
初学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))还能确定是校验时读取的硬件地址数据么?

   请高手指教,谢谢!
发表于 2008-5-14 15:41:49 | 显示全部楼层
取决于硬件实现,还有我怀疑两边的 ioaddr 不是同一个地址
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-22 08:01 , Processed in 0.035254 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表