免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 12864 | 回复: 16

【求助】关于inb和inw的疑问 [复制链接]

论坛徽章:
0
发表于 2008-04-15 22:46 |显示全部楼层
初学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))还能确定是校验时读取的硬件地址数据么?

   请高手指教,谢谢!

论坛徽章:
0
发表于 2008-04-16 15:42 |显示全部楼层

回复 #1 njngypp 的帖子

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

论坛徽章:
0
发表于 2008-04-16 19:45 |显示全部楼层
原帖由 bluesky_jxc 于 2008-4-16 15:42 发表
>>那么,为什么(1)中三个字节的硬件地址是在三个连续端口中读出来的(inb中的"+0"、"+>>>1"、"+2"),而(2)中帧状态码和长度却是同一个端口呢?
>>而且如果对同一端口的连续读取会得到不同的数据,在(1) ...

强!学习了
这种base addr+counter的方式太无敌了!

论坛徽章:
0
发表于 2008-04-17 08:52 |显示全部楼层

回复 #3 zx_wing 的帖子

这不是叫强,而是无奈啊。
IO空间就64K,如果来个一一映射,估计高级一点的设备都不能用。
这也是为什么PCI大量采用MMIO的原因。
而且即使是PCI,高级一点的设备也是base+counter来实现的。例如128M的PCI RAM卡,可能也只能分配到2M/4M的MMIO空间。

论坛徽章:
0
发表于 2008-04-17 12:35 |显示全部楼层
原帖由 bluesky_jxc 于 2008-4-17 08:52 发表
这不是叫强,而是无奈啊。
IO空间就64K,如果来个一一映射,估计高级一点的设备都不能用。
这也是为什么PCI大量采用MMIO的原因。
而且即使是PCI,高级一点的设备也是base+counter来实现的。例如128M的PCI RA ...

那为啥不开窗喃,这种硬件维护一个计数器,软件还要跟踪计数器的方式明显就不方便使用,容易出错

论坛徽章:
0
发表于 2008-04-17 12:42 |显示全部楼层

回复 #5 zx_wing 的帖子

软件只需要维护base而已,counter是透明的,你可以看看PCI的Burst传输。

其实这就是“窗”啊

论坛徽章:
0
发表于 2008-04-17 13:16 |显示全部楼层
原帖由 bluesky_jxc 于 2008-4-17 12:42 发表
软件只需要维护base而已,counter是透明的,你可以看看PCI的Burst传输。

其实这就是“窗”啊

但这个和窗还不一样啊,不能随机访问啊。
比如才访问过编号为3的寄存器,想再访问一次就得轮到计数器加到下一次为3的时候?

论坛徽章:
0
发表于 2008-04-17 13:43 |显示全部楼层
这可咋整?  看不懂的帖子加不加精华?

论坛徽章:
0
发表于 2008-04-17 14:48 |显示全部楼层

回复 #7 zx_wing 的帖子

ISA不叫“窗”,我说PCI那种就叫“窗”,汗!

ISA完全可以将这个offset寄存器映射出来,这样就可以随机访问了塞,反正是memory,不会存在顺序问题。

不过这样说似乎有点不负责任,毕竟想不到那个时候的出发点。

今天看了用三极管电路实现的Memory,说了一句:那时候的三极管比电阻贵很多,所以设计的时候就是尽量减少三极管的数量。因此会多花费很多的电阻。拿到现在来说,也许就会优先考虑集成度了罢

论坛徽章:
0
发表于 2008-04-17 14:50 |显示全部楼层

回复 #5 zx_wing 的帖子

对了,你那个信誉积分怎么来的?我为什么没有呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP