• <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中文字幕| 久久国产精品国产自线拍免费 | 亚洲AⅤ优女AV综合久久久| 久久电影网| 亚洲成色WWW久久网站| 久久国产精品成人片免费| yellow中文字幕久久网| 伊人久久国产免费观看视频| 久久午夜无码鲁丝片| 99久久人人爽亚洲精品美女| 久久精品中文字幕大胸| www久久久天天com| 亚洲伊人久久成综合人影院| 婷婷久久久亚洲欧洲日产国码AV | 99精品久久精品| 性做久久久久久久久久久| 精品无码久久久久国产| 一本综合久久国产二区| 91久久精品无码一区二区毛片| 亚洲七七久久精品中文国产| 狠狠久久亚洲欧美专区| 亚洲国产精品无码久久SM| 久久精品无码av| 国产ww久久久久久久久久| av午夜福利一片免费看久久| 狠狠色婷婷久久综合频道日韩| 久久久久成人精品无码| 91麻精品国产91久久久久| 国产精品九九九久久九九| 日韩人妻无码精品久久久不卡| 人人狠狠综合久久亚洲| 人妻无码精品久久亚瑟影视| A级毛片无码久久精品免费| 久久免费高清视频| 久久国产精品-久久精品| 久久久青草久久久青草| 久久久精品一区二区三区| 亚洲综合精品香蕉久久网97| 91精品国产综合久久四虎久久无码一级 | 久久天天躁狠狠躁夜夜网站 | 国产精品久久永久免费|