aldsd
驱动牛犊
驱动牛犊
  • 注册日期2004-02-26
  • 最后登录2005-05-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1253回复:2

有几个关于发送数据报中用到的概念搞不清楚,请指教(给分)

楼主#
更多 发布于:2004-06-23 09:13
有几个关于发送数据报中用到的概念搞不清楚,请指教:
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个概念,谢谢
aldsd
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-06-23 10:09
    这是一串问题,一起说吧。
    包描述符是数据包的存在形式。他存放在包描述符池中,但不是必须的,也可以申请包描述符的时候现申请一块内存,但事先申请好快点,总之必须有一块内存存放NDIS_PACKET这个结构。
    缓冲区描述符是缓冲区的存在形式。关于池的解释同上。
    MDL是内存的存在形式(RING3没有这个必要)。NDIS隐藏了这个,看看NDIS.H中PACKET的定义就明白了。
    一个数据包有N个缓冲区组成,一个缓冲区由N块内存(MDL)组成。
bingjie
驱动小牛
驱动小牛
  • 注册日期2001-08-15
  • 最后登录2007-11-29
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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的负担。
游客

返回顶部