阅读:1938回复:19
关于改造 Passthru,请给点建议。
我想达到这样的效果,每从上层接到一个包或从底层收到一个包,都将包数据复制到自己的“单一缓冲区”中,使包数据变成连续的。
这样一来,肯定还要分配缓冲池,那么缓冲区描述符所描述的内存该怎么分配?每得到一个包就调用 NdisAllocateMemory 分配?这样做效率会不会很差? 应该怎么做?大家请给点建议! |
|
沙发#
发布于:2002-12-05 16:04
你可以一次分配若干个,然后再分片用一个list管理,用的时候从list中取,用完了再还回去即可。
|
|
板凳#
发布于:2002-12-05 18:18
一次就分配一个大的内存先。
|
|
|
地板#
发布于:2002-12-06 10:55
那我为每个缓冲区预留的缓冲区应该有多大?也就是说一个包最大能有多大?我看到 PCAUSA 的 PIM 代码里是 2048 Bytes。
|
|
地下室#
发布于:2002-12-06 19:19
记得胡老大的VPN就是自己分配的内存!呵呵,不一定非要进行二次分配吧!!
|
|
|
5楼#
发布于:2002-12-06 21:59
使包数据变成连续的 你想要达到什么效果??详细说一说?是让包在一块连续的内存中??那你只能是先申请一块大内存,然后往里面copy了 |
|
|
6楼#
发布于:2002-12-07 09:57
对,就是这个意思。象 PCAUSA 的 PIM 那样,每收到一个包就把它复制到一个连续的缓冲区中,我不知道这样做一般的或者说比较优化的方法是什么。我现在在初始化的时候一次性的申请了 N 块 2048 Bytes 的内存用来完成这个工作。
|
|
7楼#
发布于:2002-12-07 10:16
我没有仔细看他处理收到的包的过程,不过他好像只是把一个packet的buffercopy到了一块连续的缓冲区了,不是把N个packet的buffer都copy到一个连续的缓冲区了吧
|
|
|
8楼#
发布于:2002-12-07 10:19
对啊,它是把一个包的数据都复制到了一个连续的缓冲区中,我实现申请了 N 块以备后用,大概我上面没说清楚。
那 mikeluo,你认为该怎么做的呢? |
|
9楼#
发布于:2002-12-07 10:30
你只是想把一个packet的buffer copy到一个连续的内存中么?如果是这样的话,你可以动态申请的,每次根据receive里面的packetsize来申请一块合适的内存
|
|
|
10楼#
发布于:2002-12-07 11:28
可是 mikeluo,这样效率会不会很差(每处理一个包就动态申请,处理完再释放)?
我现在在初始化期间可能申请的内存太多了,Passthru 居然不能工作了! |
|
11楼#
发布于:2002-12-07 11:30
那样不会差到哪里去的,协议层也是动态分配的
|
|
|
12楼#
发布于:2002-12-07 11:37
你的 VPN 也是在处理包的时候这样操作吗?我还听说如果在 SendPacket 里面处理包的话会降低效率,所以现在对程序结构和运作逻辑都觉得挺没底!
|
|
13楼#
发布于:2002-12-07 11:40
第一次做 WDM 和 IMD,感觉就象到了外太空,又新奇又觉得心里没数,呵呵,还望老兄指点!
|
|
14楼#
发布于:2002-12-07 11:41
我都是在收包处理的,很多VPN也都是,除非有硬件的加密卡,我的发包是发一个处理一个,收包是有一个队列,
|
|
|
15楼#
发布于:2002-12-07 13:19
mikeluo,最后一个问题!为什么收包就要特殊处理?
|
|
16楼#
发布于:2002-12-07 13:27
收包的时候如果处理的慢的话,ndis的缓冲区满了以后就会丢包了,
发包是你交给ndis的,我是这样理解的, |
|
|
17楼#
发布于:2002-12-07 13:32
哦,原来如此,又学到东西了!给分!
|
|
18楼#
发布于:2002-12-07 13:36
老大,以后给分你就一次给个够吧,俺的信箱里一下收到6封信,删都要删半天
|
|
|
19楼#
发布于:2002-12-07 13:38
哈哈,好的!
|
|