阅读:1253回复:2
有几个关于发送数据报中用到的概念搞不清楚,请指教(给分)
有几个关于发送数据报中用到的概念搞不清楚,请指教:
1:系统缓冲池的概念: NDIS_HANDLE pPool; NdisAllocateBufferPool(&Status,&pPool,16); 2:包描述符池的概念: ` NDIS_HANDLE PacketPool; NdisAllocatePacketPool(&status,&PacketPool, TRANSMIT_PACKETS,sizeof(PACKET)RESERVED)); 3:包描述符的概念: PNDIS_PACKET MyPacket; NdisAllocatePacket(&status,&MyPacket,PacketPool); 4:缓冲区描述符的概念: PNDIS_BUFFER pBuffer; NdisAllocateBuffer(&status,&pBuffer,pPool,pMemory,60); 5:MDL内存描述符链表的概念: 请解释一下以上5个概念,谢谢 |
|
|
沙发#
发布于:2004-06-23 10:09
这是一串问题,一起说吧。
包描述符是数据包的存在形式。他存放在包描述符池中,但不是必须的,也可以申请包描述符的时候现申请一块内存,但事先申请好快点,总之必须有一块内存存放NDIS_PACKET这个结构。 缓冲区描述符是缓冲区的存在形式。关于池的解释同上。 MDL是内存的存在形式(RING3没有这个必要)。NDIS隐藏了这个,看看NDIS.H中PACKET的定义就明白了。 一个数据包有N个缓冲区组成,一个缓冲区由N块内存(MDL)组成。 |
|
板凳#
发布于:2004-06-23 10:29
所谓的池你可以理解为就是一个指针数组或链表,它里面保存了Packet或者Buffer的指针,并且已经为这些指针指向的结构分配好了内存。而NdisAllocatePacket和NdisAllocateBuffer就是取出这些已分配的结构。
我想Ndis只所以要实现Packet->Buffer->Data的结构,主要是为了实现“零拷贝”内存,即它可以用一个NdisBuffer来指向用户数据(SocketBuffer),而每个协议(如TCP、UDP、IP及MAC等)则各自申请一个NdisBuffer来存储自己协议头部的内容,所有这些NdisBuffer被链接到一个Packet中来描述一个完整的Ethernet包。这样在Miniport中看到的Packet,协议层没有做任何拷贝过程,这样就减轻了CPU的负担。 |
|