guocaijian
驱动牛犊
驱动牛犊
  • 注册日期2005-04-06
  • 最后登录2006-02-15
  • 粉丝0
  • 关注0
  • 积分137分
  • 威望21点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
阅读:1590回复:7

BUFFER方式和DIRECT_IN/OUT方式哪个能传的最大数据大??

楼主#
更多 发布于:2005-06-15 18:58
我的目的是要用NDIS接口传输大数据,应用程序与中间层驱动通信用BUFFER方式和DIRECT_IN/OUT方式哪个能传的最大数据大??我该用哪种? :(
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2005-06-15 21:31
我的目的是要用NDIS接口传输大数据,应用程序与中间层驱动通信用BUFFER方式和DIRECT_IN/OUT方式哪个能传的最大数据大??我该用哪种? :(

两种方式,不存在哪个能传的最大的数据大的问题.但对于传大量数据,显然DIRECT的方式效率更高
guocaijian
驱动牛犊
驱动牛犊
  • 注册日期2005-04-06
  • 最后登录2006-02-15
  • 粉丝0
  • 关注0
  • 积分137分
  • 威望21点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-06-16 00:00
我把数据从应用程序传到DDK中间层驱动,然后底层用FC光纤通道网卡传输,我现在用的是BUFFER方式发现一个包最大能传4086个字节,多一个都不能传,底层FC应该不止只能容忍4086个的,那么到底是什么限制它???这个最大量是不是受应用程序到中间层通信的限制????我想应该是一次能传几兆的,因为低层FC会自动分包
 :(
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2005-06-16 09:53
我把数据从应用程序传到DDK中间层驱动,然后底层用FC光纤通道网卡传输,我现在用的是BUFFER方式发现一个包最大能传4086个字节,多一个都不能传,底层FC应该不止只能容忍4086个的,那么到底是什么限制它???这个最大量是不是受应用程序到中间层通信的限制????我想应该是一次能传几兆的,因为低层FC会自动分包
 :(

不应该有这个限制。但还是应该用DIRECT,效率高多了
guocaijian
驱动牛犊
驱动牛犊
  • 注册日期2005-04-06
  • 最后登录2006-02-15
  • 粉丝0
  • 关注0
  • 积分137分
  • 威望21点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-06-16 19:12
direct方式是不是计算机的DMA直接存储方式,不耗CPU的那种?能发的最大数据到底会受什么限制呢?肯定不会是无线大吧
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2005-06-16 19:27
direct方式是不是计算机的DMA直接存储方式,不耗CPU的那种?能发的最大数据到底会受什么限制呢?肯定不会是无线大吧

DIRECT不是DMA,是和BUFFER相对应
1.BUFFER系统会分配一块内存,把inbuffer拷贝过来,驱动返回后,
会把这块buffer拷贝回OutputBuffer.
2.DIRECT是系统把用户态的buffer直接锁定到内核空间,所以驱动可以直接往这块空间拷贝,对比BUFFER的方法,就知道了为什么效率高

3。能拷贝的最大数据受系统可用的非分页内存的限制
guocaijian
驱动牛犊
驱动牛犊
  • 注册日期2005-04-06
  • 最后登录2006-02-15
  • 粉丝0
  • 关注0
  • 积分137分
  • 威望21点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-06-17 00:10
哦!!!!!!!!!原来如此啊,万分感谢版主!!!弄得我每天必光顾此论坛啊!!
我把从应用程序来的数据通过NdisChainBufferAtFront全部放在与包关联的第一个缓冲区里,它会不会限制最大字节数??假如想给包练n个缓冲区,是不是要调用n次NdisChainBufferAtFront?每调用一次,原来的第一缓冲区就变为第二了??
我现在把buffer方式改为direct方式了,发现还是只能传输4086个字节,发送是没出错,可是接收方一收到马上系统从启动或有时在接收函数设置的断点没反映,能否给点建议,这是为什么??
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
7楼#
发布于:2005-06-17 10:28

我把从应用程序来的数据通过NdisChainBufferAtFront全部放在与包关联的第一个缓冲区里,它会不会限制最大字节数??假如想给包练n个缓冲区,是不是要调用n次NdisChainBufferAtFront?每调用一次,原来的第一缓冲区就变为第二了??
我现在把buffer方式改为direct方式了,发现还是只能传输4086个字节,发送是没出错,可是接收方一收到马上系统从启动或有时在接收函数设置的断点没反映,能否给点建议,这是为什么??

1。要考虑网卡的MTU, 一个NDIS_PACKT,包括所有的NDIS_BUFFER,不能大于这个数.对于一般以太网,不包括14字节的头,1500。
2。关于receive,用softice调试。
游客

返回顶部