• <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 閱讀(334) 評論(0)  編輯 收藏 引用 所屬分類: 調試技巧

            亚洲AV无码成人网站久久精品大| 2021国内久久精品| 亚洲av日韩精品久久久久久a| 久久人人爽人人爽人人片AV不| 东京热TOKYO综合久久精品| 国内精品久久久久久久影视麻豆| 久久久精品久久久久久 | 久久久久无码精品国产不卡| 国产激情久久久久影院老熟女| 久久有码中文字幕| 99久久精品国产高清一区二区| 一本一道久久a久久精品综合 | 国产毛片欧美毛片久久久| 国产高潮久久免费观看| 亚洲AV日韩精品久久久久| 日本加勒比久久精品| 嫩草影院久久99| jizzjizz国产精品久久| 久久久这里只有精品加勒比| 中文字幕一区二区三区久久网站| 久久人爽人人爽人人片AV| 久久人人爽人人人人片av| 久久久久久噜噜精品免费直播| 久久免费精品一区二区| 久久精品人人槡人妻人人玩AV| 日本加勒比久久精品| 要久久爱在线免费观看| 国产L精品国产亚洲区久久| 精品久久久久久国产91| www久久久天天com| 97久久精品午夜一区二区| 国内精品久久久人妻中文字幕| 无码国内精品久久综合88| 中文字幕精品无码久久久久久3D日动漫 | 亚洲精品午夜国产VA久久成人| 国产精品久久久久久久人人看 | 日产精品99久久久久久| 亚洲成色www久久网站夜月| 亚洲人AV永久一区二区三区久久 | 久久亚洲精品国产精品| av午夜福利一片免费看久久|