專利名稱:一種調(diào)試操作系統(tǒng)內(nèi)核態(tài)程序的方法及裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種操作系統(tǒng)內(nèi)核態(tài)程序的調(diào)試方法及裝置,特別是涉及一種可以使用普通調(diào)試器對(duì)內(nèi)核態(tài)程序進(jìn)行調(diào)試的方法及裝置。
背景技術(shù):
操作系統(tǒng)為了安全的考慮為程序設(shè)計(jì)了兩種運(yùn)行態(tài)用戶態(tài)和內(nèi)核態(tài)。普通應(yīng)用程序運(yùn)行在用戶態(tài),部分特殊程序和操作系統(tǒng)本身運(yùn)行在內(nèi)核態(tài)。目前的調(diào)試器設(shè)計(jì)來調(diào)試用戶態(tài)的程序,對(duì)于內(nèi)核態(tài)的程序,只能使用打印或?qū)S眯酒{(diào)試接口來進(jìn)行調(diào)試,其缺點(diǎn)是1)使用打印方法其實(shí)是沒有調(diào)試功能,完全根據(jù)經(jīng)驗(yàn)仿制打印語句,而且每次必須重新編譯,造成調(diào)試效率低下。
2)使用專用芯片調(diào)試接口的使用方法與芯片相關(guān),各不相同,有較長的學(xué)習(xí)周期。
3)芯片調(diào)試接口只能進(jìn)行原始的語句調(diào)試,不能感知進(jìn)程狀態(tài),內(nèi)存使用等信息,使用很不方便。
以上的種種不便使內(nèi)核態(tài)程序的調(diào)試很不方便,也導(dǎo)致了開發(fā)的困難。因此一般做法是盡量減少內(nèi)核態(tài)程序的編寫,只將驅(qū)動(dòng)等簡單流程的程序放入內(nèi)核態(tài),而其它部分放在用戶態(tài)運(yùn)行,期望以簡單的內(nèi)核態(tài)程序來彌補(bǔ)調(diào)試的困難,但這不是根本的解決之道,而且對(duì)于性能要求較高的實(shí)時(shí)應(yīng)用來說,應(yīng)盡量將程序放入內(nèi)核態(tài),以減少不同運(yùn)行狀態(tài)之間切換的開銷,因此,迫切需要一種能方便在內(nèi)核態(tài)進(jìn)行程序調(diào)試的方法。
發(fā)明內(nèi)容
本發(fā)明所要解決的技術(shù)問題是提供一種調(diào)試操作系統(tǒng)內(nèi)核態(tài)程序的方法及裝置,解決普通調(diào)試器不能調(diào)試運(yùn)行在操作系統(tǒng)內(nèi)核態(tài)的程序的缺點(diǎn)。
為達(dá)到上述目的,本發(fā)明提供了一種調(diào)試操作系統(tǒng)內(nèi)核態(tài)程序的方法,其特點(diǎn)在于,通過設(shè)置運(yùn)行在內(nèi)核態(tài)的調(diào)試樁模塊和運(yùn)行在用戶態(tài)的前臺(tái)調(diào)試代理模塊,使所述前臺(tái)調(diào)試代理模塊與所述調(diào)試樁模塊進(jìn)行通信,所述調(diào)試樁模塊接收來自所述前臺(tái)調(diào)試代理模塊的調(diào)試信息、控制內(nèi)核線程的運(yùn)行并獲取內(nèi)核線程的異常信息;所述內(nèi)核線程將所述異常信息發(fā)送給所述調(diào)試樁模塊,所述調(diào)試樁模塊將所述異常信息發(fā)送給所述前臺(tái)調(diào)試代理模塊并由所述前臺(tái)調(diào)試代理模塊返回給調(diào)試器,從而使調(diào)試器進(jìn)行對(duì)內(nèi)核態(tài)程序的調(diào)試。
上述的方法,其特點(diǎn)在于,所述內(nèi)核線程的運(yùn)行控制包括斷點(diǎn)異常處理、單步異常處理、內(nèi)核信號(hào)的處理、讀/寫內(nèi)核的內(nèi)存以及讀/寫內(nèi)核的寄存器。
上述的方法,其特點(diǎn)在于,所述異常信息包括斷點(diǎn)異常信息和/或單步異常信息。
上述的方法,其特點(diǎn)在于,所述斷點(diǎn)異常處理包括遇到一個(gè)斷點(diǎn)之后,觸發(fā)一次異常,判斷該異常是普通的內(nèi)核異常還是真正斷點(diǎn)異常,如果是普通的內(nèi)核異常,則轉(zhuǎn)入普通的內(nèi)核異常處理程序;如果是斷點(diǎn)異常則執(zhí)行正常的斷點(diǎn)處理程序。
上述的方法,其特點(diǎn)在于,所述斷點(diǎn)異常處理進(jìn)一步包括如果被調(diào)試內(nèi)核線程停止在普通內(nèi)核空間,則所述異常不是真正斷點(diǎn)異常,仿真一次單步的執(zhí)行,使線程先從普通內(nèi)核空間返回到內(nèi)核應(yīng)用程序空間中;如果被調(diào)試內(nèi)核線程停止在內(nèi)核應(yīng)用程序空間,則所述異常是真正斷點(diǎn)異常;如果是內(nèi)核線程本身發(fā)生異常,則所述異常是真正斷點(diǎn)異常。
上述的方法,其特點(diǎn)在于,所述單步異常處理包括判斷異常是普通的內(nèi)核異常還是真正單步異常,如果是普通的內(nèi)核異常,則轉(zhuǎn)入普通的內(nèi)核異常處理程序;如果是真正單步異常則執(zhí)行正常的單步異常處理程序。
上述的方法,其特點(diǎn)在于,所述單步異常處理進(jìn)一步包括如果線程運(yùn)行在普通內(nèi)核空間,則該異常不是真正單步異常,退出該異常處理,返回線程所在的原程序;如果該線程是內(nèi)核線程,則該異常是真正單步異常,轉(zhuǎn)入正常的單步異常處理程序。
上述的方法,其特點(diǎn)在于,所述內(nèi)核信號(hào)處理包括打開被調(diào)試的內(nèi)核線程的斷點(diǎn)異常信號(hào)、單步異常信號(hào)和停止信號(hào)的信號(hào)屏蔽,使得內(nèi)核線程在接收所述三種信號(hào)的時(shí)候能夠處理該信號(hào);增加信號(hào)處理時(shí)機(jī),在調(diào)試的時(shí)候,使內(nèi)核線程從普通內(nèi)核空間跳轉(zhuǎn)到內(nèi)核線程空間的時(shí)候進(jìn)行一次信號(hào)處理。
上述的方法,其特點(diǎn)在于,所述讀/寫內(nèi)核的內(nèi)存空間包括內(nèi)核調(diào)試樁判斷該次讀/寫是否發(fā)生在調(diào)試狀態(tài),是則由內(nèi)核調(diào)試樁接管該次讀寫內(nèi)存的任務(wù)。
上述的方法,其特點(diǎn)在于,所述內(nèi)核調(diào)試樁讀內(nèi)核的內(nèi)存空間包括對(duì)訪問的地址進(jìn)行檢查看判斷所述地址是否在內(nèi)核空間的范圍之內(nèi),是則執(zhí)行下一步,否則進(jìn)行異常處理;如果讀取操作要拷貝的長度為L,則L=m×4+n×2+k×1,其中m表示該長度有多少個(gè)4字節(jié),n表示減去所有4字節(jié)之后還剩下多少個(gè)2字節(jié),k表示減去所有4字節(jié)和2字節(jié)后還剩下多少個(gè)1字節(jié),根據(jù)起始地址依次拷貝m個(gè)四字節(jié),n個(gè)2字節(jié),k個(gè)1字節(jié);如果出錯(cuò),則進(jìn)行異常處理。
上述的方法,其特點(diǎn)在于,所述讀/寫內(nèi)核的寄存器包括內(nèi)核調(diào)試樁判斷該次讀寫寄存器是發(fā)生在調(diào)試狀態(tài)后,執(zhí)行如下步驟給任務(wù)控制塊新增加一個(gè)成員變量,在進(jìn)入異?;蛘咧袛嗟臅r(shí)候?qū)?dāng)前異常發(fā)生時(shí)候的堆棧指針的值保存到該成員變量中;在讀取寄存器的時(shí)候以該成員變量的值作為基地址來讀取發(fā)生異常前的各個(gè)寄存器的值;在退出異?;蛘咧袛嗟臅r(shí)候,清空該成員變量;在讀寫堆棧指針寄存器的時(shí)候進(jìn)行特殊的處理,將當(dāng)前的成員變量值加上堆棧指針寄存器在寄存器結(jié)構(gòu)的位置作為當(dāng)前堆棧指針寄存器的值。
上述的方法,其特點(diǎn)在于,所述控制內(nèi)核線程的運(yùn)行并取得內(nèi)核線程的異常信息,是通過在系統(tǒng)的關(guān)鍵函數(shù)處加入調(diào)試樁模塊的代碼來實(shí)現(xiàn)。
上述的方法,其特點(diǎn)在于,進(jìn)一步包括如下步驟步驟一,通過系統(tǒng)調(diào)用的方式,所述前臺(tái)調(diào)試代理模塊發(fā)送調(diào)試信息給所述調(diào)試樁模塊,所述調(diào)試樁模塊接收所述調(diào)試信息;步驟二,所述調(diào)試樁模塊對(duì)所述調(diào)試信息進(jìn)行相應(yīng)處理;步驟三,進(jìn)行斷點(diǎn)異常處理;步驟四,進(jìn)行單步異常處理;步驟五,進(jìn)行內(nèi)核信號(hào)處理;步驟六,讀寫內(nèi)核內(nèi)存空間;步驟七,讀寫內(nèi)核的寄存器;步驟八,將所述異常信息、內(nèi)存內(nèi)容或寄存器內(nèi)容返回給前臺(tái)調(diào)試代理模塊。
為了更好的實(shí)現(xiàn)本發(fā)明的目的,本發(fā)明還提供了一種調(diào)試操作系統(tǒng)內(nèi)核態(tài)程序的裝置,其特點(diǎn)在于,包括調(diào)試器、前臺(tái)調(diào)試代理模塊、調(diào)試樁模塊、內(nèi)核應(yīng)用程序模塊和內(nèi)核線程模塊;所述調(diào)試器連接所述前臺(tái)調(diào)試代理模塊,所述前臺(tái)調(diào)試代理模塊連接所述調(diào)試樁模塊和所述內(nèi)核應(yīng)用程序模塊,所述內(nèi)核線程模塊連接所述調(diào)試樁模塊和所述內(nèi)核應(yīng)用程序模塊;所述調(diào)試樁模塊、內(nèi)核線程模塊和內(nèi)核應(yīng)用程序模塊運(yùn)行在內(nèi)核態(tài),運(yùn)行在用戶態(tài)的前臺(tái)調(diào)試代理模塊與所述調(diào)試樁模塊進(jìn)行通信,所述調(diào)試樁模塊接收來自所述前臺(tái)調(diào)試代理模塊的調(diào)試信息、控制內(nèi)核線程的運(yùn)行并取得內(nèi)核線程的異常信息;所述內(nèi)核線程模塊將所述異常信息發(fā)送給所述調(diào)試樁模塊,所述調(diào)試樁模塊將所述狀態(tài)信息返回給所述前臺(tái)調(diào)試代理模塊并由所述前臺(tái)調(diào)試代理模塊返回給調(diào)試器,從而使調(diào)試器進(jìn)行對(duì)內(nèi)核態(tài)程序的調(diào)試。
本發(fā)明的技術(shù)效果在于本發(fā)明所述方法設(shè)計(jì)了一運(yùn)行在內(nèi)核態(tài)的內(nèi)核調(diào)試樁,調(diào)試器通過內(nèi)核調(diào)試樁控制內(nèi)核線程并返回信息,從而解決了調(diào)試器不能調(diào)試內(nèi)核線程的重大難題,使得調(diào)試內(nèi)核線程跟調(diào)試用戶進(jìn)程或者用戶線程一樣方便。且該調(diào)試樁是以獨(dú)立的形式存在,與操作系統(tǒng)關(guān)聯(lián)較少,可以移植到各種通用操作系統(tǒng)之上。
下面結(jié)合附圖進(jìn)一步詳細(xì)說明本發(fā)明的具體實(shí)施例。
圖1是調(diào)試系統(tǒng)架構(gòu)示意圖;圖2調(diào)試樁組成結(jié)構(gòu)圖;圖3斷點(diǎn)異常處理流程圖;圖4單步異常處理流程圖。
具體實(shí)施例方式
本發(fā)明為了克服普通調(diào)試器不能調(diào)試運(yùn)行在操作系統(tǒng)內(nèi)核態(tài)程序的缺點(diǎn),提出了新的調(diào)試架構(gòu),如圖1所示,調(diào)試系統(tǒng)架構(gòu)具體包括設(shè)計(jì)一個(gè)內(nèi)核調(diào)試樁11,該調(diào)試樁11運(yùn)行在內(nèi)核態(tài)。前臺(tái)調(diào)試代理12同調(diào)試樁11進(jìn)行通信,該調(diào)試樁11控制內(nèi)核線程13的運(yùn)行。內(nèi)核線程13在遇到異常事件的時(shí)候?qū)惓P畔⒎答伣o調(diào)試樁11,調(diào)試樁11收到該異常信息后將該信息返回給前臺(tái)調(diào)試代理12,前臺(tái)調(diào)試代理12收到該消息返回給調(diào)試器14。從而可以用普通的用戶態(tài)調(diào)試器14調(diào)試核心態(tài)的程序,方便內(nèi)核態(tài)程序的開發(fā)。
本發(fā)明的方法具體包括以下幾個(gè)步驟步驟一前臺(tái)調(diào)試代理發(fā)送調(diào)試信息給內(nèi)核調(diào)試樁。內(nèi)核調(diào)試樁接收用戶態(tài)前臺(tái)調(diào)試代理發(fā)送過來的信息。信息發(fā)送是通過系統(tǒng)調(diào)用的方式來完成的。
步驟二內(nèi)核調(diào)試樁根據(jù)命令信息進(jìn)行相應(yīng)處理。處理前臺(tái)調(diào)試代理發(fā)送過來的信息。
步驟三斷點(diǎn)異常處理在遇到一個(gè)斷點(diǎn)之后會(huì)觸發(fā)一次斷點(diǎn)異常,由于這次異常處理發(fā)生在內(nèi)核態(tài),因此我們接管這次異常。判斷它是一次斷點(diǎn)異常還是一次普通的內(nèi)核異常。如果是普通的內(nèi)核異常,則轉(zhuǎn)入普通的內(nèi)核異常處理程序中去,否則轉(zhuǎn)入我們的斷點(diǎn)異常處理程序中來。具體步驟如下在異常處理中首先要判斷被調(diào)試內(nèi)核線程是否停止在普通內(nèi)核空間,如果是的話,要仿真一次單步的執(zhí)行,讓其先從普通內(nèi)核空間返回到內(nèi)核應(yīng)用程序空間中。也就是說只有發(fā)生在內(nèi)核應(yīng)用程序的斷點(diǎn)異常才是真正的斷點(diǎn)異常,否則跳到單步處理。
如果是內(nèi)核線程發(fā)生該異常的話,則認(rèn)為是一次斷點(diǎn)異常,而不是內(nèi)核異常。因此須轉(zhuǎn)到正常的斷點(diǎn)處理程序中。
步驟四單步異常處理同上述步驟三一樣,如果是普通的內(nèi)核異常,則轉(zhuǎn)入普通內(nèi)核異常處理程序中去,否則由內(nèi)核調(diào)試樁接管該異常,具體步驟如下在該異常處理中首先要判斷是否運(yùn)行在普通內(nèi)核空間,如果是的話,則退出該異常處理,連續(xù)運(yùn)行該程序。
否則的話,判斷該線程是不是內(nèi)核線程,如果是的話,轉(zhuǎn)入正常的單步異常處理程序。
步驟五內(nèi)核信號(hào)處理
在我們這個(gè)方法中,最終的調(diào)試手段的實(shí)現(xiàn)都是通過信號(hào)來完成的,因?yàn)樵跀帱c(diǎn)異?;蛘邌尾疆惓0l(fā)生后,都會(huì)發(fā)送一個(gè)斷點(diǎn)異?;蛘邌尾疆惓P盘?hào)給它自己,然后在退出異常處理的時(shí)候處理該信號(hào),喚醒父進(jìn)程。
我們首先需要打開被調(diào)試的內(nèi)核線程的斷點(diǎn)異常、單步異常信號(hào)、停止信號(hào)等3個(gè)信號(hào)屏蔽,使得內(nèi)核線程在接收到這些信號(hào)的時(shí)候能夠處理該信號(hào)。
增加了信號(hào)處理時(shí)機(jī),在調(diào)試的時(shí)候,內(nèi)核線程從普通內(nèi)核空間跳轉(zhuǎn)到內(nèi)核線程空間的時(shí)候會(huì)進(jìn)行一次信號(hào)處理。
步驟六讀寫內(nèi)核內(nèi)存空間。首先內(nèi)核調(diào)試樁判斷該次讀寫是否發(fā)生在調(diào)試狀態(tài),如果是的話,則內(nèi)核調(diào)試樁接管該次讀寫內(nèi)存的任務(wù),內(nèi)核調(diào)試樁讀取內(nèi)核內(nèi)存空間分以下步驟首先對(duì)訪問的地址進(jìn)行檢查看是否在內(nèi)核空間的范圍之內(nèi)。
如果拷貝長度為L的話,則L=m*4+n*2+k*1,m表示該長度有多少個(gè)4字節(jié),n表示減去那么多4字節(jié)之后還剩下多少個(gè)2字節(jié),k依次類推。
根據(jù)起始地址依次拷貝m個(gè)四字節(jié),n個(gè)2字節(jié),k個(gè)1字節(jié)。
如果出錯(cuò),則進(jìn)行異常處理。
步驟七讀寫內(nèi)核的寄存器。首先內(nèi)核調(diào)試樁判斷該次讀寫寄存器是否發(fā)生在調(diào)試狀態(tài),如果是的話,則內(nèi)核調(diào)試樁接管這次讀寫寄存器的任務(wù),內(nèi)核調(diào)試樁讀寫寄存器的步驟如下首先,給任務(wù)控制塊新增加一個(gè)成員變量,在進(jìn)入異?;蛘咧袛嗟臅r(shí)候?qū)?dāng)前異常發(fā)生時(shí)候的堆棧指針的值保存到該成員變量中。
在讀取寄存器的時(shí)候以該成員變量的值作為基地址來讀取發(fā)生異常前的各個(gè)寄存器的值。
在退出異?;蛘咧袛嗟臅r(shí)候,清空該成員變量。
在讀寫堆棧指針寄存器的時(shí)候進(jìn)行特殊的處理,將當(dāng)前的成員變量值加上堆棧指針寄存器在寄存器結(jié)構(gòu)的位置就是當(dāng)前堆棧指針寄存器的值。
步驟八將異常信息或者內(nèi)存內(nèi)容或者寄存器內(nèi)容返回給前臺(tái)調(diào)試代理。
下面結(jié)合附圖,以本發(fā)明在Linux操作系統(tǒng)上的應(yīng)用為列來做進(jìn)一步的詳細(xì)說明
Linux操作系統(tǒng)的內(nèi)核態(tài)程序以使用模塊加載的形式進(jìn)入內(nèi)核運(yùn)行,因此內(nèi)核態(tài)應(yīng)用程序以內(nèi)核模塊的形式存在。如圖1,圖2所示原理,內(nèi)核調(diào)試樁11內(nèi)還包括命令處理模塊111和異常處理模塊112,內(nèi)核調(diào)試樁11的功能是1)獲知內(nèi)核態(tài)程序運(yùn)行狀態(tài);2)提供對(duì)內(nèi)存和寄存器的訪問3)控制內(nèi)核態(tài)程序的運(yùn)行,以下分別敘述具體實(shí)現(xiàn)獲知內(nèi)核態(tài)程序運(yùn)行狀態(tài)Linux內(nèi)核調(diào)試樁進(jìn)入內(nèi)核后,首先在系統(tǒng)異常處理,系統(tǒng)關(guān)鍵函數(shù)(如進(jìn)程創(chuàng)建,刪除等)處加上自己的處理代碼,這段處理代碼就是異常處理代碼,具體的可以分為斷點(diǎn)異常處理代碼和單步異常處理代碼;其中的斷點(diǎn)異常處理流程圖如圖3所示,包括步驟301,發(fā)生斷點(diǎn)后,判斷是否處在普通內(nèi)核,是則執(zhí)行步驟305,否則執(zhí)行步驟302;步驟302,判斷線程是否為內(nèi)核線程且處在跟蹤狀態(tài),是則執(zhí)行步驟307,否則執(zhí)行步驟303;步驟303,判斷是否處在普通內(nèi)核空間,是則執(zhí)行步驟304,否則執(zhí)行步驟307;步驟304,轉(zhuǎn)入內(nèi)核異常處理,轉(zhuǎn)到步驟308;步驟305,置退出普通內(nèi)核標(biāo)識(shí);步驟306,模擬一次單步的運(yùn)行,轉(zhuǎn)到步驟308;步驟307,發(fā)送異常信號(hào)給被跟蹤的進(jìn)程;步驟308,返回原程序。
單步異常處理流程如圖4所示,包括步驟401,判斷線程是否運(yùn)行在普通內(nèi)核空間,是則執(zhí)行步驟405,否則執(zhí)行步驟402;步驟402,判斷該線程是否為用戶進(jìn)程,是則執(zhí)行步驟403,否則執(zhí)行步驟404;步驟403,對(duì)硬件斷點(diǎn)進(jìn)行處理;步驟404,發(fā)送單步信號(hào)給當(dāng)前內(nèi)核線程,轉(zhuǎn)到步驟406;步驟405,禁止單步執(zhí)行;步驟406,返回原程序。
在圖3的斷點(diǎn)異常或圖4的單步異常發(fā)生后,會(huì)進(jìn)入我們設(shè)置的處理代碼中,在處理代碼的末尾我們會(huì)發(fā)送一信號(hào)返回到調(diào)試樁,然后進(jìn)行以下處理if(當(dāng)前處理的程序是被調(diào)試的程序){紀(jì)錄當(dāng)前程序執(zhí)行狀態(tài)if(是異常處理)暫停程序運(yùn)行,并通知調(diào)試器}跳轉(zhuǎn)回原本處理函數(shù)通過以上操作,內(nèi)核樁模塊可以在被調(diào)試內(nèi)核態(tài)程序出現(xiàn)異常時(shí)通知調(diào)試器進(jìn)行調(diào)試,而在程序新創(chuàng)建和刪除時(shí),可以獲知其狀態(tài),供調(diào)試器查詢。
對(duì)內(nèi)存和寄存器的訪問分為兩個(gè),第一對(duì)內(nèi)存的訪問首先前臺(tái)調(diào)試代理發(fā)送讀寫內(nèi)存的請(qǐng)求給調(diào)試樁,調(diào)試樁收到該請(qǐng)求之后,該請(qǐng)求格式定義如下#define PTRACE_PEEKTEXT 1#define PTRACE_POKETEXT 4分別表示讀取指定內(nèi)存空間以及寫指定內(nèi)存的空間,該調(diào)試樁收到該請(qǐng)求之后首先判斷該地址是否在內(nèi)核空間之內(nèi),如果是,則認(rèn)為是訪問內(nèi)核應(yīng)用程序空間,啟動(dòng)調(diào)試樁的安全拷貝功能,安全拷貝流程如圖3所示。
第二個(gè)是對(duì)寄存器的訪問,調(diào)試樁收到讀寫寄存器的請(qǐng)求之后,取得發(fā)生異常時(shí)候保存的,該值是在內(nèi)核發(fā)生異常或者中斷的時(shí)候保存的,我們新開了一個(gè)空間,專門用來保存該堆棧指針的值,這個(gè)空間在任務(wù)控制塊的末尾開的,task_struct{…………….
void*kth;int *kth_esp_stack;}kth_esp_stack保存的是異常發(fā)生的時(shí)候保存現(xiàn)場之后的地址值,但根據(jù)用戶態(tài)現(xiàn)場堆棧保存規(guī)律,得出內(nèi)核線程運(yùn)行時(shí)候的堆棧指針值是(*kth_esp_stack)+0x34,這樣就根據(jù)該基地址加上各寄存器的偏移量得出各個(gè)寄存器的值。
控制內(nèi)核態(tài)程序的運(yùn)行,前臺(tái)調(diào)試代理通過發(fā)送以下調(diào)試命令給調(diào)試樁控制被調(diào)試程序的運(yùn)行,命令如下表所示#define PTRACE_CONT7連續(xù)運(yùn)行線程#define PTRACE_KILL8殺死線程#define PTRACE_SINGLESTEP 9單步線程#define PTRACE_ATTACH 0x10跟棕一個(gè)線程#define PTRACE_DETACH 0x11對(duì)一個(gè)線程解除跟蹤調(diào)試代理樁收到以上命令之后switch(命令){case繼續(xù)運(yùn)行線程命令調(diào)用調(diào)試樁繼續(xù)運(yùn)行命令接口case對(duì)指定線程跟蹤調(diào)用調(diào)試樁跟蹤指定線程接口…………………….
}這樣就實(shí)現(xiàn)了對(duì)指定內(nèi)核程序的控制功能。
由上可知,本發(fā)明方法設(shè)計(jì)了一運(yùn)行在內(nèi)核態(tài)的內(nèi)核調(diào)試樁,調(diào)試器通過內(nèi)核調(diào)試樁控制內(nèi)核線程并返回信息,從而解決了調(diào)試器不能調(diào)試內(nèi)核線程的重大難題,使得調(diào)試內(nèi)核線程跟調(diào)試用戶進(jìn)程或者用戶線程一樣方便。且該調(diào)試樁是以獨(dú)立的形式存在,與操作系統(tǒng)關(guān)聯(lián)較少,可以移植到各種通用操作系統(tǒng)之上。
以上所述僅為本發(fā)明的較佳實(shí)施例,并非用來限定本發(fā)明的實(shí)施范圍;凡是依本發(fā)明所作的等效變化與修改,都被本發(fā)明的專利范圍所涵蓋。
權(quán)利要求
1.一種調(diào)試操作系統(tǒng)內(nèi)核態(tài)程序的方法,其特征在于,通過設(shè)置運(yùn)行在內(nèi)核態(tài)的調(diào)試樁模塊和運(yùn)行在用戶態(tài)的前臺(tái)調(diào)試代理模塊,使所述前臺(tái)調(diào)試代理模塊與所述調(diào)試樁模塊進(jìn)行通信,所述調(diào)試樁模塊接收來自所述前臺(tái)調(diào)試代理模塊的調(diào)試信息、控制內(nèi)核線程的運(yùn)行并獲取內(nèi)核線程的異常信息;所述內(nèi)核線程將所述異常信息發(fā)送給所述調(diào)試樁模塊,所述調(diào)試樁模塊將所述異常信息發(fā)送給所述前臺(tái)調(diào)試代理模塊并由所述前臺(tái)調(diào)試代理模塊返回給調(diào)試器,從而使調(diào)試器進(jìn)行對(duì)內(nèi)核態(tài)程序的調(diào)試。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述內(nèi)核線程的運(yùn)行控制包括斷點(diǎn)異常處理、單步異常處理、內(nèi)核信號(hào)的處理、讀/寫內(nèi)核的內(nèi)存以及讀/寫內(nèi)核的寄存器。
3.根據(jù)權(quán)利要求2所述的方法,其特征在于,所述異常信息包括斷點(diǎn)異常信息和/或單步異常信息。
4.根據(jù)權(quán)利要求3所述的方法,其特征在于,所述斷點(diǎn)異常處理包括遇到一個(gè)斷點(diǎn)之后,觸發(fā)一次異常,判斷該異常是普通的內(nèi)核異常還是真正斷點(diǎn)異常,如果是普通的內(nèi)核異常,則轉(zhuǎn)入普通的內(nèi)核異常處理程序;如果是斷點(diǎn)異常則執(zhí)行正常的斷點(diǎn)處理程序。
5.根據(jù)權(quán)利要求4所述的方法,其特征在于,所述斷點(diǎn)異常處理進(jìn)一步包括如果被調(diào)試內(nèi)核線程停止在普通內(nèi)核空間,則所述異常不是真正斷點(diǎn)異常,仿真一次單步的執(zhí)行,使線程先從普通內(nèi)核空間返回到內(nèi)核應(yīng)用程序空間中;如果被調(diào)試內(nèi)核線程停止在內(nèi)核應(yīng)用程序空間,則所述異常是真正斷點(diǎn)異常;如果是內(nèi)核線程本身發(fā)生異常,則所述異常是真正斷點(diǎn)異常。
6.根據(jù)權(quán)利要求3所述的方法,其特征在于,所述單步異常處理包括判斷異常是普通的內(nèi)核異常還是真正單步異常,如果是普通的內(nèi)核異常,則轉(zhuǎn)入普通的內(nèi)核異常處理程序;如果是真正單步異常則執(zhí)行正常的單步異常處理程序。
7.根據(jù)權(quán)利要求6所述的方法,其特征在于,所述單步異常處理進(jìn)一步包括如果線程運(yùn)行在普通內(nèi)核空間,則該異常不是真正單步異常,退出該異常處理,返回線程所在的原程序;如果該線程是內(nèi)核線程,則該異常是真正單步異常,轉(zhuǎn)入正常的單步異常處理程序。
8.根據(jù)權(quán)利要求2、3、4、5、6或7所述的方法,其特征在于,所述內(nèi)核信號(hào)處理包括打開被調(diào)試的內(nèi)核線程的斷點(diǎn)異常信號(hào)、單步異常信號(hào)和停止信號(hào)的信號(hào)屏蔽,使得內(nèi)核線程在接收所述三種信號(hào)的時(shí)候能夠處理該信號(hào);增加信號(hào)處理時(shí)機(jī),在調(diào)試的時(shí)候,使內(nèi)核線程從普通內(nèi)核空間跳轉(zhuǎn)到內(nèi)核線程空間的時(shí)候進(jìn)行一次信號(hào)處理。
9.根據(jù)權(quán)利要求8所述的方法,其特征在于,所述讀/寫內(nèi)核的內(nèi)存空間包括內(nèi)核調(diào)試樁判斷該次讀/寫是否發(fā)生在調(diào)試狀態(tài),是則由內(nèi)核調(diào)試樁接管該次讀寫內(nèi)存的任務(wù)。
10.根據(jù)權(quán)利要求9所述的方法,其特征在于,所述內(nèi)核調(diào)試樁讀內(nèi)核的內(nèi)存空間包括對(duì)訪問的地址進(jìn)行檢查看判斷所述地址是否在內(nèi)核空間的范圍之內(nèi),是則執(zhí)行下一步,否則進(jìn)行異常處理;如果讀取操作要拷貝的長度為L,則L=m×4+n×2+k×1,其中m表示該長度有多少個(gè)4字節(jié),n表示減去所有4字節(jié)之后還剩下多少個(gè)2字節(jié),k表示減去所有4字節(jié)和2字節(jié)后還剩下多少個(gè)1字節(jié),根據(jù)起始地址依次拷貝m個(gè)四字節(jié),n個(gè)2字節(jié),k個(gè)1字節(jié);如果出錯(cuò),則進(jìn)行異常處理。
11.根據(jù)權(quán)利要求8所述的方法,其特征在于,所述讀/寫內(nèi)核的寄存器包括內(nèi)核調(diào)試樁判斷該次讀寫寄存器是發(fā)生在調(diào)試狀態(tài)后,執(zhí)行如下步驟給任務(wù)控制塊新增加一個(gè)成員變量,在進(jìn)入異?;蛘咧袛嗟臅r(shí)候?qū)?dāng)前異常發(fā)生時(shí)候的堆棧指針的值保存到該成員變量中;在讀取寄存器的時(shí)候以該成員變量的值作為基地址來讀取發(fā)生異常前的各個(gè)寄存器的值;在退出異常或者中斷的時(shí)候,清空該成員變量;在讀寫堆棧指針寄存器的時(shí)候進(jìn)行特殊的處理,將當(dāng)前的成員變量值加上堆棧指針寄存器在寄存器結(jié)構(gòu)的位置作為當(dāng)前堆棧指針寄存器的值。
12.根據(jù)權(quán)利要求8所述的方法,其特征在于,所述控制內(nèi)核線程的運(yùn)行并取得內(nèi)核線程的異常信息,是通過在系統(tǒng)的關(guān)鍵函數(shù)處加入調(diào)試樁模塊的代碼來實(shí)現(xiàn)。
13.根據(jù)權(quán)利要求1所述的方法,其特征在于,進(jìn)一步包括如下步驟步驟一,通過系統(tǒng)調(diào)用的方式,所述前臺(tái)調(diào)試代理模塊發(fā)送調(diào)試信息給所述調(diào)試樁模塊,所述調(diào)試樁模塊接收所述調(diào)試信息;步驟二,所述調(diào)試樁模塊對(duì)所述調(diào)試信息進(jìn)行相應(yīng)處理;步驟三,進(jìn)行斷點(diǎn)異常處理;步驟四,進(jìn)行單步異常處理;步驟五,進(jìn)行內(nèi)核信號(hào)處理;步驟六,讀寫內(nèi)核內(nèi)存空間;步驟七,讀寫內(nèi)核的寄存器;步驟八,將所述異常信息、內(nèi)存內(nèi)容或寄存器內(nèi)容返回給前臺(tái)調(diào)試代理模塊。
14.一種調(diào)試操作系統(tǒng)內(nèi)核態(tài)程序的裝置,其特征在于,包括調(diào)試器、前臺(tái)調(diào)試代理模塊、調(diào)試樁模塊、內(nèi)核應(yīng)用程序模塊和內(nèi)核線程模塊;所述調(diào)試器連接所述前臺(tái)調(diào)試代理模塊,所述前臺(tái)調(diào)試代理模塊連接所述調(diào)試樁模塊和所述內(nèi)核應(yīng)用程序模塊,所述內(nèi)核線程模塊連接所述調(diào)試樁模塊和所述內(nèi)核應(yīng)用程序模塊;所述調(diào)試樁模塊、內(nèi)核線程模塊和內(nèi)核應(yīng)用程序模塊運(yùn)行在內(nèi)核態(tài),運(yùn)行在用戶態(tài)的前臺(tái)調(diào)試代理模塊與所述調(diào)試樁模塊進(jìn)行通信,所述調(diào)試樁模塊接收來自所述前臺(tái)調(diào)試代理模塊的調(diào)試信息、控制內(nèi)核線程的運(yùn)行并取得內(nèi)核線程的異常信息;所述內(nèi)核線程模塊將所述異常信息發(fā)送給所述調(diào)試樁模塊,所述調(diào)試樁模塊將所述狀態(tài)信息返回給所述前臺(tái)調(diào)試代理模塊并由所述前臺(tái)調(diào)試代理模塊返回給調(diào)試器,從而使調(diào)試器進(jìn)行對(duì)內(nèi)核態(tài)程序的調(diào)試。
全文摘要
本發(fā)明公開了一種調(diào)試操作系統(tǒng)內(nèi)核態(tài)程序的方法及裝置,方法包括通過設(shè)置運(yùn)行在內(nèi)核態(tài)的調(diào)試樁模塊和運(yùn)行在用戶態(tài)的前臺(tái)調(diào)試代理模塊,使所述前臺(tái)調(diào)試代理模塊與所述調(diào)試樁模塊進(jìn)行通信,所述調(diào)試樁模塊接收來自所述前臺(tái)調(diào)試代理模塊的調(diào)試信息、控制內(nèi)核線程的運(yùn)行并獲取內(nèi)核線程的異常信息;所述內(nèi)核線程將所述異常信息發(fā)送給所述調(diào)試樁模塊,所述調(diào)試樁模塊將所述異常信息發(fā)送給所述前臺(tái)調(diào)試代理模塊并由所述前臺(tái)調(diào)試代理模塊返回給調(diào)試器,從而使調(diào)試器進(jìn)行對(duì)內(nèi)核態(tài)程序的調(diào)試。本發(fā)明解決了普通調(diào)試器不能調(diào)試運(yùn)行在操作系統(tǒng)內(nèi)核態(tài)的程序的缺點(diǎn)。
文檔編號(hào)G06F11/36GK1779652SQ20041000985
公開日2006年5月31日 申請(qǐng)日期2004年11月24日 優(yōu)先權(quán)日2004年11月24日
發(fā)明者劉飛, 程圣宇, 李翌, 繆敬 申請(qǐng)人:中興通訊股份有限公司