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

            久久99热这里只频精品6| 怡红院日本一道日本久久 | 亚洲人成无码久久电影网站| 久久精品国产69国产精品亚洲| 久久精品亚洲一区二区三区浴池| 国产91久久精品一区二区| 久久久久久A亚洲欧洲AV冫| 无码任你躁久久久久久久| 成人免费网站久久久| 国产精品熟女福利久久AV| 热久久视久久精品18| 精品久久一区二区三区| 欧美伊人久久大香线蕉综合69| 欧美丰满熟妇BBB久久久| 久久精品亚洲乱码伦伦中文| 性做久久久久久久久浪潮| 国产精品毛片久久久久久久| 日韩电影久久久被窝网| 久久se精品一区二区| 久久亚洲精品无码aⅴ大香| 一级做a爰片久久毛片16| 亚洲色婷婷综合久久| 久久国产视频网| 久久最近最新中文字幕大全| 99蜜桃臀久久久欧美精品网站| 婷婷久久综合九色综合98| 久久综合鬼色88久久精品综合自在自线噜噜| 囯产极品美女高潮无套久久久 | 成人综合久久精品色婷婷| 久久99精品国产| 久久亚洲精精品中文字幕| 中文国产成人精品久久亚洲精品AⅤ无码精品 | 精品久久久中文字幕人妻| 久久久久99精品成人片| 99精品国产99久久久久久97| 久久精品国产黑森林| 国产精品VIDEOSSEX久久发布| 99久久成人国产精品免费 | 久久天天躁狠狠躁夜夜avapp| 亚洲国产天堂久久综合| 午夜视频久久久久一区|