專利名稱:一種獲得傳統(tǒng)操作系統(tǒng)動態(tài)更新時間點的方法
技術(shù)領(lǐng)域:
本發(fā)明主要涉及到計算機操作系統(tǒng)軟件領(lǐng)域,特指一種獲得傳統(tǒng)操作系統(tǒng)動態(tài)更 新時間點的方法。
背景技術(shù):
操作系統(tǒng)動態(tài)更新是指在操作系統(tǒng)運行過程中動態(tài)修復操作系統(tǒng)內(nèi)部缺陷,而無 需重啟計算機即可實現(xiàn)修復生效。操作系統(tǒng)的動態(tài)更新技術(shù)可以有效提高系統(tǒng)的可用性。絕大多數(shù)缺陷修復都涉及到將當前內(nèi)核的一部分功能實現(xiàn)體(以下稱舊實現(xiàn) 體),替換成新的實現(xiàn)體(以下稱新實現(xiàn)體)。功能替換一般通過為內(nèi)核增加新實現(xiàn)體,并 將對于舊實現(xiàn)體的調(diào)用重定向到新實現(xiàn)體上來完成。在有任務(wù)正在執(zhí)行舊實現(xiàn)體對應的代碼時,將對于舊實現(xiàn)體的調(diào)用重定向到新實 現(xiàn)體上可能會造成有的任務(wù)執(zhí)行舊實現(xiàn)體,而與此同時有的任務(wù)在執(zhí)行新實現(xiàn)體的情形。 由于新舊實現(xiàn)體可能采取不同的方式對系統(tǒng)狀態(tài)進行修改,兩種實現(xiàn)體同時運行很可能會 造成系統(tǒng)狀態(tài)被破壞。有的操作系統(tǒng)動態(tài)更新機制支持在有任務(wù)正在使用舊實現(xiàn)體的代碼時就進行動 態(tài)更新。為了避免出現(xiàn)上述系統(tǒng)狀態(tài)因兩個新舊實現(xiàn)體同時運行而被破壞的問題,這類方 法會動態(tài)為新舊實現(xiàn)體創(chuàng)建各自的系統(tǒng)狀態(tài),并通過內(nèi)存的寫保護機制維護這兩份系統(tǒng)狀 態(tài)的一致性。這種方式的缺陷為1)需要同步的系統(tǒng)狀態(tài)因具體的動態(tài)更新補丁而異,因 而需要具體的補丁手工編寫相應的狀態(tài)同步算法;2)由于采用了寫保護機制,這種方式的 運行時開銷相當大。有的操作系統(tǒng)動態(tài)更新機制支持進行新舊實現(xiàn)體執(zhí)行現(xiàn)場的轉(zhuǎn)換,在進行動態(tài)更 新時,若發(fā)現(xiàn)某任務(wù)正在執(zhí)行舊實現(xiàn)體代碼,系統(tǒng)可以動態(tài)將其轉(zhuǎn)換為正在執(zhí)行新實現(xiàn)體 代碼。由于動態(tài)更新可能在任意時刻發(fā)生,需要設(shè)計一個支持將任意執(zhí)行現(xiàn)場狀態(tài)轉(zhuǎn)換為 動態(tài)更新后對應現(xiàn)場狀態(tài)的轉(zhuǎn)換機制。這種轉(zhuǎn)換機制的設(shè)計難度相當大。大多數(shù)的操作系統(tǒng)動態(tài)更新機制要求只有在內(nèi)核處于新舊實現(xiàn)體替換不會影響 系統(tǒng)正常運行的時間窗口內(nèi)(下文稱作動態(tài)更新安全點)時才能實施動態(tài)更新。此類機制 一般將舊實現(xiàn)體代碼處于靜默狀態(tài)視作內(nèi)核處于動態(tài)更新安全點。代碼處于靜默狀態(tài)的判 斷標準為當前沒有任何任務(wù)執(zhí)行舊實現(xiàn)體代碼。具體判斷方法為掃描所有任務(wù)的內(nèi)核棧, 查看其棧上是否包含舊實現(xiàn)體對應的虛地址段。若舊實現(xiàn)體對應的虛地址不在任何任務(wù)的 內(nèi)核棧中出現(xiàn),就認為當前舊實現(xiàn)體處于靜默狀態(tài)。當動態(tài)更新包含對多個功能實現(xiàn)體的替換時,上述更新時間點安全性檢查的判斷 方法可能會因為忽略了功能體執(zhí)行的上下文而出現(xiàn)問題。比如假設(shè)某個動態(tài)更新要求同時 更新fimc_A和fimc_B兩個功能,且某個任務(wù)會先后執(zhí)行這兩個功能,但在動態(tài)更新發(fā)生 時,該任務(wù)處于“已執(zhí)行完成func_A,但未開始執(zhí)行fimc_B”的狀態(tài)。傳統(tǒng)的安全點檢查方 法認為可以進行動態(tài)更新,但這會造成更新的非原子性該任務(wù)執(zhí)行了舊實現(xiàn)體的func_ Α,卻執(zhí)行了新實現(xiàn)體的func_B。若新版本fimc_B是上下文相關(guān)的,系統(tǒng)就會因為執(zhí)行了舊版本的func_A之后執(zhí)行新版本的func_B而出現(xiàn)錯誤。由于存在上述多個功能實現(xiàn)體之間的上下文相關(guān)性,當動態(tài)更新涉及到不止一個 功能實現(xiàn)體時,“舊實現(xiàn)體處于靜默狀態(tài)”并不一定意味著“系統(tǒng)處于動態(tài)更新安全點”。一 種簡單的解決方法是要求更多的代碼處于靜默狀態(tài)。具體的說,是要求整個內(nèi)核代碼都處 于靜默狀態(tài)。此時,不可能出現(xiàn)一次系統(tǒng)調(diào)用中既使用舊實現(xiàn)體,又使用新實現(xiàn)體,從而保 證了更新的原子性。K42就采用了這樣的方法。在K42系統(tǒng)的動態(tài)更新實現(xiàn)中,當準備進行動態(tài)更新時,用戶任務(wù)從用戶態(tài)轉(zhuǎn)到 內(nèi)核態(tài)執(zhí)行的請求會被阻塞,等已在內(nèi)核態(tài)執(zhí)行的任務(wù)退出內(nèi)核態(tài)后,就進行動態(tài)更新。對 于傳統(tǒng)操作系統(tǒng)而言,由于用戶任務(wù)之間可能具有依賴關(guān)系(如某個已在內(nèi)核的用戶任務(wù) 可能等待另外一個用戶任務(wù)喚醒),這種不加區(qū)分阻塞用戶任務(wù)的方法會導致有些情況下 永遠不能進行動態(tài)更新。另外,這種方法沒有考慮某些內(nèi)核任務(wù)永遠不會從內(nèi)核態(tài)退出的 情形。為了防止在內(nèi)核中睡眠的任務(wù)阻礙整個內(nèi)核進入靜默狀態(tài),在有的操作系統(tǒng)動態(tài) 更新機制中,在實施動態(tài)更新時,所有正在使用內(nèi)核的任務(wù)將被殺死。由于無法區(qū)分任務(wù)對 于用戶的重要程度,此方法可能會導致對用戶至關(guān)重要任務(wù)被殺死,從而影響系統(tǒng)持續(xù)為 用戶提供服務(wù)的能力。在基于動態(tài)更新安全點的動態(tài)更新技術(shù)中,傳統(tǒng)方法的缺點是1)反復檢查當前 是否處于靜默狀態(tài)的方法可能延遲較大,且最終不一定能獲得更新時機;2)當動態(tài)更新包 含對多個功能實現(xiàn)體的替換時,通過掃描所有任務(wù)的內(nèi)核棧,查看其棧上是否包含舊實現(xiàn) 體對應的虛地址段的方法獲得的更新時機可能會造成更新后狀態(tài)的不一致;幻通過殺死 任務(wù)來獲得更新時機的方法會影響用戶應用運行。
發(fā)明內(nèi)容
本發(fā)明要解決的問題在于為傳統(tǒng)操作系統(tǒng)提供一種通用的動態(tài)更新安全點的獲 取方法。為此本發(fā)明提出一種基于任務(wù)阻塞和喚醒機制的操作系統(tǒng)動態(tài)更新安全點獲取 方法。該方法要求外部環(huán)境必須支持以下能力1)操作系統(tǒng)實時維護當前系統(tǒng)中存在 的用戶態(tài)任務(wù)總數(shù)和內(nèi)核態(tài)任務(wù)總數(shù);2)操作系統(tǒng)應對外暴露某用戶態(tài)任務(wù)是否會因內(nèi) 核設(shè)計原因在未來解除操作系統(tǒng)對另外某些用戶態(tài)任務(wù)的阻塞。當內(nèi)核態(tài)任務(wù)可能會在非動態(tài)更新安全點被阻塞時,該方法要求外部環(huán)境必須具 有以下能力操作系統(tǒng)對外暴露各個內(nèi)核態(tài)任務(wù)是否處于安全更新點的狀態(tài)。在本發(fā)明中, 若某任務(wù)的當前狀態(tài)可以不經(jīng)專門的狀態(tài)轉(zhuǎn)換即可運行于動態(tài)更新后的系統(tǒng),則認為該任 務(wù)處于安全更新點狀態(tài)。當內(nèi)核態(tài)任務(wù)可能會在非動態(tài)更新安全點被阻塞時,若操作系統(tǒng)具有如下能力, 該方法可以更快的找到可對操作系統(tǒng)實施動態(tài)更新的安全點1)操作系統(tǒng)對外暴露內(nèi)核 態(tài)任務(wù)之間的同步通信關(guān)系;幻操作系統(tǒng)可對外暴露所有支持“中間狀態(tài)恢復”的內(nèi)核態(tài) 任務(wù)一個內(nèi)核任務(wù)支持中間狀態(tài)恢復,當且僅當該任務(wù)可在睡眠中被殺死,并支持重啟后 繼續(xù)進行被殺死時正在提供的服務(wù)。
當動態(tài)更新工具支持如下能力時,該方法可以更快的發(fā)現(xiàn)可對操作系統(tǒng)實施動態(tài) 更新的安全點1)動態(tài)更新工具支持對某些被阻塞任務(wù)的執(zhí)行現(xiàn)場進行轉(zhuǎn)換,使得這些任 務(wù)可以在動態(tài)更新完成后繼續(xù)正常運行。在本發(fā)明中,內(nèi)核與操作系統(tǒng)含義相同。在決定進行動態(tài)更新后,該方法開始工作,其過程如下1)設(shè)定當前要進行動態(tài)更新;2)向所有用戶任務(wù)注入用于防止其在內(nèi)核中無限 期睡眠的異步事件。內(nèi)核對該異步事件的處理方法應與用戶任務(wù)所能接收到的普通異步事 件相似,但效果為導致用戶任務(wù)重新請求當前被中斷的內(nèi)核服務(wù);3)當發(fā)現(xiàn)用戶任務(wù)task 請求系統(tǒng)服務(wù)時,若內(nèi)核未被設(shè)計為task未來一定會解除內(nèi)核對其它某任務(wù)的阻塞,則在 為其服務(wù)前將其阻塞,且該阻塞方法不可被異步事件喚醒;4)殺死所有(本發(fā)明自身所需 的任務(wù)除外)當前未處于安全更新點、支持中間狀態(tài)恢復的內(nèi)核任務(wù);5)當運行優(yōu)先權(quán)最 低的任務(wù)發(fā)現(xiàn)所有的用戶任務(wù)(本發(fā)明自身所需任務(wù)除外)都因步驟3)規(guī)定的動作所阻 塞、且所有的內(nèi)核任務(wù)(本發(fā)明自身所需任務(wù)除外)都處于安全更新點時,實施動態(tài)更新; 6)動態(tài)更新完成后,設(shè)定當前不處于動態(tài)更新狀態(tài);7)重啟被殺死的內(nèi)核任務(wù),喚醒因步 驟3)被阻塞的所有任務(wù)。由于動態(tài)更新時必須保證所有的CPU都處于動態(tài)更新安全點,而多處理器核心有 時使得系統(tǒng)很難找到一個全局更新安全點。如即使運行在CPUO上的最低優(yōu)先權(quán)任務(wù)發(fā) 現(xiàn)CPUl也正在運行同樣的最低優(yōu)先權(quán)任務(wù),它也不能斷定當前可安全實施動態(tài)更新因為 CPUl當前可能正在運行中斷處理例程。為了解決此問題,本發(fā)明采取了基于在線控制CPU 是否參與運行的方法來加速更新點的發(fā)現(xiàn)過程,其特征在于利用操作系統(tǒng)的CPU在線控制 機制,在準備進行動態(tài)更新前,將多處理器或多核系統(tǒng)降級為單處理器核心系統(tǒng),然后實施 動態(tài)更新,最后將系統(tǒng)恢復為動態(tài)更新前系統(tǒng)具有的處理器核心數(shù)量。在大部分情況下,可在決定進行動態(tài)更新后即對系統(tǒng)進行處理器核心數(shù)量降級, 這樣可以簡化本發(fā)明中相關(guān)算法的設(shè)計,并可快速找到動態(tài)更新的安全點。但開發(fā)人員也 可將降級的時機選取為處理器核心空閑時,即在決定進行動態(tài)更新后若某CPU空閑了, 則該CPU將被在線禁止參與運行,除非它不能被禁止參與運行,或本身是最后一個活躍的 CPU。雖然后一種在線降級的方法通常性能較差,但因其實現(xiàn)比較復雜,故本發(fā)明將針對后 者進行說明。如圖1所示,本發(fā)明內(nèi)容為安全點監(jiān)測模塊M10,其運行依賴于傳統(tǒng)動態(tài)更新機制 模塊M20、啟動實施動態(tài)更新的工具模塊M40,被更新的操作系統(tǒng)內(nèi)核為模塊M30。其中安 全點監(jiān)測模塊MlO內(nèi)部包括初始化子模塊M100、事件注入子模塊M101、安全點生成子模塊 M102、系統(tǒng)服務(wù)接口子模塊M103、安全點創(chuàng)建子模塊M104。本發(fā)明提出的安全點監(jiān)測模塊 MlO用于發(fā)現(xiàn)可使用傳統(tǒng)動態(tài)更新機制M20獲取對操作系統(tǒng)內(nèi)核M30安全進行動態(tài)更新的 時機。安全點監(jiān)測模塊MlO的各個組成部分功能如下初始化子模塊MlOO當用戶通過動態(tài)更新的工具M40發(fā)出動態(tài)更新請求時,初始化子模塊MlOO開始執(zhí) 行,其流程為步驟1 將當前系統(tǒng)降級為單處理器核心系統(tǒng);
初始化子模塊MlOO可通過調(diào)用操作系統(tǒng)內(nèi)核M30的“系統(tǒng)處理器核心數(shù)量在線降 級”功能,將當前系統(tǒng)在線降級為單處理器核心的系統(tǒng)。安全點監(jiān)測模塊MlO的開發(fā)人員也 可以選擇在初始化子模塊MlOO中不執(zhí)行此步驟,而是將在線降級留到安全點生成子模塊 M102中實現(xiàn)。步驟2 標記系統(tǒng)當前處于STATE狀態(tài);STATE狀態(tài)指示當前準備對操作系統(tǒng)內(nèi)核M30進行動態(tài)更新,且動態(tài)更新尚未完 成。步驟3 令所有的CPU都運行事件注入子模塊MlOl ;步驟4 安裝安全點創(chuàng)建模塊M104 ;當安全點生成子模塊M102以用戶任務(wù)形式運行時,需要在內(nèi)核安裝安全點創(chuàng)建 子模塊M104,供安全點生成子模塊M102調(diào)用使用。當安全點生成子模塊M102本身就在內(nèi) 核態(tài)運行時,不需要本步驟。事件注入子模塊MlOl事件注入子模塊MlOl的作用是使那些“可能會在操作系統(tǒng)內(nèi)核M30中阻塞、但可 通過異步事件解除阻塞的用戶任務(wù)”能盡快從內(nèi)核離開,而不會在操作系統(tǒng)內(nèi)核M30中被無 限期阻塞。在實現(xiàn)操作系統(tǒng)內(nèi)核M30時,事先可以知道某些系統(tǒng)調(diào)用可能會被異步事件中 斷,如在Linux中,內(nèi)核在執(zhí)行“從文件中讀取數(shù)據(jù)”的系統(tǒng)調(diào)用時可能會因該任務(wù)接收到 信號而從內(nèi)核返回用戶態(tài)。向執(zhí)行此種類型系統(tǒng)調(diào)用的用戶任務(wù)注入異步事件可以確保該 用戶任務(wù)在任何情況下都可以從內(nèi)核離開,而不會阻塞在內(nèi)核中。事件注入子模塊MlOl對 于解除用戶任務(wù)之間的運行依賴關(guān)系至關(guān)重要。例如對于任務(wù)A通過管道向任務(wù)B傳遞數(shù)據(jù)的情形。當管道空時,任務(wù)B執(zhí)行對 管道的“阻塞式讀取”系統(tǒng)調(diào)用(即若管道為空,將任務(wù)B阻塞,直到管道變?yōu)榉强眨祷?讀取的數(shù)據(jù))將導致其被阻塞。將任務(wù)A阻塞會導致其不能向管道寫入數(shù)據(jù),從而造成任 務(wù)B —直被阻塞在內(nèi)核中,所以無法找到動態(tài)更新的安全點。在本發(fā)明中,事件注入子模塊MlOl向任務(wù)B注入異步事件,可保證即使任務(wù)A被 阻塞,任務(wù)B也可以離開內(nèi)核。事件注入子模塊MlOl實現(xiàn)為系統(tǒng)內(nèi)具有最高運行優(yōu)先權(quán)的先進先出型實時任 務(wù),其主體執(zhí)行流程如下步驟1 忙等待所有CPU都執(zhí)行到此處;步驟2:屏蔽外部中斷;步驟3 針對本CPU負責檢查的每個用戶任務(wù),注入異步事件Signal。理論上,只需向“通過可被異步事件中斷的系統(tǒng)調(diào)用進入操作系統(tǒng)內(nèi)核M30的”用 戶任務(wù)注入動態(tài)更新喚醒異步事件即可。但也可要求操作系統(tǒng)內(nèi)核M30在具體處理異步事 件時對對應任務(wù)做如下兩個檢查a)是通過系統(tǒng)調(diào)用進入操作系統(tǒng)內(nèi)核M30 ;b)該系統(tǒng)調(diào) 用可以被異步事件中斷。若某任務(wù)不能通過a)b)兩個檢查,則操作系統(tǒng)內(nèi)核M30就丟棄該 異步事件,從而可將事件注入簡單實現(xiàn)為“向所有的用戶任務(wù)都注入此異步事件”。對于只向通過可被異步事件中斷的系統(tǒng)調(diào)用進入內(nèi)核的用戶任務(wù)注入異步事件 的情形,可通過檢查任務(wù)內(nèi)核棧的方法來獲取該任務(wù)的系統(tǒng)調(diào)用信息。事件注入子模塊 MlOl開發(fā)者可通過查看手冊或系統(tǒng)調(diào)用實現(xiàn)體的源代碼來獲得所有可被異步事件中斷的 系統(tǒng)調(diào)用。
步驟4 忙等待,直到所有的CPU都執(zhí)行到此處;步驟5:開放外部中斷。步驟1、2、4的用途是用來保證在執(zhí)行步驟3時,本CPU負責檢查的用戶任務(wù)不會 發(fā)生變化,否則可能會因任務(wù)遷移而導致漏掉對某些用戶任務(wù)注入異步事件Signal。若操 作系統(tǒng)內(nèi)核M30保證在執(zhí)行步驟3期間,任務(wù)不會從待檢查任務(wù)列表中遷出,則步驟1、2、4、 5是不必要的。系統(tǒng)服務(wù)接口子模塊M103為了能夠安全實施對于操作系統(tǒng)內(nèi)核M30的動態(tài)更新,需讓所有的任務(wù)都離開操 作系統(tǒng)內(nèi)核M30中可能會影響動態(tài)更新安全性的代碼。由于處理用戶任務(wù)的系統(tǒng)調(diào)用或異 ??赡軙?zhí)行影響動態(tài)更新安全性的代碼,為此應盡量阻止用戶任務(wù)通過系統(tǒng)調(diào)用或異常 從用戶態(tài)進入內(nèi)核。但在有些時候,內(nèi)核被設(shè)計為用戶任務(wù)之間一定會存在某種運行依賴關(guān)系,如要 求用戶任務(wù)T必須在用戶任務(wù)TS請求了某種內(nèi)核服務(wù)之后才能運行。以Linux中通過 vfork創(chuàng)建的子線程為例。在Linux中,線程T通過vfork創(chuàng)建子線程TS時,線程T將被阻 塞,直到線程TS執(zhí)行execve或exit系統(tǒng)調(diào)用時才被喚醒。此時,若傳統(tǒng)動態(tài)更新機制模塊M20支持進行動態(tài)更新前后任務(wù)T執(zhí)行現(xiàn)場的轉(zhuǎn) 換,則系統(tǒng)可以忽略這種依賴關(guān)系,將T視作進入了不影響動態(tài)更新安全性的狀態(tài);若傳統(tǒng) 動態(tài)更新機制模塊模塊M20不支持對任務(wù)T進行動態(tài)更新前后執(zhí)行現(xiàn)場的轉(zhuǎn)換,則需要對 任務(wù)TS做特殊的處理,防止它在“解除系統(tǒng)對任務(wù)T的阻塞“之前被阻塞。本發(fā)明支持上 述兩種情形。不過由于在設(shè)計內(nèi)核時很少人為引入這種任務(wù)間的運行依賴關(guān)系,建議傳統(tǒng) 動態(tài)更新機制模塊M20的開發(fā)者根據(jù)需要開發(fā)任務(wù)T的執(zhí)行現(xiàn)場轉(zhuǎn)換功能。在本發(fā)明中,系統(tǒng)服務(wù)接口子模塊M103用來實現(xiàn)上述對于用戶任務(wù)的系統(tǒng)調(diào)用 和異常處理的選擇性阻塞,其流程如下步驟1 保存現(xiàn)場,切換到內(nèi)核代碼執(zhí)行環(huán)境步驟2 若當前不處于STATE狀態(tài),則轉(zhuǎn)到步驟7,否則繼續(xù)執(zhí)行步驟3 若操作系統(tǒng)內(nèi)核M30期望當前任務(wù)TS在未來解除“內(nèi)核對另外某任務(wù)T 的阻塞”,則繼續(xù)執(zhí)行,否則轉(zhuǎn)到步驟6此步驟要求內(nèi)核M30提供對“任務(wù)TS未來是否會解除對其它任務(wù)的阻塞”的查詢 支持。步驟4 若傳統(tǒng)動態(tài)更新機制模塊M20無法將任務(wù)T的執(zhí)行現(xiàn)場轉(zhuǎn)換為動態(tài)更新實 施后的新狀態(tài),則轉(zhuǎn)到步驟7,否則繼續(xù)執(zhí)行,此步驟要求操作系統(tǒng)內(nèi)核M30提供對“依賴于 任務(wù)TS解除阻塞的任務(wù)及其依賴原因”的查詢支持。若操作系統(tǒng)內(nèi)核M30不提供此支持, 則視作應轉(zhuǎn)到步驟7的情形;此步驟要求傳統(tǒng)動態(tài)更新機制模塊M20支持對特定場景進行動態(tài)更新前后狀態(tài) 轉(zhuǎn)換,若不支持針對操作系統(tǒng)內(nèi)核M30報告的依賴場景進行轉(zhuǎn)換,則視作應轉(zhuǎn)到步驟7的情 形。步驟5 不影響動態(tài)更新安全性的用戶任務(wù)數(shù)加1,將任務(wù)T添加到待轉(zhuǎn)換執(zhí)行現(xiàn) 場的任務(wù)列表步驟6 不影響動態(tài)更新安全性的用戶任務(wù)數(shù)加1,睡眠等待系統(tǒng)不處于STATE狀 態(tài)
在本步驟中,需要操作系統(tǒng)內(nèi)核M30保證異步事件Signal不會喚醒在本步驟中睡 眠的任務(wù)。在執(zhí)行本步驟時,若當前系統(tǒng)中只有一個在線的處理器核心(如初始化子模塊 MlOO已將當前系統(tǒng)降級為單處理器情形),且當前任務(wù)是最后一個需被安全點監(jiān)測模塊 MlO阻塞的用戶任務(wù),則也可以不令本任務(wù)進入睡眠等待狀態(tài),而是執(zhí)行子安全點生成模塊 M102。此時安全點生成子模塊M102將作為系統(tǒng)服務(wù)接口系統(tǒng)服務(wù)接口子模塊M103的一個 組成部分獲得執(zhí)行權(quán)。步驟7 執(zhí)行相應的系統(tǒng)調(diào)用服務(wù)處理函數(shù)步驟8 恢復現(xiàn)場,返回到用戶態(tài)代碼執(zhí)行環(huán)境步驟7和步驟8的實現(xiàn)流程與傳統(tǒng)操作系統(tǒng)的實現(xiàn)相同。安全點生成子模塊M102若可保證在運行系統(tǒng)服務(wù)接口子模塊M103時系統(tǒng)內(nèi)只有一個在線的處理器核心 (如在初始化子模塊MlOO中已對系統(tǒng)的處理器核心數(shù)進行了在線降級),則可在系統(tǒng)服務(wù) 接口子模塊M103發(fā)現(xiàn)當前任務(wù)是最后一個需被安全點監(jiān)測模塊MlO阻塞的用戶任務(wù)時執(zhí) 行安全點生成子模塊M102 ;也可將安全點生成子模塊M102作為一個具有最低運行優(yōu)先權(quán) 的任務(wù)運行。若在動態(tài)更新前未將系統(tǒng)降級為單處理器核心情形,則本發(fā)明要求每個處理 器核心在其空閑時都要運行安全點生成子模塊M102。下面以每個處理器核心都要在空閑時 運行安全點生成子模塊M102的情形介紹M102的流程,其它的情形時的處理流程可以通過 對下述流程進行簡化獲得。安全點生成子模塊M102的主要功能是檢查操作系統(tǒng)內(nèi)核M30是否在所有的CPU 上都處于靜默狀態(tài),若是則實施動態(tài)更新。由于其它CPU可能在接收中斷,故即使本CPU上 的安全點生成子模塊M102發(fā)現(xiàn)其它CPU都在執(zhí)行安全點生成子模塊M102,也不代表當前所 有的CPU都處于靜默狀態(tài)。為了簡化系統(tǒng)的設(shè)計,本發(fā)明采取了處理器數(shù)量動態(tài)降級的方 法。具體的說,當某個CPU執(zhí)行安全點生成子模塊M102時,它將退出參與運行,從而可保證 在動態(tài)更新完成前,該CPU —定不會再執(zhí)行動態(tài)更新之外的內(nèi)核代碼。當系統(tǒng)降級為單處 理器核心情形后,操作系統(tǒng)內(nèi)核代碼在本CPU上處于靜默狀態(tài)就代表了在所有CPU上都處 于靜默狀態(tài)。安全點生成子模塊M102的主要流程為步驟1 若本CPU必須要參與運行,則轉(zhuǎn)到步驟3,否則繼續(xù)執(zhí)行;在有些操作系統(tǒng)中,有的處理器是不能退出參與運行的。步驟2 若本CPU不是最后一個活躍CPU,則令本CPU退出參與運行;CPU退出參與運行將導致其在被允許再次加入運行之前再也不能修改內(nèi)核狀態(tài), 操作系統(tǒng)內(nèi)核M30也不再期望該CPU會對系統(tǒng)提供計算服務(wù)。在有的系統(tǒng)中,這可通過調(diào)用操作系統(tǒng)內(nèi)核M30的在線刪除CPU的功能實現(xiàn)。步驟3 循環(huán)主動釋放CPU,直到當前只有一個活躍CPU ;本模塊可根據(jù)操作系統(tǒng)內(nèi)核M30提供的查詢當前在線處理器核心數(shù)量的機制獲 得當前的處理器核心數(shù)。步驟4:關(guān)閉外部中斷;當安全點生成子模塊M102以內(nèi)核態(tài)任務(wù)形態(tài)運行時執(zhí)行此步驟。若安全點生成子模塊M102以用戶態(tài)任務(wù)形態(tài)運行時,不執(zhí)行此步驟。步驟5 若所有的用戶任務(wù)都不影響動態(tài)更新的安全性,則繼續(xù)執(zhí)行,否則轉(zhuǎn)到步 驟18 ;以下兩種類型的任務(wù)被認為不影響動態(tài)更新的安全性1)在執(zhí)行系統(tǒng)服務(wù)接口 子模塊M103時被阻塞的任務(wù);幻傳統(tǒng)動態(tài)更新機制模塊M20支持進行執(zhí)行現(xiàn)場轉(zhuǎn)換的任務(wù)。當不影響動態(tài)更新安全性的用戶任務(wù)數(shù)與當前系統(tǒng)中存在的用戶任務(wù)數(shù)相等時, 表明所有的用戶任務(wù)都不影響動態(tài)更新的安全性。注意安全點監(jiān)測模塊模塊MlO自身所 創(chuàng)建的用戶任務(wù)被視作不影響動態(tài)更新的安全性。步驟6 若所有的內(nèi)核任務(wù)都不影響動態(tài)更新的安全性,則繼續(xù)執(zhí)行,則轉(zhuǎn)到步驟 18 ;以下三種類型的內(nèi)核任務(wù)被任務(wù)不影響動態(tài)更新的安全性1)操作系統(tǒng)內(nèi)核M30 認為該任務(wù)處于更新安全點;2)操作系統(tǒng)內(nèi)核M30認為該任務(wù)可安全殺死;3)傳統(tǒng)動態(tài)更 新機制模塊M20支持可對該任務(wù)的執(zhí)行現(xiàn)場進行轉(zhuǎn)換。注意安全點監(jiān)測模塊MlO自身所 創(chuàng)建的內(nèi)核任務(wù)被視作不影響動態(tài)更新的安全性。一個內(nèi)核任務(wù)是可安全殺死的是指若該任務(wù)在內(nèi)核中睡眠時被殺死,操作系統(tǒng)內(nèi) 核M30支持以后通過某種方式恢復該任務(wù)的運行,使得使用此內(nèi)核任務(wù)提供服務(wù)的任務(wù)不 受此內(nèi)核任務(wù)曾經(jīng)被殺死的影響。操作系統(tǒng)內(nèi)核M30可對安全點生成子模塊M102提供信息,供后者判斷不處于安全 點的任務(wù)是否是可安全殺死的。此時安全點生成子模塊M102認為滿足如下條件的內(nèi)核任 務(wù)是可安全殺死的1)所有與該任務(wù)進行同步通信的內(nèi)核任務(wù)都是可安全殺死的;2)該任 務(wù)自身被實現(xiàn)為支持從中間狀態(tài)恢復運行。一個內(nèi)核任務(wù)是可安全轉(zhuǎn)換的是指若該任務(wù)在內(nèi)核中睡眠,傳統(tǒng)動態(tài)更新機制模 塊M20支持將其執(zhí)行現(xiàn)場轉(zhuǎn)換為實施更新后的對應現(xiàn)場。此時,傳統(tǒng)動態(tài)更新機制模塊M20 需要針對具體的每個內(nèi)核任務(wù)開發(fā)相應的執(zhí)行現(xiàn)場轉(zhuǎn)換功能,而且有些轉(zhuǎn)換功能的實現(xiàn)還 與具體的動態(tài)更新補丁相關(guān)。步驟7 殺死所有可安全殺死的內(nèi)核任務(wù);步驟8 若本子模塊以內(nèi)核態(tài)任務(wù)形態(tài)運行,則繼續(xù)執(zhí)行,否則轉(zhuǎn)到步驟16 ;步驟9 調(diào)用傳統(tǒng)動態(tài)更新機制模塊M20實施動態(tài)更新;在傳統(tǒng)動態(tài)更新機制模塊M20實施動態(tài)更新時,進行新舊功能體的替換,也會轉(zhuǎn) 換可安全轉(zhuǎn)換的任務(wù)現(xiàn)場,也為待轉(zhuǎn)換執(zhí)行現(xiàn)場列表中的所有用戶任務(wù)轉(zhuǎn)換現(xiàn)場。步驟10 恢復在步驟7被殺死的內(nèi)核任務(wù);步驟11:開放外部中斷;當本子模塊以內(nèi)核態(tài)任務(wù)形態(tài)運行時執(zhí)行此步驟。若本子模塊以用戶態(tài)任務(wù)形態(tài) 運行時,不執(zhí)行此步驟。步驟12 令所有在步驟2退出參與運行的CPU重新參與運行;此步驟將導致在步驟2退出的那些CPU重新為操作系統(tǒng)內(nèi)核M30提供計算服務(wù)。 在有的系統(tǒng)中,這可通過調(diào)用操作系統(tǒng)內(nèi)核M30的在線添加CPU功能實現(xiàn)。步驟13 設(shè)置系統(tǒng)不再處于STATE狀態(tài);
步驟14 喚醒所有因執(zhí)行系統(tǒng)服務(wù)接口子模塊M103而被阻塞的任務(wù);步驟15 處理結(jié)束;步驟16 觸發(fā)導致安全點創(chuàng)建子模塊M104執(zhí)行的異常,并接收異常處理的處理結(jié) 果;步驟17 若異常處理返回值指示處理成功,則轉(zhuǎn)到步驟10,否則繼續(xù)執(zhí)行;步驟18 開放中斷;當本子模塊以內(nèi)核態(tài)任務(wù)形態(tài)運行時執(zhí)行此步驟。若本子模塊以用戶態(tài)任務(wù)形態(tài) 運行時,不執(zhí)行此步驟。步驟19 主動釋放CPU ;步驟20:轉(zhuǎn)到步驟4。安全點創(chuàng)建子模塊M104本子模塊僅當安全點生成子模塊M102以用戶態(tài)任務(wù)形式運行時才需要。其處理 流程為步驟1 若所有的用戶任務(wù)都不影響動態(tài)更新的安全性,則繼續(xù)執(zhí)行,否則返回失 敗;以下兩種類型的任務(wù)被認為不影響動態(tài)更新的安全性1)在執(zhí)行系統(tǒng)服務(wù)接口 子模塊M103時被阻塞的任務(wù);幻傳統(tǒng)動態(tài)更新機制模塊M20支持進行執(zhí)行現(xiàn)場轉(zhuǎn)換的任務(wù)。當不影響動態(tài)更新安全性的用戶任務(wù)數(shù)與當前系統(tǒng)中存在的用戶任務(wù)數(shù)相等時, 表明所有的用戶任務(wù)都不影響動態(tài)更新的安全性。注意安全點監(jiān)測模塊MlO自身所創(chuàng)建 的用戶任務(wù)被視作不影響動態(tài)更新的安全性。步驟2 若可安全進行動態(tài)更新,則繼續(xù)執(zhí)行,否則返回失敗;如果內(nèi)核任務(wù)都屬于以下兩種類型之一,則認為當前可安全進行動態(tài)更新1)操 作系統(tǒng)內(nèi)核M30認為該任務(wù)處于更新安全點;2)傳統(tǒng)動態(tài)更新機制模塊M20支持可對該任 務(wù)的執(zhí)行現(xiàn)場進行轉(zhuǎn)換。注意安全點監(jiān)測模塊MlO自身所創(chuàng)建的內(nèi)核任務(wù)被視作不影響 動態(tài)更新的安全性。步驟3 調(diào)用傳統(tǒng)動態(tài)更新機制模塊M20實施動態(tài)更新;在傳統(tǒng)動態(tài)更新機制模塊M20實施動態(tài)更新時,將轉(zhuǎn)換可安全轉(zhuǎn)換的任務(wù)現(xiàn)場, 也為待轉(zhuǎn)換執(zhí)行現(xiàn)場列表中的所有用戶任務(wù)轉(zhuǎn)換現(xiàn)場。步驟4:返回成功。本發(fā)明的優(yōu)點為對于任意類型的操作系統(tǒng)動態(tài)更新請求,都能快速的找到可對內(nèi) 核實施動態(tài)更新的安全點,且不會影響用戶任務(wù)的正常運行。首先,本發(fā)明可保證找到的動態(tài)更新點絕對安全。本發(fā)明發(fā)現(xiàn)的動態(tài)更新點具有 如下特征所有的用戶任務(wù)都沒有在內(nèi)核態(tài)運行;所有的內(nèi)核態(tài)任務(wù)都處于動態(tài)更新安全 點,或者動態(tài)更新機制支持對其執(zhí)行現(xiàn)場進行轉(zhuǎn)換;在實施動態(tài)更新時沒有任何內(nèi)核代碼 在運行。其次,本發(fā)明可以快速找到動態(tài)更新安全點。首先,系統(tǒng)服務(wù)接口子模塊M103將 絕大多數(shù)用戶任務(wù)都阻擋在了內(nèi)核代碼之外;其次,事件注入子模塊MlOl將絕大多數(shù)在內(nèi) 核中睡眠等待事件的用戶任務(wù)都趕出了內(nèi)核,并防止了因為阻塞用戶任務(wù)進入內(nèi)核而導致某些在內(nèi)核的任務(wù)永遠沒有機會從內(nèi)核退出的情況;最后,選擇性殺死內(nèi)核任務(wù)可加快內(nèi) 核處于靜默狀態(tài)的速度。最后,本發(fā)明不會影響用戶任務(wù)的正常運行。在尋找動態(tài)更新安全點的過程中,本 發(fā)明沒有殺死任何用戶任務(wù),且對注入異步事件的處理對于用戶任務(wù)透明。
圖1為系統(tǒng)的總體結(jié)構(gòu)2為系統(tǒng)的總體流程圖3為子模塊MlOO的流程4為子模塊MlOl的流程5為子模塊M103的流程6為子模塊M102以運行優(yōu)先權(quán)僅高于系統(tǒng)內(nèi)空閑任務(wù)的任務(wù)的流程7為子模塊M104當子模塊M102以用戶態(tài)任務(wù)形式運行時的流程圖
具體實施例方式圖1為系統(tǒng)的總體結(jié)構(gòu)圖。本發(fā)明內(nèi)容為安全點監(jiān)測模塊M10,它包括初始化子模 塊M100、事件注入子模塊M101、安全點生成子模塊M102、系統(tǒng)服務(wù)接口子模塊M103、安全點 創(chuàng)建子模塊M104。模塊M40為實施動態(tài)更新的工具,內(nèi)核M30為欲實施更新的操作系統(tǒng)內(nèi) 核,模塊M20為傳統(tǒng)的動態(tài)更新機制,本發(fā)明提出的模塊MlO用于獲取對內(nèi)核M30安全進行 動態(tài)更新的時機。根據(jù)是否事先對系統(tǒng)處理器核心數(shù)量進行在線降級,可以將本發(fā)明的實施方法劃 分為兩類,一類為在初始化子模塊MlOO中進行處理器核心數(shù)量的在線降級,另外一類為在 安全點生成子模塊M102中進行處理器核心數(shù)量的在線降級。一般說來,前一類實施方法比 較簡單,而且可以較快的發(fā)現(xiàn)動態(tài)更新的安全點。但由于通過后一類實施方法可以很容易 得到前一類實施方法,故下文以后一類實施方法為例進行說明。圖2為本發(fā)明工作時的主要流程。當用戶通過實施動態(tài)更新的工具模塊M40請求 進行動態(tài)更新時,初始化子模塊MlOO被執(zhí)行,后者導致每個在線CPU都運行事件注入子模 塊M101。子模塊MlOl可能會通過操作系統(tǒng)內(nèi)核M30的任務(wù)控制功能對某些任務(wù)注入異步 事件 Signal。當用戶任務(wù)通過系統(tǒng)調(diào)用或異常進入內(nèi)核時,系統(tǒng)服務(wù)接口子模塊M103被運行。 后者可能通過操作系統(tǒng)內(nèi)核M30的任務(wù)控制功能將當前的用戶任務(wù)阻塞。當系統(tǒng)處于空閑時,安全點生成子模塊M102被執(zhí)行,它通過操作系統(tǒng)內(nèi)核M30的 CPU在線配置功能將系統(tǒng)中參與運行的CPU核心數(shù)量減小到1,然后再確認當前處于動態(tài)更 新安全點后,調(diào)用模塊M20實施更新,之后通過內(nèi)核M30的CPU在線配置功能恢復參與運行 的CPU數(shù)量。當子模塊M102以用戶態(tài)任務(wù)形式實現(xiàn)時,子模塊M102要通過子模塊M104調(diào) 用模塊M20。子模塊M102最后通過內(nèi)核M30的任務(wù)控制功能喚醒因執(zhí)行子模塊M103而被 阻塞的用戶任務(wù)。本發(fā)明需要對內(nèi)核M30的任務(wù)創(chuàng)建與刪除、異步事件的處理等機制進行少量修 改。為了方便系統(tǒng)較快的找到動態(tài)更新安全點,最好也在編寫內(nèi)核任務(wù)的過程中考慮到對于動態(tài)更新的支持間題。以下對各個組成部分的工作流程進行詳細說明。本發(fā)明中,由模塊M40啟動對內(nèi)核M30的動態(tài)更新,模塊M40的啟動動作將導致初 始化子模塊MlOO被執(zhí)行,該模塊執(zhí)行如下步驟,如圖3所示1標記系統(tǒng)處于STATE狀態(tài)2令所有的CPU都運行子模塊MlOl3在內(nèi)核中安裝安全點創(chuàng)建子模塊M104當安全點生成子模塊M102以用戶任務(wù)形式運行時,需要在內(nèi)核安裝安全點創(chuàng)建 子模塊M104,供子模塊M102調(diào)用使用。當子模塊M102本身就在內(nèi)核態(tài)運行時,不需要本步
馬聚ο在實現(xiàn)中,初始化子模塊MlOl作為系統(tǒng)內(nèi)具有最高運行優(yōu)先權(quán)的實時、先進先出 型任務(wù)(下稱為任務(wù)T101)被執(zhí)行。任務(wù)TlOl的個數(shù)與當前在線的總處理器核心數(shù)相同, 且與各個處理器核心具有一一綁定關(guān)系。在有的實現(xiàn)中,任務(wù)TlOl由模塊MlO事先創(chuàng)建, 此時子模塊MlOO的步驟2為“喚醒所有的TlOl任務(wù)”;在有的實現(xiàn)中,MlOO的步驟2動態(tài) 創(chuàng)建并運行任務(wù)TlOl。對于任務(wù)TlOl由模塊MlO事先創(chuàng)建的情形,子模塊MlOl的流程如圖4所示1睡眠,等待被喚醒2忙等待所有的CPU都執(zhí)行到此處3關(guān)閉外部中斷4對于本CPU負責檢查的用戶任務(wù),注入異步事件Signal5忙等待,直到所有的CPU都執(zhí)行到此處6開放外部中斷7轉(zhuǎn)到步驟1當任務(wù)TlOl由初始化子模塊MlOO創(chuàng)建時,其流程為上述步驟2到步驟6。對于步驟4,在一種實現(xiàn)中,由一個CPU負責向所有的用戶任務(wù)注入異步事件;在 另外一種實現(xiàn)中,所有的CPU都參與異步事件的注入工作。步驟2、3、5的用途是用來保證在執(zhí)行步驟4時,本CPU負責檢查的用戶任務(wù)不會 發(fā)生變化,否則可能會因任務(wù)遷移而導致漏掉對某些用戶任務(wù)注入異步事件Signal。若內(nèi) 核M30保證在執(zhí)行步驟4期間,任務(wù)不會從待檢查任務(wù)列表中遷出,則步驟2、3、5、6是不必 要的。當任務(wù)通過系統(tǒng)調(diào)用或異常進入內(nèi)核時,執(zhí)行系統(tǒng)服務(wù)接口子模塊M103,其流程 如圖5所示1保存現(xiàn)場,切換到內(nèi)核代碼執(zhí)行環(huán)境2若當前不處于STATE狀態(tài),則轉(zhuǎn)到步驟7,否則繼續(xù)執(zhí)行3若內(nèi)核期望當前任務(wù)TS在未來解除內(nèi)核對另外某任務(wù)T的阻塞,則繼續(xù)執(zhí)行,否 則轉(zhuǎn)到步驟6此步驟要求內(nèi)核M30提供對“任務(wù)TS未來是否會解除對其它任務(wù)的阻塞”的查詢支持。4若模塊M20無法將任務(wù)T的執(zhí)行現(xiàn)場轉(zhuǎn)換為動態(tài)更新實施后的新狀態(tài),則轉(zhuǎn)到步驟7,否則繼 續(xù)執(zhí)行此步驟要求內(nèi)核M30提供對“依賴于任務(wù)TS解除阻塞的任務(wù)及其依賴原因”的查 詢支持。若M30不提供此支持,則視作應轉(zhuǎn)到步驟7的情形。此步驟要求模塊M20支持對特定場景進行動態(tài)更新前后狀態(tài)轉(zhuǎn)換,若不支持對 M30報告的依賴場景進行轉(zhuǎn)換,則視作應轉(zhuǎn)到步驟7的情形。5不影響動態(tài)更新安全性的用戶任務(wù)數(shù)加1,將任務(wù)T添加到待轉(zhuǎn)換執(zhí)行現(xiàn)場的任 務(wù)列表6不影響動態(tài)更新安全性的用戶任務(wù)數(shù)加1,睡眠等待系統(tǒng)不處于STATE狀態(tài)在本步驟中,需要保證異步事件Signal不會喚醒在本步驟中睡眠的任務(wù)。在執(zhí)行本步驟時,若當前系統(tǒng)中只有一個在線的處理器核心(如子模塊MlOO已 將當前系統(tǒng)降級為單處理器情形),且當前任務(wù)是最后一個需被模塊MlO阻塞的用戶任務(wù), 則也可以不令本任務(wù)進入睡眠等待狀態(tài),而是執(zhí)行子模塊M102。此時子模塊M102將作為子 模塊M103的一個組成部分獲得執(zhí)行權(quán)。7執(zhí)行相應的系統(tǒng)調(diào)用服務(wù)處理函數(shù)8恢復現(xiàn)場,返回到用戶態(tài)代碼執(zhí)行環(huán)境步驟7和步驟8的實現(xiàn)流程與傳統(tǒng)操作系統(tǒng)的實現(xiàn)相同。安全點生成子模塊M102在一種實現(xiàn)中,子模塊M102以運行優(yōu)先權(quán)僅高于系統(tǒng)內(nèi)空閑任務(wù)的任務(wù)(稱作任 務(wù)T102)運行,此時,任務(wù)T102的數(shù)量與在線處理器核心的數(shù)量相同,且與在線的處理器 核心具有一一綁定關(guān)系;在另外的實現(xiàn)中,子模塊M102本身作為系統(tǒng)內(nèi)空閑任務(wù)(idle任 務(wù))的一部分參與運行。圖6以第一種情形來說明其流程,對于第二種情形,可將空閑任務(wù) 的空閑循環(huán)體進行修改,使之在系統(tǒng)處于STATE狀態(tài)時執(zhí)行下述流程即可。步驟1 若本CPU必須要參與運行,則轉(zhuǎn)到步驟3,否則繼續(xù)執(zhí)行;在有些操作系統(tǒng)中,有的處理器是不能退出參與運行的。步驟2 若本CPU不是最后一個活躍CPU,則令本CPU退出參與運行;CPU退出參與運行將導致其在被允許再次加入運行之前再也不能修改內(nèi)核M30的 狀態(tài),內(nèi)核M30也不再期望該CPU會對自身提供計算服務(wù)。在有的系統(tǒng)中,這可通過調(diào)用內(nèi)核M30的在線刪除CPU功能實現(xiàn)。步驟3 循環(huán)主動釋放CPU,直到當前只有一個活躍CPU ;本模塊可根據(jù)內(nèi)核M30提供的“當前在線處理器核心數(shù)量獲取機制”獲得當前的 處理器核心數(shù)。步驟4:關(guān)閉外部中斷;步驟5 若所有的用戶任務(wù)都不影響動態(tài)更新的安全性,則繼續(xù)執(zhí)行,否則轉(zhuǎn)到步 驟16 ;當不影響動態(tài)更新安全性的用戶任務(wù)數(shù)與當前系統(tǒng)中存在的用戶任務(wù)數(shù)相等時, 表明所有的用戶任務(wù)都不影響動態(tài)更新的安全性。注意模塊MlO自身所創(chuàng)建的用戶任務(wù) 被視作不影響動態(tài)更新的安全性。步驟6 若所有的內(nèi)核任務(wù)都不影響動態(tài)更新的安全性,則繼續(xù)運行,否則轉(zhuǎn)到步驟16 ;當系統(tǒng)中所有不處于更新安全點的內(nèi)核任務(wù)都是可安全殺死的或可安全轉(zhuǎn)換的, 則認為所有的內(nèi)核任務(wù)都不影響動態(tài)更新的安全性。注意模塊MlO自身所創(chuàng)建的內(nèi)核任 務(wù)被視作不影響動態(tài)更新的安全性。一個內(nèi)核任務(wù)是可安全殺死的,當且僅當若該任務(wù)在內(nèi)核中睡眠時被殺死后,內(nèi) 核M30支持以后通過某種方式恢復該任務(wù)的運行,且使用此內(nèi)核任務(wù)提供服務(wù)的任務(wù)不受 此內(nèi)核任務(wù)曾經(jīng)被殺死的影響。內(nèi)核M30可對子模塊M102提供信息,供后者判斷不處于安全點的任務(wù)是否是可安 全殺死的。此時子模塊M102認為滿足如下條件的內(nèi)核任務(wù)是可安全殺死的1)所有與該 任務(wù)進行同步通信的內(nèi)核任務(wù)都是可安全殺死的;2)該任務(wù)自身被實現(xiàn)為支持從中間狀 態(tài)恢復運行。一個內(nèi)核任務(wù)是可安全轉(zhuǎn)換的,當且僅當若該任務(wù)在內(nèi)核中睡眠,模塊M20支持 將其執(zhí)行現(xiàn)場轉(zhuǎn)換為實施更新后的對應現(xiàn)場。此時,模塊M20需針對具體的每個內(nèi)核任務(wù) 開發(fā)相應的執(zhí)行現(xiàn)場轉(zhuǎn)換功能,且有些轉(zhuǎn)換功能的實現(xiàn)還與具體的動態(tài)更新補丁相關(guān)。步驟7 解決不處于更新安全點的內(nèi)核任務(wù)使用內(nèi)核代碼的問題;此步驟要殺死可安全殺死的內(nèi)核任務(wù),轉(zhuǎn)換可安全轉(zhuǎn)換的內(nèi)核任務(wù)。步驟8 ;若本子模塊以內(nèi)核態(tài)任務(wù)形態(tài)運行,則繼續(xù)執(zhí)行,否則轉(zhuǎn)到步驟16 ;步驟9 調(diào)用模塊M20實施動態(tài)更新;在M20實施動態(tài)更新時,進行新舊功能體的替換,也會轉(zhuǎn)換可安全轉(zhuǎn)換的任務(wù)現(xiàn) 場,也為待轉(zhuǎn)換執(zhí)行現(xiàn)場列表中的所有用戶任務(wù)轉(zhuǎn)換現(xiàn)場。步驟10 恢復在步驟7被殺死的內(nèi)核任務(wù);步驟11:開放外部中斷;當本子模塊以內(nèi)核態(tài)任務(wù)形態(tài)運行時執(zhí)行此步驟。若本子模塊以用戶態(tài)任務(wù)形態(tài) 運行時,不執(zhí)行此步驟。步驟12 令所有在步驟2退出參與運行的CPU重新參與運行;此步驟將導致在步驟2退出的那些CPU重新為內(nèi)核M30提供計算服務(wù)。在有的系 統(tǒng)中,這可通過調(diào)用內(nèi)核M30的在線添加CPU功能實現(xiàn)。步驟13 設(shè)置系統(tǒng)不再處于STATE狀態(tài);步驟14 喚醒所有因執(zhí)行子模塊M103而被阻塞的任務(wù);步驟15:處理結(jié)束;步驟16 ;觸發(fā)導致子模塊M104執(zhí)行的異常,并接收異常處理的處理結(jié)果;步驟17 若異常處理返回值指示處理成功,則轉(zhuǎn)到步驟10,否則繼續(xù)執(zhí)行;步驟18:開放中斷;當本子模塊以內(nèi)核態(tài)任務(wù)形態(tài)運行時時執(zhí)行此步驟。若本子模塊以用戶態(tài)任務(wù)形 態(tài)運行時,不執(zhí)行此步驟。步驟19 主動釋放CPU ; 步驟20:轉(zhuǎn)到步驟4。安全點創(chuàng)建子模塊M104本子模塊僅當安全點生成子模塊M102以用戶態(tài)任務(wù)形式運行時才需要。它是異常處理例程,圖7為其處理流程1若所有的用戶任務(wù)都不影響動態(tài)更新的安全性,則繼續(xù)執(zhí)行,否則返回失敗以下兩種類型的任務(wù)被認為不影響動態(tài)更新的安全性1)在執(zhí)行子模塊M103時被阻塞的任務(wù);2)模塊M20支持進行執(zhí)行現(xiàn)場轉(zhuǎn)換的任務(wù)。當不影響動態(tài)更新安全性的用戶任務(wù)數(shù)與當前系統(tǒng)中存在的用戶任務(wù)數(shù)相等時, 表明所有的用戶任務(wù)都不影響動態(tài)更新的安全性。注意模塊MlO自身所創(chuàng)建的用戶任務(wù) 被視作不影響動態(tài)更新的安全性。2若可安全進行動態(tài)更新,則繼續(xù)執(zhí)行,否則返回失敗如果內(nèi)核任務(wù)都屬于以下兩種類型之一,則認為當前可安全進行動態(tài)更新1)內(nèi) 核M30認為該任務(wù)處于更新安全點;2)模塊M20支持可對該任務(wù)的執(zhí)行現(xiàn)場進行轉(zhuǎn)換。注 意模塊MlO自身所創(chuàng)建的內(nèi)核任務(wù)被視作不影響動態(tài)更新的安全性。3調(diào)用模塊M20實施動態(tài)更新在M20實施動態(tài)更新時,將轉(zhuǎn)換可安全轉(zhuǎn)換的任務(wù)現(xiàn)場,也為待轉(zhuǎn)換執(zhí)行現(xiàn)場列 表中的所有用戶任務(wù)轉(zhuǎn)換現(xiàn)場。4返回成功對操作系統(tǒng)內(nèi)核M30的修改為保證本發(fā)明的實施,需要對操作系統(tǒng)內(nèi)核M30進行修改,使其滿足1)實時維護 當前系統(tǒng)中存在的用戶態(tài)任務(wù)總數(shù)和內(nèi)核態(tài)任務(wù)總數(shù);2)對外暴露內(nèi)核態(tài)任務(wù)之間的同 步通信關(guān)系;3)對外暴露各個內(nèi)核態(tài)任務(wù)是否處于安全更新點的狀態(tài);4)對外暴露所有的 可中斷恢復的內(nèi)核態(tài)任務(wù);5)對外暴露用戶態(tài)任務(wù)之間的運行依賴關(guān)系。另外,還需要為 操作系統(tǒng)內(nèi)核M30增添一種新型的異步事件Signal及其處理機制。具體修改內(nèi)容如下1、實時維護當前系統(tǒng)中存在的用戶態(tài)任務(wù)和內(nèi)核態(tài)任務(wù)情況一般來說,操作系統(tǒng)內(nèi)核M30已有機制向外界提供當前系統(tǒng)存在的任務(wù)信息,但 操作系統(tǒng)內(nèi)核M30的開發(fā)者可對操作系統(tǒng)內(nèi)核M30進行少量修改,使得模塊MlO可以更容 易實現(xiàn)。如操作系統(tǒng)內(nèi)核M30可增加用于反映當前內(nèi)核中存在的用戶任務(wù)的內(nèi)存變量,使 得模塊MlO可利用該內(nèi)存變量直接獲得當前系統(tǒng)中的用戶任務(wù)數(shù)量。2、對外暴露內(nèi)核態(tài)任務(wù)之間的同步通信關(guān)系內(nèi)核任務(wù)之間的同步通信關(guān)系是模塊MlO用來判斷內(nèi)核任務(wù)是否可安全殺死的 依據(jù)之一。內(nèi)核M30的開發(fā)者需要在編寫內(nèi)核任務(wù)時,說明內(nèi)核任務(wù)之間的同步通信關(guān)系, 并支持外界獲取任務(wù)間的同步通信關(guān)系。3、對外暴露各個內(nèi)核態(tài)任務(wù)是否處于安全更新點的狀態(tài);如果某個內(nèi)核任務(wù)在實施內(nèi)核動態(tài)更新后可以不經(jīng)專門的執(zhí)行現(xiàn)場轉(zhuǎn)換就可繼 續(xù)正常運行,則該任務(wù)被認為是處于安全更新點。內(nèi)核M30的開發(fā)者可以根據(jù)潛在的動態(tài) 更新范圍,確定當任務(wù)運行哪部分代碼時可被認為是處于安全更新點,并在這些代碼段的 開始和結(jié)束位置設(shè)置模塊MlO可見的標記。一般說來,一個內(nèi)核任務(wù)在執(zhí)行“判斷是否有請求需要處理,若無則睡眠等待”這 樣代碼時就可以認為是處于安全更新點。4、對外暴露所有可中斷恢復的內(nèi)核任務(wù)有些內(nèi)核任務(wù)在開發(fā)過程中可能已考慮了對動態(tài)更新的支持問題。如內(nèi)核M30為這些任務(wù)提供“暫?!焙汀袄^續(xù)”接口,使得模塊MlO可以在動態(tài)更新前將這些任務(wù)暫停, 在動態(tài)更新完成后使用“繼續(xù)”功能使內(nèi)核任務(wù)繼續(xù)工作。在實現(xiàn)上,一種簡單的方法是將 任務(wù)編寫為啟動后檢測上次退出情況,若發(fā)現(xiàn)有以前的中間狀態(tài)則接著上次的現(xiàn)場運行。5、對外暴露用戶態(tài)任務(wù)是否被其它任務(wù)依賴 內(nèi)核M30需要記錄“因內(nèi)核設(shè)計原因,哪些用戶任務(wù)未來將解除內(nèi)核對另外某些 任務(wù)的運行阻塞”,并對模塊MlO暴露此信息的訪問接口。如對于Linux系統(tǒng)中的線程數(shù)據(jù)結(jié)構(gòu)中的vfork_done數(shù)據(jù)結(jié)構(gòu)可對外界指示該 線程是否會解除內(nèi)核對于父線程的阻塞。6、異步事件Signal的處理需為內(nèi)核M30增添一種新的異步事件Signal,用于防止某些用戶任務(wù)因為“其它 用戶任務(wù)在執(zhí)行子模塊M103時被阻塞”而在內(nèi)核中阻塞。內(nèi)核M30對于異步事件Signal 的處理方法為查詢該用戶任務(wù)進入內(nèi)核的原因,若它是通過“可被異步事件中斷的系統(tǒng)調(diào) 用”進入內(nèi)核,則要求該任務(wù)重新執(zhí)行本次系統(tǒng)調(diào)用(該系統(tǒng)調(diào)用會導致此用戶任務(wù)在執(zhí)行 子模塊M103時被阻塞);否則僅是簡單將此事件清除。
權(quán)利要求
1.一種獲得傳統(tǒng)操作系統(tǒng)動態(tài)更新時間點的方法,該方法要求外部環(huán)境必須支持以下 能力1)操作系統(tǒng)實時維護當前系統(tǒng)中存在的用戶態(tài)任務(wù)總數(shù)和內(nèi)核態(tài)任務(wù)總數(shù);2)操作 系統(tǒng)應對外暴露某用戶態(tài)任務(wù)是否會因內(nèi)核設(shè)計原因在未來解除操作系統(tǒng)對另外某些用 戶態(tài)任務(wù)的阻塞,其特征在于在決定進行動態(tài)更新后,該方法開始工作,其過程如下1)設(shè)定當前要進行動態(tài)更新;2)向所有用戶任務(wù)注入用于防止其在內(nèi)核中無限期睡眠的異步事件;3)當發(fā)現(xiàn)用戶任務(wù)task請求系統(tǒng)服務(wù)時,若內(nèi)核未被設(shè)計為task未來一定會解除內(nèi) 核對其它某任務(wù)的阻塞,則在為其服務(wù)前將其阻塞,且該阻塞方法不可被異步事件喚醒;4)殺死所有(本發(fā)明自身所需的任務(wù)除外)當前未處于安全更新點、支持中間狀態(tài)恢 復的內(nèi)核任務(wù);5)當運行優(yōu)先權(quán)最低的任務(wù)發(fā)現(xiàn)所有的用戶任務(wù)(本發(fā)明自身所需任務(wù)除外)都因步 驟3)規(guī)定的動作所阻塞、且所有的內(nèi)核任務(wù)(本發(fā)明自身所需任務(wù)除外)都處于安全更新 點時,實施動態(tài)更新;6)動態(tài)更新完成后,設(shè)定當前不處于動態(tài)更新狀態(tài);7)重啟被殺死的內(nèi)核任務(wù),喚醒因步驟3)被阻塞的所有任務(wù)。
2.根據(jù)權(quán)利要求1所述的一種獲得傳統(tǒng)操作系統(tǒng)動態(tài)更新時間點的方法,其特征在于 安全點監(jiān)測模塊MlO內(nèi)部包括初始化子模塊M100、事件注入子模塊M101、安全點生成子模 塊M102、系統(tǒng)服務(wù)接口子模塊M103、安全點創(chuàng)建子模塊M104。
3.根據(jù)權(quán)利要求1所述的一種獲得傳統(tǒng)操作系統(tǒng)動態(tài)更新時間點的方法,其特征在于 當用戶通過動態(tài)更新的工具M40發(fā)出動態(tài)更新請求時,初始化子模塊MlOO開始執(zhí)行,其流 程為步驟1 將當前系統(tǒng)降級為單處理器核心系統(tǒng); 步驟2 標記系統(tǒng)當前處于STATE狀態(tài); 步驟3 令所有的CPU都運行事件注入子模塊MlOl ; 步驟4 安裝安全點創(chuàng)建模塊M104。
4.根據(jù)權(quán)利要求1所述的一種獲得傳統(tǒng)操作系統(tǒng)動態(tài)更新時間點的方法,其特征在于 事件注入子模塊MlOl實現(xiàn)為系統(tǒng)內(nèi)具有最高運行優(yōu)先權(quán)的先進先出型實時任務(wù),其主體 執(zhí)行流程如下步驟1 忙等待所有CPU都執(zhí)行到步驟1 ; 步驟2:屏蔽外部中斷;步驟3 針對本CPU負責檢查的每個用戶任務(wù),注入異步事件Signal。 步驟4 忙等待,直到所有的CPU都執(zhí)行到此處; 步驟5:開放外部中斷。
5.根據(jù)權(quán)利要求1所述的一種獲得傳統(tǒng)操作系統(tǒng)動態(tài)更新時間點的方法,其特征在于 系統(tǒng)服務(wù)接口子模塊M103用來實現(xiàn)上述對于用戶任務(wù)的系統(tǒng)調(diào)用和異常處理的選擇性阻 塞,流程如下步驟1 保存現(xiàn)場,切換到內(nèi)核代碼執(zhí)行環(huán)境; 步驟2 若當前不處于STATE狀態(tài),則轉(zhuǎn)到步驟7,否則繼續(xù)執(zhí)行; 步驟3 若操作系統(tǒng)內(nèi)核M30期望當前任務(wù)TS在未來解除“內(nèi)核對另外某任務(wù)T的阻塞”,則繼續(xù)執(zhí)行,否則轉(zhuǎn)到步驟6 ;步驟4 若傳統(tǒng)動態(tài)更新機制模塊M20無法將任務(wù)T的執(zhí)行現(xiàn)場轉(zhuǎn)換為動態(tài)更新實施 后的新狀態(tài),則轉(zhuǎn)到步驟7,否則繼續(xù)執(zhí)行;步驟5 不影響動態(tài)更新安全性的用戶任務(wù)數(shù)加1,將任務(wù)T添加到待轉(zhuǎn)換執(zhí)行現(xiàn)場的 任務(wù)列表;步驟6 不影響動態(tài)更新安全性的用戶任務(wù)數(shù)加1,睡眠等待系統(tǒng)不處于STATE狀態(tài); 步驟7 執(zhí)行相應的系統(tǒng)調(diào)用服務(wù)處理函數(shù); 步驟8 恢復現(xiàn)場,返回到用戶態(tài)代碼執(zhí)行環(huán)境。
6.根據(jù)權(quán)利要求1所述的一種獲得傳統(tǒng)操作系統(tǒng)動態(tài)更新時間點的方法,其特征在于 安全點生成子模塊M102的流程如下步驟1 若本CPU必須要參與運行,則轉(zhuǎn)到步驟3,否則繼續(xù)執(zhí)行; 步驟2 若本CPU不是最后一個活躍CPU,則令本CPU退出參與運行; 步驟3 循環(huán)主動釋放CPU,直到當前只有一個活躍CPU ; 步驟4:關(guān)閉外部中斷;步驟5 若所有的用戶任務(wù)都不影響動態(tài)更新的安全性,則繼續(xù)執(zhí)行,否則轉(zhuǎn)到步驟18 ;步驟6 若所有的內(nèi)核任務(wù)都不影響動態(tài)更新的安全性,則繼續(xù)運行,否則轉(zhuǎn)到步驟18 ;步驟7 解決不處于更新安全點的內(nèi)核任務(wù)使用內(nèi)核代碼的問題;步驟8 ;若本子模塊以內(nèi)核態(tài)任務(wù)形態(tài)運行,則繼續(xù)執(zhí)行,否則轉(zhuǎn)到步驟16 ;步驟9 調(diào)用傳統(tǒng)動態(tài)更新機制模塊M20實施動態(tài)更新;步驟10 恢復在步驟7被殺死的內(nèi)核任務(wù);步驟11:開放外部中斷;步驟13 設(shè)置系統(tǒng)不再處于STATE狀態(tài);步驟14 喚醒所有因執(zhí)行系統(tǒng)服務(wù)接口子模塊M103而被阻塞的任務(wù); 步驟15 處理結(jié)束;步驟16 ;觸發(fā)導致安全點創(chuàng)建子模塊M104執(zhí)行的異常,并接收異常處理的處理結(jié)果; 步驟17 若異常處理返回值指示處理成功,則轉(zhuǎn)到步驟10,否則繼續(xù)執(zhí)行; 步驟18 開放中斷; 步驟19 主動釋放CPU ; 步驟20 轉(zhuǎn)到步驟4。
7.根據(jù)權(quán)利要求1所述的一種獲得傳統(tǒng)操作系統(tǒng)動態(tài)更新時間點的方法,其特征在于 安全點創(chuàng)建子模塊M104當安全點生成子模塊M102以用戶態(tài)任務(wù)形式運行時處理流程如 下步驟1 若所有的用戶任務(wù)都不影響動態(tài)更新的安全性,則繼續(xù)執(zhí)行,否則返回失??; 步驟2 若可安全進行動態(tài)更新,則繼續(xù)執(zhí)行,否則返回失敗; 步驟3 調(diào)用傳統(tǒng)動態(tài)更新機制模塊M20實施動態(tài)更新; 步驟4:返回成功。
8.根據(jù)權(quán)利要求1所述的一種獲得傳統(tǒng)操作系統(tǒng)動態(tài)更新時間點的方法,其特征在于對操作系統(tǒng)內(nèi)核M30的修改,內(nèi)容如下(1)、實時維護當前系統(tǒng)中存在的用戶態(tài)任務(wù)和內(nèi)核態(tài)任務(wù)情況; O)、對外暴露內(nèi)核態(tài)任務(wù)之間的同步通信關(guān)系;(3)、對外暴露各個內(nèi)核態(tài)任務(wù)是否處于安全更新點的狀態(tài);(4)、對外暴露所有可中斷恢復的內(nèi)核任務(wù);(5)、對外暴露用戶態(tài)任務(wù)是否被其它任務(wù)依賴;(6)、異步事件Signal的處理。
全文摘要
本發(fā)明涉及一種獲得傳統(tǒng)操作系統(tǒng)動態(tài)更新時間點的方法。本發(fā)明提出的安全點監(jiān)測模塊M10用于發(fā)現(xiàn)可使用傳統(tǒng)動態(tài)更新機制M20獲取對操作系統(tǒng)內(nèi)核M30安全進行動態(tài)更新的時機。該方法的內(nèi)容為安全點監(jiān)測模塊M10,該模塊內(nèi)部包括初始化子模塊M100、事件注入子模塊M101、安全點生成子模塊M102、系統(tǒng)服務(wù)接口子模塊M103、安全點創(chuàng)建子模塊M104。本發(fā)明可保證找到的動態(tài)更新點絕對安全,可以快速找到動態(tài)更新安全點,不會影響用戶任務(wù)的正常運行。
文檔編號G06F9/445GK102073528SQ20111003074
公開日2011年5月25日 申請日期2011年1月28日 優(yōu)先權(quán)日2011年1月28日
發(fā)明者任怡, 劉曉建, 吳慶波, 廖湘科, 戴華東 申請人:中國人民解放軍國防科學技術(shù)大學