• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Alex

            Faith First

            常用鏈接

            統計

            資料

            最新評論

            自定義linux內核調試print

            調試信息過多造成dmesg無法完全顯示怎么辦?

             

            #ifndef __KERNEL__
            #define __KERNEL__
            #endif
            #ifndef MODULE
            #define MODULE
            #endif

            #if defined(MODVERSIONS) && !defined(__GENKSYMS__)
            #include
            #endif

            #ifdef DBGPRT_OUTVER
            #include "dbgprint.ver" /* redefine "dbgprint" to include CRC */
            #endif

            #ifndef EXPORT_SYMTAB
            #define EXPORT_SYMTAB
            #endif

            #include
            #include
            #include
            #include
            #include
            //#include
            #include
            #include

            #include "dbgprint.h"

            EXPORT_SYMBOL(DbgPrint);

            #ifndef DBGPRT_VER
            #define DBGPRT_VER "0.90"
            #endif

            int dbgprt_major=65; //the major device number
            char dbgprt_dev_name[]={"ALIDbg"}; //the name in /dev
            char dbgprt_ver[]={DBGPRT_VER};
            //module paramaters and infos
            MODULE_AUTHOR("ALI_SHA");
            MODULE_DESCRIPTION("Ali M3321 DEBUGER PRINT.");

            MODULE_PARM(dbgprt_ver,"s");
            MODULE_PARM_DESC(dbgprt_ver,DBGPRT_VER);

            MODULE_PARM(dbgprt_major,"i");
            MODULE_PARM_DESC(dbgprt_major,"65");

            MODULE_PARM(dbgprt_dev_name,"s");
            MODULE_PARM_DESC(dbgprt_dev_name,"ALIDbg");

             

            wait_queue_head_t pSleep;

            //used to manager the buffer
            char chrgMessage[4096]; //the last 1024 don't use for overflow
            char* pchEnd;
            char* pchStart;
            char fTurn; //pchEnd littl than pchStart
            char* pchMessageEnd; //the end pointer of array
            int nOverLen;

             

            struct file_operations ALIDbgOps =
            {
            THIS_MODULE,
            NULL,
            DbgRead,
            NULL, //ali_write,
            NULL,
            NULL,
            DbgIoCtl,
            NULL,
            DbgOpen,
            NULL,
            DbgClose,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL
            };

            int init_module(void)
            {
            int nResult;

            nResult = register_chrdev(dbgprt_major,dbgprt_dev_name,&ALIDbgOps);
            if(nResult<0)
            {
            printk("can't register this device!\n");
            return -1;
            }

            pchStart=chrgMessage;
            pchEnd=chrgMessage;
            pchMessageEnd=chrgMessage+3072;
            fTurn=0;

            init_waitqueue_head(&pSleep);
            return 0;

            }

            int cleanup_module()
            {
            unregister_chrdev(dbgprt_major,dbgprt_dev_name);
            return 0;
            }


            int DbgOpen(struct inode* i,struct file *f)
            {
            MOD_INC_USE_COUNT;
            return 0;
            }

            int DbgClose(struct inode* i,struct file *f)
            {
            wake_up_interruptible(&pSleep);
            MOD_DEC_USE_COUNT;
            return 0;
            }

            ssize_t DbgRead (struct file* fileDbg, char* pchMsg, size_t nLen, loff_t* pOff)
            {
            int nMsgLen;

            if(!fTurn && (pchStart==pchEnd) )
            {
            interruptible_sleep_on(&pSleep);
            }

            if(!fTurn)
            {
            nMsgLen=pchEnd-pchStart;
            if(nLen {
            copy_to_user(pchMsg,pchStart,nLen);
            pchStart+=nLen;
            return nLen;
            }
            copy_to_user(pchMsg,pchStart,nMsgLen);
            }
            else
            {
            if(nLen {
            copy_to_user(pchMsg,pchStart,nLen);
            pchStart+=nLen;
            return nLen;
            }

            copy_to_user(pchMsg,pchStart,nOverLen);
            fTurn=0;

            nMsgLen=pchEnd-chrgMessage;
            if( (nLen-nOverLen) {
            copy_to_user(pchMsg+nOverLen,chrgMessage,nLen-nOverLen);
            pchStart=chrgMessage+nLen-nOverLen;
            return nLen;
            }
            copy_to_user(pchMsg+nOverLen,chrgMessage,nMsgLen);
            nMsgLen+=nOverLen;
            }

            pchStart=chrgMessage;
            pchEnd=chrgMessage;

            return nMsgLen;
            }

            int DbgIoCtl(struct inode* i,struct file *f,unsigned int cmd,unsigned long arg)
            {
            switch(cmd)
            {
            case DBGPRT_IO_CANCLE:
            wake_up_interruptible(&pSleep);
            break;

            default:
            return -1;
            }

            return 0;
            }

            int DbgPrint(const char *fmt, ...)
            {
            va_list args;
            int nMessageLen;

            va_start(args, fmt);
            nMessageLen=vsprintf(pchEnd,fmt,args);
            va_end(args);

            pchEnd+=nMessageLen;

            if(pchEnd>=pchMessageEnd)
            //the message overflowed
            {
            nOverLen=pchEnd-pchMessageEnd;
            pchEnd=chrgMessage;
            fTurn=1;
            }
            else
            {
            //the end pointer exceed the start pointor from back
            if(fTurn && (pchEnd>pchStart))
            {
            pchStart=pchEnd;
            *pchStart=255; //add a alarmer
            }
            }

            wake_up_interruptible(&pSleep);

            return nMessageLen;
            }

            我所說的版本問題已經解決了.
            可以用ioctl來cancle掉被掛起的read.



            #ifndef _DBGPRT_H_
            #define _DBGPRT_H_

            #define DBGPRT_IO_CANCLE 1

            int DbgOpen(struct inode* i,struct file *f);
            int DbgClose(struct inode* i,struct file *f);
            ssize_t DbgRead (struct file* fileDbg, char* pchMsg, size_t nLen, loff_t* pOff);
            int DbgIoCtl(struct inode* i,struct file *f,unsigned int cmd,unsigned long arg);
            int DbgPrint(const char *fmt, ...);

            #endif//_DBGPRT_H_

            posted on 2009-12-30 14:06 alexhappy 閱讀(342) 評論(0)  編輯 收藏 引用 所屬分類: 調試技巧

            97久久精品午夜一区二区| 麻豆精品久久久久久久99蜜桃| 伊人久久大香线蕉AV色婷婷色| 香蕉久久av一区二区三区| 久久er99热精品一区二区| 99久久精品免费观看国产| 日韩久久久久中文字幕人妻| 精品综合久久久久久98| 久久亚洲精品国产精品| 国产精品久久久久一区二区三区| 久久久亚洲精品蜜桃臀| 欧洲人妻丰满av无码久久不卡| 伊人久久大香线焦综合四虎| 久久综合久久性久99毛片| 久久综合狠狠综合久久| 91超碰碰碰碰久久久久久综合| 亚洲七七久久精品中文国产| 久久99精品久久久久久hb无码 | 久久综合综合久久97色| 久久午夜无码鲁丝片午夜精品| 久久久久波多野结衣高潮| 94久久国产乱子伦精品免费| 五月丁香综合激情六月久久| 久久久91人妻无码精品蜜桃HD| 国内精品九九久久久精品| 日韩十八禁一区二区久久| 久久亚洲欧美日本精品| 久久精品人人做人人妻人人玩| 亚洲七七久久精品中文国产| 国内精品久久久久久久涩爱| 久久99国产精品99久久| 色综合久久中文字幕无码| 久久久无码精品亚洲日韩蜜臀浪潮| 91精品国产综合久久香蕉| 久久国产精品无码一区二区三区| 亚洲午夜久久久影院| 伊人热热久久原色播放www| 亚洲一区中文字幕久久| 久久高清一级毛片| 久久久久亚洲?V成人无码| 91麻精品国产91久久久久|