阅读:1390回复:6
关于协议驱动接收数据数据源地址的问题
我想问个问题,就是协议驱动接收数据时是从什么地方把数据拷贝到我们提供的数据包里面.也就是说NdisTransferData是直接从物理内存复制数据到协议提供的数据包呢,还是网卡驱动已经倒过一次内存后的地址?
另外PacketReceiveIndicate 的LookAheadBuffer是一个什么地址,它是直接指向网卡的内存呢还是也是网卡驱动倒过一次内存后的地址? 其实这两个问题一样,就是想知道协议驱动是直接从网卡驱动收数据,还是说网卡先把数据放到一块计算机上的内存,然后再从这块内存复制数据? 希望大家多多指教,谢谢! |
|
|
沙发#
发布于:2008-04-16 08:54
没有人知道吗?还是我没说清楚?
|
|
|
板凳#
发布于:2008-04-24 12:44
其实你的两种猜测都都是一样的。
网卡硬件里有一块接收缓冲区,当缓冲区满时产生硬件中断,通知网卡驱动来接收,这个网卡驱动运行在系统内核层,驱动将数据放在一个缓冲区中,可以认为是物理地址。系统再遍历注册的协议驱动,通知它们有数据接要来了。 答案就是,你的协议驱动是从另一块区域中复制数据,因为这个原始数据只存在一份,但协议驱动可以有多个。 |
|
地板#
发布于:2008-04-29 22:55
多谢asm61,我自己想了一下也觉得是这样
|
|
|
地下室#
发布于:2008-06-04 16:33
为了读取速度快(节约等待协议通知的时间),能不能直接拦截网卡硬件中断,发现有了中断就copy到自己定义的内存区?
|
|
|
5楼#
发布于:2008-06-10 18:14
引用第4楼stonne于2008-06-04 16:33发表的 : 关注中,如果能在协议驱动实现这个就好了 |
|
|
6楼#
发布于:2008-06-26 13:51
引用第4楼stonne于2008-06-04 16:33发表的 : 我想是不能的。而且这种做法恰得其反,速度只会变慢。这好比说:一种做法是复制1024次,每次只复制1个字节;另一种做法是,复制一次,一次就完成1024个字节。哪个快呢? 再说系统内核会帮你处理好乱序,重传,超时等复杂的网络问题。 所以说我们的驱动等着系统通知是最好的,要加快速度可以从优化自己的驱动或应用入手。 |
|