cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
阅读:1238回复:3

在驱动中如果占cpu比率比较大,应该如何把cpu利用率降下来呢

楼主#
更多 发布于:2005-07-01 21:53
  我的ip校验和不知为何占用cpu比率比较大,如何在能降低cpu占用率,使用系统工作线程行吗?
走走看看开源好 Solaris vs Linux
yuanyuan
驱动大牛
驱动大牛
  • 注册日期2003-01-15
  • 最后登录2010-08-04
  • 粉丝0
  • 关注0
  • 积分1025分
  • 威望300点
  • 贡献值0点
  • 好评度232点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-07-02 10:04
代码贴出来看看
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-07-02 22:27
对,一个checksum不应该占用太大的CPU
估计是你的代码问题
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
地板#
发布于:2005-07-06 10:32
USHORT
checksum(
       IN USHORT *buffer,
       IN int size
)
{
       register unsigned long       cksum = 0;
       register int                     sizeL = size;

       while(sizeL > 1)
       {
              cksum       +=       *buffer++;
              sizeL -=       2;
       }

       if(sizeL )
       {
              cksum += *(UCHAR*)buffer;
       }

       cksum = (cksum >> 16) + (cksum & 0xffff);
       cksum += (cksum >>16);

       return (USHORT)(~cksum);
}


NDIS_STATUS
CheckTcpipSendPacket(IN OUT       PNDIS_PACKET       packet)
{
       PNDIS_BUFFER       FirstBuffer = NULL;
       PNDIS_BUFFER       Buffer = NULL;
       int                            Length = 0;
       PETHERNET_FRAME pEthernetFrame = 0;
       WORD                     ethernetFrameType = 0;
       PIP_HEADER              pIpHeader = 0;
       int                            ipHeaderLen = 0;
       UINT            TotalPacketLength;

#ifdef NDIS51
    NdisGetFirstBufferFromPacketSafe(
        packet,
        &FirstBuffer,
        &pEthernetFrame,
        &Length,
        &TotalPacketLength,
        NormalPagePriority);    
       if (pEthernetFrame == NULL)
    {        
        Length = 0;
    }
#else
    NdisGetFirstBufferFromPacket(
        packet,
        &FirstBuffer,
        &pEthernetFrame,
        &Length,
        &TotalPacketLength);
#endif

       if (Length >= ETHERNET_FRAME_LENGTH)
    {              
              int              frameLen = ETHERNET_FRAME_LENGTH;
              ethernetFrameType = pEthernetFrame -> FrameType;

              if(ethernetFrameType == ETHERNET_8021P_TAG_TYPE)
              {
                     ethernetFrameType =(WORD UNALIGNED)*((UCHAR*)&pEthernetFrame -> FrameType + 4);
                     frameLen += 4;
              }

//              PrintEthernetFrame(pEthernetFrame, Length);

              if(ETHERNET_FRAME_TYPE_TCPIP != ethernetFrameType)
                     return XF_SUCCESS;
              
              if((Length - frameLen) >= IP_HEADER_LENGTH)
              {
                     pIpHeader = (PIP_HEADER)((BYTE*)pEthernetFrame + frameLen);
                     Length = Length - frameLen;                    
              }
              else
              {
                     NdisGetNextBuffer(FirstBuffer, &FirstBuffer);

                     if(FirstBuffer == NULL)
                            return XF_SUCCESS;

                     NdisQueryBufferSafe(FirstBuffer, &pIpHeader, &Length, HighPagePriority);

                     if(pIpHeader == NULL || Length < IP_HEADER_LENGTH)
                            return XF_SUCCESS;
              }
              
//              PrintIp(pIpHeader, Length);
              
              
              {
                     pIpHeader->CheckSum = 0;
                     pIpHeader->CheckSum = checksum((USHORT*)pIpHeader,GET_IP_HEADER_LENGTH(pIpHeader->VersionAndHeaderLength));              
              }
       }
       else
              dprintf(("CheckTcpipSend: invalid ether packet \n\n"));

       return XF_SUCCESS;
}

去掉checksum就没有问题了.加上checksum就会占用cpu 10%左右,有的达40%. 而且不是所有计算机都是这样占cpu的.大部分还是好的.
走走看看开源好 Solaris vs Linux
游客

返回顶部