• <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

            常用鏈接

            統(tǒng)計(jì)

            資料

            最新評(píng)論

            自定義linux內(nèi)核調(diào)試print

            調(diào)試信息過(guò)多造成dmesg無(wú)法完全顯示怎么辦?

             

            #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;
            }

            我所說(shuō)的版本問(wèn)題已經(jīng)解決了.
            可以用ioctl來(lái)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) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): 調(diào)試技巧

            国产精品美女久久久| 国产A级毛片久久久精品毛片| 亚洲人成电影网站久久| 少妇熟女久久综合网色欲| 国产精品女同久久久久电影院| 99热都是精品久久久久久| 久久免费视频6| 97r久久精品国产99国产精| 久久伊人色| 日本三级久久网| 97久久国产综合精品女不卡| 99热精品久久只有精品| 伊人久久综合无码成人网 | 国产综合久久久久久鬼色| 99久久国产亚洲高清观看2024 | 日本免费一区二区久久人人澡| 久久综合视频网| 久久电影网| 久久精品国产精品国产精品污| 97视频久久久| 亚洲欧美日韩久久精品| 久久99国产一区二区三区| 久久久精品人妻一区二区三区蜜桃| 欧洲性大片xxxxx久久久| 人人狠狠综合久久亚洲婷婷| 日韩人妻无码一区二区三区久久 | 日本久久久久亚洲中字幕| 亚洲乱码日产精品a级毛片久久| 青青热久久综合网伊人| 久久丫精品国产亚洲av不卡| 久久久久久久波多野结衣高潮| 亚洲国产精品一区二区三区久久 | 亚洲精品国产字幕久久不卡| 国产69精品久久久久观看软件| 国内精品久久久久久中文字幕| 久久成人国产精品二三区| 久久精品人人槡人妻人人玩AV| AAA级久久久精品无码片| 久久99精品国产麻豆| 精品久久久久久国产潘金莲 | www性久久久com|