專利名稱:在用戶空間中進(jìn)行系統(tǒng)調(diào)用截取的方法和系統(tǒng)的制作方法
在用戶空間中進(jìn)行系統(tǒng)調(diào)用截取的方法和系統(tǒng) 技術(shù)領(lǐng)域一般來說,本發(fā)明涉及截取系統(tǒng)調(diào)用的方法,更確切地說,這種 方法允許從用戶空間截取系統(tǒng)調(diào)用。
背景技術(shù):
應(yīng)用程序級(jí)的若干虛擬化系統(tǒng)將應(yīng)用程序與底層物理硬件隔離,其目的是為了保護(hù)(容錯(cuò))、(利用在Linux上運(yùn)行的IBM的 MetaCluster, MetaCluster是IBM公司在某些國家中的商標(biāo))通過檢 查點(diǎn)和重新開始的流動(dòng)性(應(yīng)用程序再定位)、確定性重放或者僅僅 是資源隔離,如Linux (Linux是Linux Torvalds在美國、其他國家 或兼而有之的注冊商標(biāo))的Vserver (Vserver是Linux Torvalds在某 些國家中的商標(biāo))、Virtuozzo (Virtuozzo是Swsoft在某些國家中的 商標(biāo))的OpenVZ,它們都需要截取和改變現(xiàn)有系統(tǒng)調(diào)用的原始語義。 做到這一點(diǎn)的一種方法是在內(nèi)核中改變系統(tǒng)調(diào)用例程,以引進(jìn)語 義的系統(tǒng)調(diào)用截取和修改。在操作系統(tǒng)內(nèi)部執(zhí)行必需的改變難以實(shí)行, 危及整個(gè)系統(tǒng)的穩(wěn)定性和安全性,并且用戶和維護(hù)者通常不太愿意接 受,因?yàn)樗黾恿藘?nèi)核的復(fù)雜性并可能危及系統(tǒng)的完整性和支持它的 能力。存在著某些方法將代碼插入到程序中以分析其行為,例如通過收 集分析數(shù)據(jù)。這種修改程序使其分析自己的技術(shù)被稱為"探測方法"。 探測方法可以用于檢測系統(tǒng)調(diào)用,有可能以這種方式從用戶空間修改 它們。不過,現(xiàn)有探測方法雖然對(duì)于調(diào)試足以勝任,但是不能滿足高 性能要求,如容錯(cuò)系統(tǒng)的要求。檢測可執(zhí)行代碼的"ptrace"方法-如Linux strace工具使用的——需要外部控制器過程,當(dāng)信號(hào)通知它時(shí),它在每次系統(tǒng)調(diào)用發(fā)生 時(shí)都停止、內(nèi)觀,然后再重新開始。盡管這種方法是一般的方法,但 是形成的運(yùn)行開銷巨大。LD—PRELOAD方法——也是檢測可執(zhí)行代碼——執(zhí)行動(dòng)態(tài)鏈 接符號(hào)插入,以截取和替換以動(dòng)態(tài)符號(hào)形式存在的系統(tǒng)調(diào)用。這種方 法僅限于動(dòng)態(tài)可執(zhí)行文件,不適用于系統(tǒng)調(diào)用內(nèi)聯(lián)在庫中的情況(因 為存在著關(guān)聯(lián)符號(hào))?,F(xiàn)在內(nèi)聯(lián)系統(tǒng)調(diào)用在最近的Linux標(biāo)準(zhǔn)庫中越 來越常見,使得這種方法遭到反對(duì)。機(jī)器碼重寫法是另一種可執(zhí)行碼的探測方法可執(zhí)行機(jī)器碼被靜 態(tài)地或動(dòng)態(tài)地重寫,并且當(dāng)遇到系統(tǒng)調(diào)用時(shí),能夠插入某種附加代碼 以提供附加值。這種方法不支持自修改的可執(zhí)行碼,并且運(yùn)行開銷也 可能非常可觀。實(shí)例是數(shù)字設(shè)備^^司工作站上過去可用的ATOM產(chǎn) 品。ATOM在編譯時(shí)向要被分析的程序內(nèi)插入代碼。因此需要一種新方法,在程序執(zhí)行期間截取所有類型的系統(tǒng)調(diào) 用,并且從用戶空間修改它們的行為,同時(shí)避免(對(duì)容錯(cuò)系統(tǒng)無法接 受的)運(yùn)行開銷,因?yàn)閮?nèi)核碼以特權(quán)模式執(zhí)行,并且不能由程序修改。發(fā)明內(nèi)容本發(fā)明的目的是提供截取系統(tǒng)調(diào)用并從用戶空間修改它們行為 的探測方法,它適用于任何類型的可執(zhí)行碼,同時(shí)保持良好的性能水 平。根據(jù)權(quán)利要求1,達(dá)到這個(gè)目的是利用了在用戶空間中執(zhí)行過程 中截取系統(tǒng)調(diào)用并且在用戶空間中執(zhí)行與截取的系統(tǒng)調(diào)用有關(guān)的若干 操作的方法,所述方法在計(jì)算機(jī)上執(zhí)行,其中,操作系統(tǒng)內(nèi)核支持包 括系統(tǒng)跟蹤的ptrace系統(tǒng)調(diào)用,所述方法進(jìn)一步包括 一在執(zhí)行過程中啟動(dòng)信號(hào)處理程序,所述信號(hào)處理程序包含執(zhí)行與將 要截取的系統(tǒng)調(diào)用有關(guān)的操作的代碼;一在執(zhí)行過程中,在執(zhí)行將要截取的系統(tǒng)調(diào)用之前,進(jìn)行在內(nèi)核中設(shè)置系統(tǒng)跟蹤旗標(biāo)和自跟蹤旗標(biāo)的自ptrace請求;一在執(zhí)行系統(tǒng)調(diào)用之后,內(nèi)核驗(yàn)證已設(shè)置系統(tǒng)跟蹤旗標(biāo)和自跟蹤旗 標(biāo);—內(nèi)核保存系統(tǒng)調(diào)用信息并發(fā)送與信號(hào)處理程序?qū)?yīng)的、傳遞系統(tǒng)調(diào) 用信息的信號(hào);一執(zhí)行過程收到信號(hào)后,開始信號(hào)處理程序的執(zhí)行;一在信號(hào)處理程序執(zhí)行結(jié)束時(shí),在執(zhí)行過程中,在所截取系統(tǒng)調(diào)用后跟隨的下一條指令重新開始執(zhí)行,同時(shí)提供系統(tǒng)調(diào)用返回信息。根據(jù)權(quán)利要求2,達(dá)到這個(gè)目的也是利用了權(quán)利要求1的方法, 進(jìn)一步包括在內(nèi)核發(fā)送信號(hào)之前 一內(nèi)核使系統(tǒng)跟蹤旗標(biāo)和自跟蹤旗標(biāo)復(fù)位。根據(jù)權(quán)利要求3,達(dá)到這個(gè)目的也是利用了權(quán)利要求1或2的方 法,其中執(zhí)行自ptrace請求的步驟包括一在執(zhí)行過程的任務(wù)描述符中保存系統(tǒng)跟蹤旗標(biāo)和自跟蹤旗標(biāo)。根據(jù)權(quán)利要求4,達(dá)到這個(gè)目的也是利用了權(quán)利要求1或2的方 法,其中執(zhí)行自ptrace請求的步驟進(jìn)一步包括一在執(zhí)行過程的任務(wù)描述符中保存自跟蹤旗標(biāo),在執(zhí)行過程的線程描 述符中保存系統(tǒng)跟蹤旗標(biāo)。根據(jù)權(quán)利要求5,達(dá)到這個(gè)目的也是利用了權(quán)利要求1至4中任 何一條的方法,其中,內(nèi)核發(fā)送傳遞系統(tǒng)調(diào)用信息的信號(hào)的步驟進(jìn)一 步包括—內(nèi)核發(fā)送傳遞系統(tǒng)調(diào)用標(biāo)識(shí)符和參數(shù)的信號(hào)。根據(jù)權(quán)利要求6,達(dá)到這個(gè)目的也是利用了權(quán)利要求1至5中任 何一條的方法,其中,內(nèi)核發(fā)送與信號(hào)處理程序?qū)?yīng)的信號(hào)的步驟進(jìn) 一步包括—所述信號(hào)為操作系統(tǒng)已經(jīng)使用的一個(gè)信號(hào),并且在執(zhí)行先前步驟時(shí) 從其初始用途進(jìn)行了修改;一如果沒有執(zhí)行所述方法的先前步驟,所述信號(hào)不由內(nèi)核修改地使 用.根據(jù)權(quán)利要求7,達(dá)到這個(gè)目的也是利用了權(quán)利要求1至6中任 何一條的方法,其中,啟動(dòng)信號(hào)處理程序的步驟進(jìn)一步包括
一所述信號(hào)處理程序包含進(jìn)行預(yù)處理或系統(tǒng)調(diào)用仿真或后處理的代 碼。
根據(jù)權(quán)利要求8,達(dá)到這個(gè)目的也是利用了權(quán)利要求1至6中任 何一條的方法,其中,啟動(dòng)信號(hào)處理程序的步驟進(jìn)一步包括 一所述信號(hào)處理程序包含虛擬或調(diào)試所述執(zhí)行過程的代碼。
根據(jù)權(quán)利要求9,達(dá)到這個(gè)目的也是利用了一種系統(tǒng),包括適于 實(shí)行才艮據(jù)權(quán)利要求1至8中任何一條的裝置。
利用本發(fā)明,在執(zhí)行的程序進(jìn)行系統(tǒng)調(diào)用時(shí),內(nèi)核的系統(tǒng)調(diào)用通 知機(jī)構(gòu)產(chǎn)生信號(hào)。如果在執(zhí)行的程序中已經(jīng)執(zhí)行了本發(fā)明特定的新 PTRACE系統(tǒng)調(diào)用,這個(gè)信號(hào)就發(fā)送到執(zhí)行的程序本身,它可以提供 用戶空間信號(hào)處理程序以執(zhí)行新的代碼。
應(yīng)當(dāng)指出,即使本發(fā)明對(duì)Linux系統(tǒng)參考手冊中描述的現(xiàn)有 PTRACE系統(tǒng)調(diào)用實(shí)施了新的請求,但是除了 Linux以外,所有UNIX 系統(tǒng)都已經(jīng)提供了 'ptrace式,特點(diǎn)并具有現(xiàn)有的系統(tǒng)調(diào)用通知機(jī)構(gòu) (由strace或truss工具的存在所表明)。這暗示了在本發(fā)明之上開 發(fā)的服務(wù)的可移植性。 一旦在新的UNIX系統(tǒng)中實(shí)施了本發(fā)明,先前 UNIX系統(tǒng)上的用戶空間中已經(jīng)開發(fā)的服務(wù)馬上變?yōu)閷?duì)新系統(tǒng)可用。
具有調(diào)試器——它取得過程的控制并強(qiáng)制逐步的執(zhí)行——的所 有操作系統(tǒng)都以新的PTRACE請求實(shí)施例提供ptrace系統(tǒng)調(diào)用或類 似手段——可以按建議進(jìn)行修改。根據(jù)本發(fā)明的解決方案,如果 PTRACE系統(tǒng)調(diào)用不存在, 一個(gè)其他實(shí)施例應(yīng)當(dāng)在內(nèi)核中創(chuàng)建特定的 服務(wù),它將僅僅執(zhí)行系統(tǒng)調(diào)用通知的激活。
本發(fā)明的解決方案適用于任何種類的可執(zhí)行碼(靜態(tài)的或動(dòng)態(tài) 的),支持內(nèi)聯(lián)系統(tǒng)調(diào)用以及由自修改的代碼動(dòng)態(tài)產(chǎn)生的系統(tǒng)調(diào)用。
通知的運(yùn)行開銷極低。它對(duì)應(yīng)于信號(hào)中斷成本的一半。因?yàn)樵跈z 測中不包括附加任務(wù),所以在任務(wù)之間沒有附加的上下文切換,也沒 有附加的過程間通訊。這些特征確保了良好的性能水平.
本解決方案的其他優(yōu)點(diǎn)可以列舉如下 —為了支持系統(tǒng)調(diào)用的整個(gè)集合的截取和虛擬,除了唯一的簡單小補(bǔ)
丁以外,內(nèi)核中不需要進(jìn)一步的修改。
一這種機(jī)制也允許廣義的概念,將本發(fā)明的方法應(yīng)用于不存在的或不 支持的系統(tǒng)調(diào)用,只要它們能夠被截取和仿真。
一安全性在執(zhí)行過程的情況下,在這種截取機(jī)制之上實(shí)施的全部服務(wù)都駐留在用戶空間中,完全如同常規(guī)的動(dòng)態(tài)庫。它們不會(huì)危及操作系統(tǒng)或外部應(yīng)用程序。不存在使內(nèi)核崩潰的風(fēng)險(xiǎn)。
—開發(fā)速度虛擬、檢查點(diǎn)/重新開始、記錄/重放或其他服務(wù)現(xiàn)在都能夠在用戶空間中開發(fā),不必篡改系統(tǒng)內(nèi)部,也不必重新開機(jī)。靈活性多得多,并且可能在用戶級(jí)接入各式各樣的現(xiàn)有服務(wù)。
_保障保持了現(xiàn)有過程的保障模型。內(nèi)核或其他過程的內(nèi)部都不允許所述過程訪問。同樣,所述過程也不向其他實(shí)體>5^開任何信息。進(jìn)行保障評(píng)估極為簡單,因?yàn)閮?nèi)核修改僅僅包含在信號(hào)的自通知中。
圖1介紹了根據(jù)優(yōu)選實(shí)施例以SELF_PTRACE請求執(zhí)行PTRACE系統(tǒng)調(diào)用的結(jié)果;
圖2是根據(jù)優(yōu)選實(shí)施例的方法修改的系統(tǒng)調(diào)用入口的流程圖; 圖3是根據(jù)優(yōu)選實(shí)施例的方法在用戶空間中執(zhí)行信號(hào)處理程序的
流程圖4展示了根據(jù)本發(fā)明優(yōu)選實(shí)施例的用戶空間和操作系統(tǒng)中的多 種組件。
具體實(shí)施例方式
實(shí)施優(yōu)選實(shí)施例的方法需要使用操作系統(tǒng)內(nèi)核的系統(tǒng)調(diào)用跟蹤 例程,以ptrace實(shí)施系統(tǒng)調(diào)用的跟蹤。正如本文檔馬上要論述的,Linux 可以被視為這樣的操作系統(tǒng)的實(shí)例,不過今日的大多數(shù)操作系統(tǒng),包 括嵌入式操作系統(tǒng),都在其內(nèi)核中提供了 ptrace系統(tǒng)調(diào)用,以及以 ptrace跟蹤系統(tǒng)調(diào)用。在下文中,即使Linux語法用于展示優(yōu)選實(shí)施 例的解決方案,不過所介紹的ptrace系統(tǒng)調(diào)用和系統(tǒng)調(diào)用的處理在其
他操作系統(tǒng)中實(shí)施時(shí)也是類似的。
Linux和其他Unix以ptrace系統(tǒng)調(diào)用檢測用戶/系統(tǒng)邊界,它提 供了用戶空間控制器視界以及對(duì)另一個(gè)(受控)過程的控制。無論何 時(shí),只要受控過程要接收信號(hào)、進(jìn)入系統(tǒng)調(diào)用或從其退出時(shí),都通知 所述控制器過程。恰好在所述事件之前停止所述控制器過程,給予所 述控制器機(jī)會(huì)捕捉并轉(zhuǎn)發(fā)信號(hào),以檢查或修改受控過程的存儲(chǔ)器和寄 存器,最后令受控過程恢復(fù)所述事件的正常處理。這用于程序調(diào)試目 的或跟蹤系統(tǒng)調(diào)用。將要被跟蹤的過程中使用的現(xiàn)有ptrace語法如下 弁include <sys/ptrace.h>long int ptrace(enum ptrace request request, pidt pid, void * addr, void * data)
其中'request'定義了將要進(jìn)行的行為。例如,ptrace系統(tǒng)調(diào)用執(zhí)行 的請求PTRACE一TRACEME告訴內(nèi)核,進(jìn)行調(diào)用的過程希望被跟蹤。 其他請求使用的'pid,參數(shù)是將要被跟蹤的活動(dòng)過程的id; 'addr, 是控制器過程將讀取的、被跟蹤過程的用戶區(qū)域中的地址;'data, 是來自跟蹤的過程區(qū)域的數(shù)據(jù),它將取代被跟蹤過程在地址addr的信 息。使用PTRACE_SYSCALL請求時(shí)無需參數(shù),它使將要被跟蹤的 過程在下 一 次系統(tǒng)調(diào)用之后停止。
現(xiàn)有的PTRACE一SYSCALL請求使受控任務(wù)的內(nèi)核上下文中的 SYSCALL一TRACE旗標(biāo)置位,表明系統(tǒng)調(diào)用跟蹤受到請求。然后, 在被跟蹤的過程執(zhí)行下一次系統(tǒng)調(diào)用時(shí),內(nèi)核的系統(tǒng)調(diào)用例程檢測 SYSCALL_TRACE是否置位。如果該旗標(biāo)沒有置位,那么就執(zhí)行系 統(tǒng)調(diào)用。如果該旗標(biāo)已置位,就執(zhí)行系統(tǒng)調(diào)用例程停止該過程并向 控制器過程發(fā)送信號(hào),它將能夠從內(nèi)核訪問被跟蹤過程進(jìn)行的系統(tǒng)調(diào) 用有關(guān)的信息。
根據(jù)優(yōu)選實(shí)施例,通過修改現(xiàn)有的系統(tǒng)調(diào)用跟蹤例程,在Linux 內(nèi)核中實(shí)施新的ptrace請求SELF_PTRACE,在控制器過程已經(jīng)進(jìn)行 了 PTRACE SYSCALL請求時(shí),在內(nèi)核中執(zhí)行它??刂破鬟^程使用
現(xiàn)有的PTRACE_SYSCALL請求截取受控過程中的系統(tǒng)調(diào)用。它允 許例如從控制器過程查看系統(tǒng)調(diào)用參數(shù),并且可能改變它們。在優(yōu)選 實(shí)施例中,提議了系統(tǒng)調(diào)用跟蹤例程的修改,意在以信號(hào)自通知某過 程,以允許該過程從用戶空間將自身置于其自己的系統(tǒng)調(diào)用上。新的 ptrace請求SELF—PTRACE加入內(nèi)核中。它具有能力通過信號(hào)通知該 過程本身,無論何時(shí)只要它執(zhí)行系統(tǒng)調(diào)用。然后,系統(tǒng)調(diào)用的截取和 例如虛擬可以在用戶空間中的信號(hào)處理程序中執(zhí)行。為了從信號(hào)處理 程序透明地恢復(fù)以及將(真實(shí)的或仿真的)系統(tǒng)調(diào)用返回值傳送到進(jìn) 行調(diào)用的代碼,提供了特定的過程(本文檔后面圖3中的320)。總 之,通過在內(nèi)核中加入簡單補(bǔ)丁實(shí)施的方法,以及用戶空間中的信號(hào) 處理程序,允許從用戶空間置于系統(tǒng)調(diào)用上。這種請求的ptrace系統(tǒng)調(diào)用的語法如下;它不使用ptrace系統(tǒng) 調(diào)用的任何參數(shù) #include <sys/ptrace.h>long int ptrace(enum ptrace—request SELF_PTRACE)圖1介紹了根據(jù)優(yōu)選實(shí)施例以SELF—PTRACE請求執(zhí)行 PTRACE系統(tǒng)調(diào)用的結(jié)果。在需要從用戶空間中截取和修改系統(tǒng)調(diào)用 的用戶空間中執(zhí)行過程中,執(zhí)行PTRACE系統(tǒng)調(diào)用。在Linux環(huán)境 中介紹這幅流程圖。正如以 SYSCALL_TRACE請求, SYSCALL—TRACE旗標(biāo)(100)在該過程的上下文中置位,保存在內(nèi) 核中。所謂的PT—SELF旗標(biāo)(110)是新的旗標(biāo),也在該過程的上下 文中置位,以表明為該過程配備了自跟蹤機(jī)構(gòu)。由于Linux中性能的 緣故,優(yōu)選情況下在該過程對(duì)應(yīng)的當(dāng)前任務(wù)的內(nèi)核任務(wù)描述符(120) 的ptrace字段中設(shè)置PT一SELF旗標(biāo),在該任務(wù)描述符的線程信息結(jié) 構(gòu)(130)中設(shè)置SYSCALLJTRACE旗標(biāo)。圖2是根據(jù)優(yōu)選實(shí)施例的方法修改的系統(tǒng)調(diào)用入口的流程圖。對(duì) 于需要在用戶空間中截取和修改系統(tǒng)調(diào)用的過程,通過在所述過程中 執(zhí)行SELF_PTRACE請求ptrace系統(tǒng)調(diào)用而配備了自跟蹤機(jī)構(gòu)。根 據(jù)參考上圖介紹的優(yōu)選實(shí)施例,這意味著在執(zhí)行ptrace系統(tǒng)調(diào)用的
SELF—PTRACE請求時(shí),在內(nèi)核空間中保存的過程描述符中已經(jīng)設(shè)置 了 SYSCALLJTRACE和PT—SELF旗標(biāo)。在調(diào)用系統(tǒng)調(diào)用之前,該 過程正常執(zhí)行。在所有操作系統(tǒng)中,它照例調(diào)用軟件中斷(200)到內(nèi) 核,內(nèi)核在檢查系統(tǒng)調(diào)用的參數(shù)后將執(zhí)行系統(tǒng)調(diào)用。在執(zhí)行將要截取 的系統(tǒng)調(diào)用之前,內(nèi)核在任務(wù)描述符中查看SYSCALL_TRACE旗標(biāo) 是否置位(210)。如果答案為否(SYSCALLJTRACE旗標(biāo)等于O), 就執(zhí)行系統(tǒng)調(diào)用并將結(jié)果返回到該過程,它在用戶空間中恢復(fù)執(zhí)行(270 )。如果答案為是(SYSCALL—TRACE旗標(biāo)等于1),內(nèi)核就 執(zhí)行SYSCALL—TRACE例程(220 )。根據(jù)優(yōu)選實(shí)施例,已經(jīng)通過加 入PT—SELF旗標(biāo)的測試(230)而修改了 SYSCALL—TRACE例程。 如果PT_SELF旗標(biāo)沒有置位(它等于0 ),就執(zhí)行SYSCALL_TRACE 例程將信號(hào)發(fā)送到先前已經(jīng)執(zhí)行了等待系統(tǒng)調(diào)用的控制器過程(280)。這個(gè)信號(hào)傳遞了 SYSCALL—TRACE結(jié)果,以便控制器過程 對(duì)該結(jié)果執(zhí)行操作。內(nèi)核等待控制器過程完成(290)。當(dāng)控制器過程 請求重新開始執(zhí)行被跟蹤的過程時(shí),就為被跟蹤的過程執(zhí)行系統(tǒng)調(diào)用 并將結(jié)果送回被跟蹤的過程,它在用戶空間中恢復(fù)執(zhí)行(270)。根據(jù)本優(yōu)選實(shí)施例,如果PT一SELF旗標(biāo)已置位,這意味著在執(zhí) 行過程中已經(jīng)要求了自ptrace并且第一步驟包括為了執(zhí)行過程中下一 個(gè)到來的系統(tǒng)調(diào)用而解除自ptrace過程。這將避免遞歸。在執(zhí)行過程 的描述符中由此將SYSCALL_TRACE和PT_SELF旗標(biāo)復(fù)位至0(240)。然后,由內(nèi)核向該過程本身發(fā)送SIGSYS信號(hào)(250)。與 PTRACE正常過程相比,這是# 大的改變,它不警告執(zhí)行過程本身而 是執(zhí)行過程的控制器過程(280)。選擇SIGSYS信號(hào)是因?yàn)長inux中的SIGSYS信號(hào)按慣例用于傳 送SYSCALL ptrace系統(tǒng)調(diào)用不利結(jié)束的通知信息。在SIGSYS信號(hào) 的'不利系統(tǒng)調(diào)用,使用的情況下,該信號(hào)傳送的信息是已經(jīng)產(chǎn)生該 不利系統(tǒng)調(diào)用的地址。在本優(yōu)選實(shí)施例中,SIGSYS信號(hào)傳送將由信 號(hào)處理程序執(zhí)行的處理所截取系統(tǒng)調(diào)用的執(zhí)行期間所需的信息(系統(tǒng) 調(diào)用號(hào)和參數(shù)),正如本文檔后面關(guān)于圖3的介紹。然后,內(nèi)核向該
過程轉(zhuǎn)交控制(255)。應(yīng)當(dāng)指出,操作系統(tǒng)中可用的任何軟件中斷信號(hào)(例如在Linux 操作系統(tǒng)中有64種可能的信號(hào))都可以用于實(shí)施本發(fā)明。不過,使用 信號(hào)的方法卻必須容許該信號(hào)的常規(guī)用途。例如,在實(shí)施本發(fā)明所用 的信號(hào)是SIGSYS信號(hào)的情況下,無論何時(shí)執(zhí)行SYSCALL一TRACE 例程,該信號(hào)都向控制器過程傳送已經(jīng)產(chǎn)生該不利系統(tǒng)調(diào)用的地址。圖3是根據(jù)優(yōu)選實(shí)施例的信號(hào)處理程序的流程圖。在用戶空間中 執(zhí)行與被截取的系統(tǒng)調(diào)用有關(guān)的處理,作為該過程的信號(hào)處理程序。 在該過程的執(zhí)行期間執(zhí)行將要截取的系統(tǒng)調(diào)用前已經(jīng)啟動(dòng)了信號(hào)處理 程序。所以,當(dāng)執(zhí)行過程已經(jīng)收到了 SIGSYS信號(hào)并且內(nèi)核向該過程 轉(zhuǎn)交了控制時(shí),就執(zhí)行信號(hào)處理程序。在信號(hào)處理程序中執(zhí)行以下步 膿.—提取系統(tǒng)調(diào)用號(hào)和參數(shù)(300):它們存儲(chǔ)在所保存的寄存器中作 為信號(hào)上下文的一部分,根據(jù)本優(yōu)選實(shí)施例由內(nèi)核在發(fā)送該信號(hào)前自 動(dòng)設(shè)置。正如從現(xiàn)有的信號(hào)處理程序的處理已知,根據(jù)Linux中信號(hào) 處理程序的標(biāo)準(zhǔn)處理(可以參考Linux手冊sigaction頁面),信號(hào)上 下文地址通過堆棧傳遞到處理程序作為第三參數(shù)。正如在信號(hào)處理程 序的標(biāo)準(zhǔn)處理中,信號(hào)處理程序?qū)⑹褂眯盘?hào)上下文指令計(jì)數(shù)器在執(zhí)行 后返回執(zhí)行過程中所截取系統(tǒng)調(diào)用隨后的下一條指令。 一按要求使用識(shí)別該系統(tǒng)調(diào)用的系統(tǒng)調(diào)用號(hào)和系統(tǒng)調(diào)用參數(shù)進(jìn)行任 何預(yù)處理、系統(tǒng)調(diào)用仿真、后處理(310),例如通過虛擬或調(diào)試服務(wù)。 由于在發(fā)送信號(hào)前在內(nèi)核中已經(jīng)清除了 SYSCALL一TRACE旗標(biāo)和 PT一SELF旗標(biāo),應(yīng)用程序進(jìn)行的所有后續(xù)系統(tǒng)調(diào)用將不被截取。這避 免了遞歸問題。一使用收到的上下文數(shù)據(jù)(Linux中的sigcontext)恢復(fù)執(zhí)行過程的 上下文(320),具有兩種改變強(qiáng)制所希望的系統(tǒng)調(diào)用返回專用寄存 器(Intel處理器上的eax寄存器,Intel是Intel公司或其子公司在美 國和其他國家的商標(biāo)或注冊商標(biāo))中的數(shù)值,直接跳轉(zhuǎn)到調(diào)用代碼中 系統(tǒng)調(diào)用中斷隨后的的下一條指令(在Intel處理器上指令指針寄存器
值+2)。因此,在需要時(shí)通過在ptrace系統(tǒng)調(diào)用服務(wù)中加入新的ptrace 請求,以及(通過增加步驟230、 240、 250、 260)修改操作系統(tǒng)內(nèi)核 中的SYSTEM_TRACE ptrace請求,在該過程并且在用戶空間中的信 號(hào)處理程序中執(zhí)行以下操作 一截取一個(gè)執(zhí)行過程中的系統(tǒng)調(diào)用, —改變到這個(gè)系統(tǒng)調(diào)用,以及一增加如果操作,比如調(diào)試、記載或虛擬所述執(zhí)行過程所屬的應(yīng)用程 序。這種相同的方法可以應(yīng)用于從用戶空間控制任何系統(tǒng)調(diào)用的執(zhí)行。圖4展示了根據(jù)本發(fā)明優(yōu)選實(shí)施例的用戶空間和操作系統(tǒng)中的多 種組件。在用戶空間中執(zhí)行過程需要具有在用戶空間中截取和修改的 系統(tǒng)調(diào)用。承擔(dān)任務(wù)管理的、操作系統(tǒng)的內(nèi)核保存(420)執(zhí)行過程的 上下文,作為內(nèi)核空間中的任務(wù)描述符(421)。根據(jù)本優(yōu)選實(shí)施例, 該過程的代碼執(zhí)行信號(hào)處理程序的啟動(dòng)(400)。處理程序的代碼包含 與需要被截取的系統(tǒng)調(diào)用有關(guān)的、需要完成的全部處理這種處理可 以涉及調(diào)試或虛擬操作。執(zhí)行過程的代碼以SELF一PTRACE請求執(zhí)行 ptrace系統(tǒng)調(diào)用(410)。內(nèi)核中的系統(tǒng)調(diào)用例程(425)將系統(tǒng)調(diào)用 路由至ptrace服務(wù)例程(415),對(duì)這個(gè)請求在內(nèi)核中執(zhí)行它在任 務(wù)描述符中設(shè)置了 SYSCALL—TRACE和PT—SELF旗標(biāo)兩個(gè)旗標(biāo)。 當(dāng)執(zhí)行過程進(jìn)行系統(tǒng)調(diào)用(430 )時(shí),系統(tǒng)調(diào)用例程(425 )檢驗(yàn) SYSCALL—TRACE旗標(biāo)已置位并將該調(diào)用路由至新的 SYSCALL_TRACE例程(432 ),它將任務(wù)描述符的這兩個(gè)旗標(biāo)設(shè)置 為0 (435),并在一個(gè)實(shí)施例中以系統(tǒng)調(diào)用的信息發(fā)送SIGSYS信號(hào) (437)。內(nèi)核發(fā)布了這個(gè)信號(hào)后,重新開始用戶空間中執(zhí)行過程。由 于信號(hào)處理程序已經(jīng)啟動(dòng),信號(hào)處理程序就開始執(zhí)行用戶空間中的信 號(hào)處理程序(419)。信號(hào)處理程序執(zhí)行與系統(tǒng)調(diào)用有關(guān)的處理。在信 號(hào)處理程序執(zhí)行結(jié)束時(shí),執(zhí)行過程在系統(tǒng)調(diào)用隨后的下一條指令處重 新開始(450)。在圖4中,點(diǎn)線框表示現(xiàn)有組件,新的或修改的組件
以實(shí)線框表示。從圖4可以看出,通過在設(shè)置任務(wù)描述符中若干旗標(biāo) 的ptrace服務(wù)例程中創(chuàng)建新的SYSCALL_TRACE例程和新的請求, 在內(nèi)核中實(shí)施了本發(fā)明的方法。通過在執(zhí)行過程和信號(hào)處理程序中增 加信號(hào)處理程序和自ptrace系統(tǒng)調(diào)用的啟動(dòng),在用戶空間中實(shí)施了其 余部分。
權(quán)利要求
1.一種在用戶空間中執(zhí)行過程中截取系統(tǒng)調(diào)用并且在用戶空間中執(zhí)行與截取的系統(tǒng)調(diào)用有關(guān)處理的方法,所述方法在計(jì)算機(jī)上執(zhí)行,其中,操作系統(tǒng)內(nèi)核支持包括系統(tǒng)跟蹤的ptrace系統(tǒng)調(diào)用,所述方法進(jìn)一步包括-在執(zhí)行過程中啟動(dòng)信號(hào)處理程序,所述信號(hào)處理程序包含執(zhí)行與將要截取的系統(tǒng)調(diào)用有關(guān)的操作的代碼;-在執(zhí)行過程中,在執(zhí)行將要截取的系統(tǒng)調(diào)用之前,進(jìn)行在內(nèi)核中設(shè)置系統(tǒng)跟蹤旗標(biāo)和自跟蹤旗標(biāo)的自ptrace請求;-在執(zhí)行系統(tǒng)調(diào)用之后,內(nèi)核驗(yàn)證已設(shè)置系統(tǒng)跟蹤旗標(biāo)和自跟蹤旗標(biāo);-內(nèi)核保存系統(tǒng)調(diào)用信息并發(fā)送與信號(hào)處理程序?qū)?yīng)的、傳遞系統(tǒng)調(diào)用信息的信號(hào);-執(zhí)行過程收到信號(hào)后,開始信號(hào)處理程序的執(zhí)行;-在信號(hào)處理程序執(zhí)行結(jié)束時(shí),在執(zhí)行過程中,在所截取系統(tǒng)調(diào)用后跟隨的下一條指令重新開始執(zhí)行,同時(shí)提供系統(tǒng)調(diào)用返回信息。
2. 根據(jù)權(quán)利要求l的方法,進(jìn)一步包括在內(nèi)核發(fā)送信號(hào)之前 一內(nèi)核使系統(tǒng)跟蹤旗標(biāo)和自跟蹤旗標(biāo)復(fù)位。
3. 根據(jù)權(quán)利要求1或2的方法,其中執(zhí)行自ptrace請求的步驟包括—在執(zhí)行過程的任務(wù)描述符中保存系統(tǒng)跟蹤旗標(biāo)和自跟蹤旗標(biāo)。
4. 根據(jù)權(quán)利要求1或2的方法,其中執(zhí)行自ptrace請求的步驟 進(jìn)一步包括—在執(zhí)行過程的任務(wù)描述符中保存自跟蹤旗標(biāo),在執(zhí)行過程的線程描 述符中保存系統(tǒng)跟蹤旗標(biāo)。
5. 根據(jù)權(quán)利要求1至4中任何一條的方法,其中,內(nèi)核發(fā)送傳 遞系統(tǒng)調(diào)用信息的信號(hào)的步驟進(jìn)一步包括一內(nèi)核發(fā)送傳遞系統(tǒng)調(diào)用標(biāo)識(shí)符和參數(shù)的信號(hào).
6. 根據(jù)權(quán)利要求1至5中任何一條的方法,其中,內(nèi)核發(fā)送與信 號(hào)處理程序?qū)?yīng)的信號(hào)的步驟進(jìn)一步包括一所述信號(hào)為操作系統(tǒng)已經(jīng)使用的一個(gè)信號(hào),并且在執(zhí)行先前步驟時(shí) 從其初始用途進(jìn)行了修改;—如果沒有執(zhí)行所述方法的先前步驟,所述信號(hào)不由內(nèi)核修改地4吏 用。
7. 根據(jù)權(quán)利要求1至6中任何一條的方法,其中,啟動(dòng)信號(hào)處理程序的步驟進(jìn)一步包括一所述信號(hào)處理程序包含用于進(jìn)行預(yù)處理或系統(tǒng)調(diào)用仿真或后處理的代碼。
8. 根據(jù)權(quán)利要求1至6中任何一條的方法,其中,啟動(dòng)信號(hào)處理 程序的步驟進(jìn)一步包括一所述信號(hào)處理程序包含用于虛擬或調(diào)試所述執(zhí)行過程的代碼。
9. 一種系統(tǒng),包括用于實(shí)現(xiàn)根據(jù)權(quán)利要求1至8中任何一條的裝置。
全文摘要
一種從用戶空間的過程進(jìn)行的截取系統(tǒng)調(diào)用以及執(zhí)行與截取的系統(tǒng)調(diào)用有關(guān)的處理的方法和系統(tǒng)。所述方法包括第一步驟,用于在執(zhí)行過程中啟動(dòng)信號(hào)處理程序,在收到特定信號(hào)后執(zhí)行與執(zhí)行過程中系統(tǒng)調(diào)用的截取有關(guān)的處理。執(zhí)行過程以新的請求執(zhí)行ptrace系統(tǒng)調(diào)用——自ptrace,它在執(zhí)行過程的任務(wù)描述符中設(shè)置現(xiàn)有系統(tǒng)跟蹤ptrace請求對(duì)應(yīng)系統(tǒng)跟蹤旗標(biāo),并且設(shè)置新的旗標(biāo)——pt_self旗標(biāo)。在執(zhí)行過程中進(jìn)行系統(tǒng)調(diào)用時(shí),執(zhí)行新的系統(tǒng)調(diào)用跟蹤,測試pt_self旗標(biāo)是否置位。如果pt_self旗標(biāo)已經(jīng)置位,就將特定信號(hào)發(fā)送到執(zhí)行過程本身并且在用戶空間中執(zhí)行已經(jīng)啟動(dòng)的處理程序。
文檔編號(hào)G06F9/48GK101158914SQ200710137019
公開日2008年4月9日 申請日期2007年7月19日 優(yōu)先權(quán)日2006年10月6日
發(fā)明者馬克·沃特斯 申請人:國際商業(yè)機(jī)器公司