專利名稱:為共享代碼段打補(bǔ)丁的方法及裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明實(shí)施例涉及計算機(jī)技術(shù)領(lǐng)域,尤其涉及一種為共享代碼段打補(bǔ)丁的方法及
裝置。
背景技術(shù):
補(bǔ)丁技術(shù)作為一種升級手段越來越受到關(guān)注。在計算機(jī)系統(tǒng)運(yùn)行過程中,由于軟
件存在的某種錯誤往往會造成系統(tǒng)出現(xiàn)異?;虮罎?,為了彌補(bǔ)這樣的錯誤,可以采用補(bǔ)丁
技術(shù)對存在問題的軟件進(jìn)行升級。在這個過程中,不會影響到正常業(yè)務(wù)的處理。 軟件中出現(xiàn)錯誤的地方往往存在于一個或多個函數(shù)中,這些有錯誤的原函數(shù)會被
其他函數(shù)調(diào)用。雖然找到這些調(diào)用函數(shù)比較困難,但是很容易找到出錯的原函數(shù)。因此,打
補(bǔ)丁的關(guān)鍵操作應(yīng)關(guān)注于這些出錯的原函數(shù)上。打補(bǔ)丁的過程為在調(diào)用這些錯誤的原函
數(shù)時,從錯誤的原函數(shù)跳轉(zhuǎn)到修改后的函數(shù)(即補(bǔ)丁函數(shù))上,執(zhí)行完補(bǔ)丁函數(shù)后再返回到
調(diào)用函數(shù)。如此,軟件將永遠(yuǎn)不會執(zhí)行錯誤的原函數(shù),從而完成對軟件的修改。 多核處理器環(huán)境下,現(xiàn)有的對共享代碼段進(jìn)行打補(bǔ)丁的方法中,主虛擬
CPU (Virtual CPU,簡稱VCPU) VCPU向執(zhí)行共享代碼段的所有業(yè)務(wù)VCPU發(fā)送同步消息,通知
各業(yè)務(wù)VCPU需要進(jìn)行補(bǔ)丁操作。各業(yè)務(wù)VCPU收到同步消息后,停止自己正常的業(yè)務(wù)處理,
進(jìn)入等待打補(bǔ)丁狀態(tài),并向主VCPU發(fā)送響應(yīng)消息通知自己已進(jìn)入等待狀態(tài)。主VCPU收到
所有業(yè)務(wù)VCPU的響應(yīng)消息后,對需要打補(bǔ)丁的原函數(shù)中指令進(jìn)行修改即進(jìn)行打補(bǔ)丁操作
規(guī)程,以使業(yè)務(wù)VCPU執(zhí)行到原函數(shù)時從原函數(shù)跳轉(zhuǎn)到補(bǔ)丁函數(shù)。修改完指令后,向所有業(yè)
務(wù)VCPU發(fā)送完成同步消息,通知所有業(yè)務(wù)VCPU補(bǔ)丁操作已經(jīng)完成。所有業(yè)務(wù)VCPU收到完
成補(bǔ)丁操作的同步消息后,刷新各自的快速指令緩沖區(qū)使修改后的指令生效,然后進(jìn)行正
常的業(yè)務(wù)處理。該方案,雖然避免了主VCPU在補(bǔ)丁操作時,主VCPU與業(yè)務(wù)VCPU之間相互 影響的問題,即主VCPU修改指令時,不會有業(yè)務(wù)VCPU執(zhí)行到當(dāng)前修改指令處。
在實(shí)現(xiàn)本發(fā)明過程中,發(fā)明人發(fā)現(xiàn)現(xiàn)有技術(shù)中至少存在如下問題在現(xiàn)有方案中, 主VCPU向所有業(yè)務(wù)VCPU發(fā)送打補(bǔ)丁的同步消息后,需要接收到所有業(yè)務(wù)VCPU發(fā)送的響應(yīng) 消息,才能對共享代碼段進(jìn)行打補(bǔ)丁操作;并且所有業(yè)務(wù)VCPU只有在接收到主VCPU發(fā)送的 完成補(bǔ)丁操作的同步消息后,才能進(jìn)行正常的業(yè)務(wù)處理。因此,如果某個業(yè)務(wù)VCPU當(dāng)前的 業(yè)務(wù)很繁忙,在接收到主VCPU發(fā)送的打補(bǔ)丁的同步消息后,無法及時向主VCPU發(fā)送響應(yīng)消 息,則會造成其他業(yè)務(wù)VCPU和主VCPU都進(jìn)入等待打補(bǔ)丁狀態(tài)。從而導(dǎo)致補(bǔ)丁生效時間較 長,使其它業(yè)務(wù)VCPU不能正常處理業(yè)務(wù)。
發(fā)明內(nèi)容
本發(fā)明實(shí)施例提供一種為共享代碼段打補(bǔ)丁的方法及裝置,用以解決現(xiàn)有為共享 代碼段打補(bǔ)丁的方法中,補(bǔ)丁生效時間較長,影響業(yè)務(wù)VCPU正常處理業(yè)務(wù)的缺陷,實(shí)現(xiàn)了 在不影響業(yè)務(wù)VCPU正常業(yè)務(wù)處理的情況下,對共享代碼段進(jìn)行補(bǔ)丁操作并使補(bǔ)丁快速生效。
本發(fā)明實(shí)施例提供一種為共享代碼段打補(bǔ)丁的方法,包括 為原函數(shù)打補(bǔ)丁前,在共享內(nèi)存中,將原函數(shù)的第一條指令修改為跳轉(zhuǎn)到異常處 理的指令,所述原函數(shù)為需要打補(bǔ)丁的共享函數(shù); 向業(yè)務(wù)VCPU發(fā)送第一中斷消息,所述第一中斷信息用于指示所述業(yè)務(wù)VCPU中斷 當(dāng)前業(yè)務(wù),刷新自身的快速指令緩沖區(qū); 在所述共享內(nèi)存中,將所述原函數(shù)的第一條指令和第二條指令修改為跳轉(zhuǎn)到補(bǔ)丁 函數(shù)的指令,以使執(zhí)行到所述原函數(shù)的所述業(yè)務(wù)VCPU從所述原函數(shù)跳轉(zhuǎn)到所述補(bǔ)丁函數(shù), 所述補(bǔ)丁函數(shù)為替換所述原函數(shù)的函數(shù); 向所述業(yè)務(wù)VCPU發(fā)送第二中斷信息,所述第二中斷信息用于指示所述業(yè)務(wù)VCPU 中斷當(dāng)前業(yè)務(wù),刷新自身的快速指令緩沖區(qū)。 本發(fā)明實(shí)施例提供一種為共享代碼段打補(bǔ)丁的方法,包括 接收到主VCPU發(fā)送的第一中斷信息后,根據(jù)所述第一中斷信息的指示,中斷當(dāng)前 業(yè)務(wù),刷新快速指令緩沖區(qū),以使所述業(yè)務(wù)VCPU自身的快速指令緩沖區(qū)中指令與所述共享 內(nèi)存中指令同步更新,所述原函數(shù)為需要打補(bǔ)丁的函數(shù); 執(zhí)行到原函數(shù)的第一條指令時,根據(jù)所述原函數(shù)的第一條指令,進(jìn)入異常處理,在 所述異常處理中,根據(jù)所述原函數(shù)的首地址,在補(bǔ)丁區(qū)查找出補(bǔ)丁函數(shù)的首地址,所述補(bǔ)丁 函數(shù)為替換所述原函數(shù)的函數(shù);根據(jù)所述補(bǔ)丁函數(shù)的首地址,從所述異常處理跳轉(zhuǎn)到所述 補(bǔ)丁函數(shù)中執(zhí)行; 在根據(jù)所述第一中斷信息的指示,中斷當(dāng)前業(yè)務(wù),刷新快速指令緩沖區(qū)之后,接收 所述主VCPU發(fā)送的第二中斷信息; 根據(jù)所述第二中斷信息的指示,中斷當(dāng)前業(yè)務(wù),刷新自身的快速指令緩沖區(qū),以使 所述業(yè)務(wù)VCPU自身的快速指令緩沖區(qū)中指令與所述共享內(nèi)存中指令同步更新。
本發(fā)明實(shí)施例提供一種為共享代碼段打補(bǔ)丁的裝置,包括 第一修改模塊,用于為原函數(shù)打補(bǔ)丁前,在共享內(nèi)存中,將原函數(shù)的第一條指令修 改為跳轉(zhuǎn)到異常處理的指令,所述原函數(shù)為需要打補(bǔ)丁的共享函數(shù); 第一中斷模塊,用于在所述第一修改模塊在共享內(nèi)存中,將原函數(shù)的第一條指令 修改為跳轉(zhuǎn)到異常處理的指令后,向業(yè)務(wù)VCPU發(fā)送第一中斷消息,所述中斷信息用于指示 所述業(yè)務(wù)VCPU中斷當(dāng)前業(yè)務(wù),刷新自身的快速指令緩沖區(qū); 第一補(bǔ)丁模塊,用于在所述第一中斷模塊向所述業(yè)務(wù)VPCU發(fā)送第一中斷信息后, 在所述共享內(nèi)存中,將所述原函數(shù)的第一條指令和第二條指令修改為跳轉(zhuǎn)到補(bǔ)丁函數(shù)的指 令,以使執(zhí)行到所述原函數(shù)的所述業(yè)務(wù)VCPU從所述原函數(shù)跳轉(zhuǎn)到所述補(bǔ)丁函數(shù),所述補(bǔ)丁 函數(shù)為替換所述原函數(shù)的函數(shù); 第二中斷模塊,用于在所述第一補(bǔ)丁模塊在所述共享內(nèi)存中,將所述原函數(shù)的第 一條指令和第二條指令修改為跳轉(zhuǎn)到補(bǔ)丁函數(shù)的指令后,向所述業(yè)務(wù)VPCU發(fā)送第二中斷 信息。 本發(fā)明實(shí)施例提供一種為共享代碼段打補(bǔ)丁的裝置,包括 第一刷新模塊,用于接收到主VCPU發(fā)送的第一中斷信息后,根據(jù)所述第一中斷信 息的指示,中斷當(dāng)前業(yè)務(wù),刷新快速指令緩沖區(qū),以使所述業(yè)務(wù)VCPU自身的快速指令緩沖 區(qū)中指令與所述共享內(nèi)存中指令同步更新,所述原函數(shù)為需要打補(bǔ)丁的函數(shù);
第一異常處理模塊,用于在所述第一刷新模塊刷新快速指令緩沖區(qū)后,執(zhí)行到原 函數(shù)的第一條指令時,根據(jù)所述原函數(shù)的第一條指令,進(jìn)入異常處理,在所述異常處理中, 根據(jù)所述原函數(shù)的首地址,在補(bǔ)丁區(qū)查找出補(bǔ)丁函數(shù)的首地址,所述補(bǔ)丁函數(shù)為替換所述 原函數(shù)的函數(shù); 第一補(bǔ)丁函數(shù)執(zhí)行模塊,用于在所述第一異常處理模塊查找出所述補(bǔ)丁函數(shù)的首 地址后,根據(jù)所述補(bǔ)丁函數(shù)的首地址,從所述異常處理跳轉(zhuǎn)到所述補(bǔ)丁函數(shù)中執(zhí)行;
第二刷新模塊,用于在所述第一刷新模塊根據(jù)所述第一中斷信息的指示,中斷當(dāng) 前業(yè)務(wù),刷新快速指令緩沖區(qū)之后,接收所述主VCPU發(fā)送的第二中斷信息,根據(jù)所述第二 中斷信息的指示,中斷當(dāng)前業(yè)務(wù),刷新自身的快速指令緩沖區(qū),以使所述業(yè)務(wù)VCPU自身的 快速指令緩沖區(qū)中指令與所述共享內(nèi)存中指令同步更新 本發(fā)明實(shí)施例為共享代碼段打補(bǔ)丁的方法及裝置,在多核處理器系統(tǒng)運(yùn)行過程 中,在主VCPU對原函數(shù)進(jìn)行打補(bǔ)丁操作之前,將原函數(shù)的第一條指令先修改為跳轉(zhuǎn)到異常 處理的指令,并向業(yè)務(wù)VCPU發(fā)送中斷信息,使業(yè)務(wù)VCPU立即刷新快速指令緩沖區(qū)。由于, 本發(fā)明實(shí)施例中業(yè)務(wù)VCPU接收到主CPU發(fā)送的中斷信息后,不需要向主VCPU發(fā)送響應(yīng)消 息;并且主CPU向業(yè)務(wù)VCPU發(fā)送中斷信息后,即可對原函數(shù)進(jìn)行打補(bǔ)丁操作,因此,本發(fā)明 實(shí)施例能使補(bǔ)丁快速生效。另外,在主VCPU對原函數(shù)打補(bǔ)丁操作時,若業(yè)務(wù)VCPU執(zhí)行到原 函數(shù)則從異常處理進(jìn)入補(bǔ)丁函數(shù),能保證主VCPU對原函數(shù)進(jìn)行正常的打補(bǔ)丁操作。因此本 發(fā)明實(shí)施例為共享代碼段打補(bǔ)丁的方法,在主VCPU對原函數(shù)打補(bǔ)丁操作時,不會影響到該 業(yè)務(wù)VCPU的正常業(yè)務(wù)處理,還能使執(zhí)行到原函數(shù)的業(yè)務(wù)VCPU從原函數(shù)跳轉(zhuǎn)到補(bǔ)丁函數(shù)中執(zhí)行。 本發(fā)明實(shí)施例提供一種為共享代碼段打補(bǔ)丁的方法,包括 為原函數(shù)打補(bǔ)丁前,在共享內(nèi)存中,將原函數(shù)的第一條指令修改為跳轉(zhuǎn)到異常處 理的指令,所述原函數(shù)為需要打補(bǔ)丁的函數(shù); 向各業(yè)務(wù)VCPU發(fā)送第一補(bǔ)丁激活消息,所述第一補(bǔ)丁激活消息用于指示所述業(yè) 務(wù)VCPU在處理完當(dāng)前業(yè)務(wù)后刷新自身的快速指令緩沖區(qū),以使所述業(yè)務(wù)VCPU自身的快速 指令緩沖區(qū)中指令與所述共享內(nèi)存中指令同步更新;指示最后一個刷新自身的快速指令緩 沖區(qū)的VCPU,在刷新自身的快速指令緩沖區(qū)之前,在所述共享內(nèi)存中修改所述原函數(shù)的第 一條指令和第二條指令。 本發(fā)明實(shí)施例提供一種為共享代碼段打補(bǔ)丁的方法,包括
業(yè)務(wù)VCPU接收主VCPU發(fā)送的第一補(bǔ)丁激活消息; 當(dāng)所述業(yè)務(wù)VCPU是最后一個刷新自身的快速指令緩沖區(qū)的業(yè)務(wù)VCPU時,根據(jù)所 述第一補(bǔ)丁激活消息的指示,在共享內(nèi)存中將原函數(shù)的第一條指令和第二條指令修改為所 述跳轉(zhuǎn)到補(bǔ)丁函數(shù)的指令,所述原函數(shù)為需要打補(bǔ)丁的函數(shù); 所述業(yè)務(wù)VCPU刷新自身的快速指令緩沖區(qū),并通過所述主VCPU通知除最后一個 刷新自身的快速指令緩沖區(qū)的業(yè)務(wù)VCPU以外的其它業(yè)務(wù)VCPU刷新自身的快速指令緩沖 區(qū),以使所述業(yè)務(wù)VCPU自身的快速指令緩沖區(qū)中指令與所述共享內(nèi)存中指令同步更新。
本發(fā)明實(shí)施例提供一種為共享代碼段打補(bǔ)丁的裝置,包括 第三修改模塊,用于為原函數(shù)打補(bǔ)丁前,在共享內(nèi)存中,將原函數(shù)的第一條指令修 改為跳轉(zhuǎn)到異常處理的指令,所述原函數(shù)為需要打補(bǔ)丁的函數(shù);
第一消息發(fā)送模塊,用于所述第三修改模塊在共享內(nèi)存中,將原函數(shù)的第一條指 令修改為跳轉(zhuǎn)到異常處理的指令后,向各業(yè)務(wù)VCPU發(fā)送第一補(bǔ)丁激活消息,所述第一補(bǔ)丁 激活消息用于指示所述業(yè)務(wù)VCPU在處理完當(dāng)前業(yè)務(wù)后刷新自身的快速指令緩沖區(qū),以使 所述業(yè)務(wù)VCPU自身的快速指令緩沖區(qū)中指令與所述共享內(nèi)存中指令同步更新;指示最后 一個刷新自身的快速指令緩沖區(qū)的VCPU,在刷新自身的快速指令緩沖區(qū)之前,在共享內(nèi)存 中修改所述原函數(shù)的第一條指令和第二條指令。 本發(fā)明實(shí)施例提供一種為共享代碼段打補(bǔ)丁的裝置,包括 第一接收模塊,用于業(yè)務(wù)VCPU接收主VCPU發(fā)送的第一補(bǔ)丁激活消息; 判斷模塊,用于判斷所述業(yè)務(wù)VCPU是否是最后一個刷新自身的快速指令緩沖區(qū)
的業(yè)務(wù)VCPU ; 第二補(bǔ)丁模塊,用于在所述判斷模塊判斷出所述業(yè)務(wù)VCPU是最后一個刷新自身 的快速指令緩沖區(qū)的業(yè)務(wù)VCPU時,根據(jù)所述第一補(bǔ)丁激活消息的指示,在共享內(nèi)存中將原 函數(shù)的第一條指令和第二條指令修改為所述跳轉(zhuǎn)到補(bǔ)丁函數(shù)的指令,所述原函數(shù)為需要打 補(bǔ)丁的函數(shù); 第一刷新通知模塊,用于在所述第二補(bǔ)丁模塊在共享內(nèi)存中將原函數(shù)的第一條指 令和第二條指令修改為所述跳轉(zhuǎn)到補(bǔ)丁函數(shù)的指令后,刷新所述業(yè)務(wù)VCPU的快速指令緩 沖區(qū),并通過所述主VCPU通知除最后一個刷新自身的快速指令緩沖區(qū)的業(yè)務(wù)VCPU以外的 其它業(yè)務(wù)VCPU刷新自身的快速指令緩沖區(qū),以使所述業(yè)務(wù)VCPU自身的快速指令緩沖區(qū)中 指令與所述共享內(nèi)存中指令同步更新。 本發(fā)明實(shí)施例為共享代碼段打補(bǔ)丁的方法及裝置,在多核處理器系統(tǒng)運(yùn)行過程 中,主VCPU將原函數(shù)的第一條指令修改為跳轉(zhuǎn)到異常處理的指令后,向業(yè)務(wù)VCPU發(fā)送補(bǔ)丁 激活消息,使業(yè)務(wù)VCPU處理完當(dāng)前業(yè)務(wù)后刷新快速指令緩沖區(qū)。最后一個刷新快速指令緩 沖區(qū)的業(yè)務(wù)VCPU對原函數(shù)進(jìn)行打補(bǔ)丁的操作后,通知其它業(yè)務(wù)VCPU刷新各自的快速指令 緩沖區(qū)。在最后一個業(yè)務(wù)VCPU對原函數(shù)進(jìn)行打補(bǔ)丁操作時,其它業(yè)務(wù)VCPU若執(zhí)行到原函
數(shù),則從原函數(shù)的第一條指令則進(jìn)入異常處理,再從異常處理中跳轉(zhuǎn)到補(bǔ)丁函數(shù)的首地址
執(zhí)行補(bǔ)丁函數(shù)中的指令。從而,最后一個業(yè)務(wù)VCPU對原函數(shù)進(jìn)行補(bǔ)丁操作時,不影響其它 業(yè)務(wù)VCPU的正常業(yè)務(wù)處理,不會造成業(yè)務(wù)阻塞和丟失。
為了更清楚地說明本發(fā)明實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對實(shí)施例或現(xiàn) 有技術(shù)描述中所需要使用的附圖作一簡單地介紹,顯而易見地,下面描述中的附圖是本發(fā) 明的一些實(shí)施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動性的前提下,還可以 根據(jù)這些附圖獲得其他的附圖。 圖la為本發(fā)明第一實(shí)施例提供的為共享代碼段打補(bǔ)丁的方法流程圖; 圖lb為本發(fā)明第一實(shí)施例提供的為共享代碼段打補(bǔ)丁的方法中補(bǔ)丁執(zhí)行流程
圖; 圖2為本發(fā)明第二實(shí)施例提供的為共享代碼段打補(bǔ)丁的方法流程圖;
圖3a為本發(fā)明第三實(shí)施例提供的為共享代碼段打補(bǔ)丁的方法流程圖;
圖3b為本發(fā)明第三實(shí)施例提供的為共享代碼段打補(bǔ)丁的方法的信令交互10
圖4a為本發(fā)明第四實(shí)施例提供的為共享代碼段打補(bǔ)丁的方法流程圖; 圖4b為本發(fā)明第四實(shí)施例提供的為共享代碼段打補(bǔ)丁的方法的信令交互圖; 圖5為本發(fā)明第五實(shí)施例提供的為共享代碼段打補(bǔ)丁的方法流程圖; 圖6為本發(fā)明第六實(shí)施例提供的為共享代碼段打補(bǔ)丁的方法流程圖; 圖7a為本發(fā)明第七實(shí)施例提供的一種為共享代碼段打補(bǔ)丁的方法流程圖; 圖7b為本發(fā)明第七實(shí)施例提供的另一種為共享代碼段打補(bǔ)丁的方法流程圖; 圖7c為本發(fā)明第七實(shí)施例提供的另一種為共享代碼段打補(bǔ)丁的方法的信令交互 圖; 圖8a為本發(fā)明第八實(shí)施例提供的為共享代碼段打補(bǔ)丁的方法流程圖; 圖8b為本發(fā)明第八實(shí)施例提供的為共享代碼段打補(bǔ)丁的方法的信令交互圖; 圖9為本發(fā)明第九實(shí)施例提供的為共享代碼段打補(bǔ)丁的裝置結(jié)構(gòu)示意圖; 圖10為本發(fā)明第十實(shí)施例提供的為共享代碼段打補(bǔ)丁的裝置結(jié)構(gòu)示意圖; 圖lla為本發(fā)明第十一實(shí)施例提供的一種為共享代碼段打補(bǔ)丁的裝置結(jié)構(gòu)示意 圖; 圖lib為本發(fā)明第十一實(shí)施例提供的另一種為共享代碼段打補(bǔ)丁的裝置結(jié)構(gòu)示 意圖; 圖12為本發(fā)明第十二實(shí)施例提供的為共享代碼段打補(bǔ)丁的裝置結(jié)構(gòu)示意圖; 圖13為本發(fā)明第十三實(shí)施例提供的為共享代碼段打補(bǔ)丁的裝置結(jié)構(gòu)示意圖; 圖14為本發(fā)明第十四實(shí)施例提供的為共享代碼段打補(bǔ)丁的裝置結(jié)構(gòu)示意圖; 圖15為本發(fā)明第十五實(shí)施例提供的為共享代碼段打補(bǔ)丁的裝置結(jié)構(gòu)示意圖; 圖16為本發(fā)明第十六實(shí)施例提供的為共享代碼段打補(bǔ)丁的裝置結(jié)構(gòu)示意圖。
具體實(shí)施例方式
為使本發(fā)明實(shí)施例的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面將結(jié)合本發(fā)明實(shí)施例
中的附圖,對本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例是
本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員
在沒有作出創(chuàng)造性勞動前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。 運(yùn)行于嵌入式操作系統(tǒng)的VCPU稱為主VPCU,用于管理系統(tǒng)的公共資源,并對業(yè)務(wù)
VCPU進(jìn)行管理監(jiān)控。業(yè)務(wù)VCPU運(yùn)行單任務(wù)的操作系統(tǒng),完成高效的用戶數(shù)據(jù)處理。本技術(shù)
方案適用于非對稱處理器AMP (asymmetric multi-processing)結(jié)構(gòu),每一個VCPU上必須
運(yùn)行單獨(dú)的操作系統(tǒng)。在VCPU上運(yùn)行的映像可以獨(dú)享代碼段,也可以共享代碼段。 以MIPS(Microc卿uter without interlocked pipeline stages)處理器為例,
說明在多核處理器環(huán)境下的補(bǔ)丁原理。由于MIPS使用了流水線技術(shù),執(zhí)行指令跳轉(zhuǎn)時存在
延遲槽,也就是說實(shí)際執(zhí)行時會先執(zhí)行延遲槽,再執(zhí)行跳轉(zhuǎn)指令。所以必須同時修改兩條指
令,即使用空指令NOP作為延遲槽指令以及修改跳轉(zhuǎn)指令,才能實(shí)現(xiàn)打補(bǔ)丁操作。 由于需要修改兩條指令才能進(jìn)行補(bǔ)丁操作,所以在多核處理器的共享代碼段情況
下,不僅需要考慮指令的修改,而且還需要考慮修改指令的時機(jī)以及補(bǔ)丁立即生效問題。因
為,在多核處理器中有多個VCPU共同訪問相同的代碼段,如果某VCPU已經(jīng)執(zhí)行到了第一條
指令,而另外一個VCPU此時正在修改指令,就會造成第一個VCPU指令異常,從而造成系統(tǒng)崩潰。 本發(fā)明實(shí)施例分別通過將中斷與異常處理相結(jié)合的方式,以及消息與異常處理相
結(jié)合的方式,使補(bǔ)丁快速生效,并且不會影響各業(yè)務(wù)VCPU的正常業(yè)務(wù)處理。以下實(shí)施例中,
第一實(shí)施例至第四實(shí)施例是,通過中斷與異常相結(jié)合的方式,在多核處理器系統(tǒng)運(yùn)行中為
共享代碼段打補(bǔ)丁的方法;其中,第一實(shí)施例與第二實(shí)施例從主VCPU角度說明打補(bǔ)丁操作
的過程,第三實(shí)施例與第四實(shí)施例從各業(yè)務(wù)VCPU角度說明打補(bǔ)丁操作的過程。另外,第五
實(shí)施例至第八實(shí)施例是,通過消息與異常相結(jié)合的方式,在多核處理器系統(tǒng)運(yùn)行中為共享
代碼段打補(bǔ)丁的方法;其中,第五實(shí)施例與第六實(shí)施例從主VCPU角度說明打補(bǔ)丁操作的過
程,第七實(shí)施例與第八實(shí)施例從各業(yè)務(wù)VCPU角度說明打補(bǔ)丁操作的過程。 需要說明的是以下實(shí)施例中的原函數(shù),即為需要打補(bǔ)丁的函數(shù),補(bǔ)丁函數(shù)即為替
換原函數(shù)的函數(shù)。 圖la為本發(fā)明第一實(shí)施例提供的為共享代碼段打補(bǔ)丁的方法流程圖,本實(shí)施例 從主VCPU角度說明打補(bǔ)丁操作的過程,如圖1所示,本實(shí)施例包括 步驟11 :為原函數(shù)打補(bǔ)丁前,在共享內(nèi)存中將原函數(shù)的第一條指令修改為跳轉(zhuǎn)到 異常處理的指令; 在多核處理器系統(tǒng)運(yùn)行過程中,主VCPU將原函數(shù)的第一條指令修改為跳轉(zhuǎn)到異
常處理的指令,其目的是在后續(xù)修改原函數(shù)過程中,若各業(yè)務(wù)VCPU執(zhí)行到原函數(shù),各業(yè)
務(wù)VCPU根據(jù)跳轉(zhuǎn)到異常處理的指令進(jìn)入異常處理。其中,跳轉(zhuǎn)到異常處理的指令可為
break.;原函數(shù)為需要打補(bǔ)丁的共享函數(shù)。
步驟12 :向各業(yè)務(wù)VCPU發(fā)送第一中斷消息; 中斷消息的特點(diǎn)是,各業(yè)務(wù)VCPU接收到主VCPU以送的中斷消息后,立即停止當(dāng)前 下在執(zhí)行的業(yè)務(wù),處理中斷消息。主VCPU向各業(yè)務(wù)VCPU發(fā)送第一中斷信息,其目的是指示 各業(yè)務(wù)VCPU在接收到第一中斷信息后,中斷當(dāng)前業(yè)務(wù)立即刷新自身的快速指令緩沖區(qū)。從 而使各業(yè)務(wù)VCPU自身的快速指令緩沖區(qū)中指令與共享內(nèi)存中指令同步更新。由于快速指 令緩沖區(qū)的存取速度高于內(nèi)存的存取速度,因此,業(yè)務(wù)VCPU在執(zhí)行代碼段時,通常會將經(jīng) 常使用的代碼段從共享內(nèi)存中調(diào)入自身的快速指令緩沖區(qū)中,當(dāng)使用到這些代碼段時,直 接從快速指令緩沖中讀取,從而提高存取代碼速度。 若某個業(yè)務(wù)VCPU接收到第一中斷信息后,已將原函數(shù)的第一條指令從共享內(nèi)存 中調(diào)到自身的快速指令緩沖區(qū),刷新自身的快速指令緩沖區(qū)后,其快速指令緩沖區(qū)中該原 函數(shù)的第一條指令則更新為共享內(nèi)存中該原函數(shù)的第一條指令,即跳轉(zhuǎn)到異常處理的指 令。 若某個業(yè)務(wù)VCPU接收到第一中斷信息后,還沒將原函數(shù)的第一條指令從共享內(nèi) 存中調(diào)到自身的快速指令緩沖區(qū),刷新自身的快速指令緩沖區(qū)后,其快速指令緩沖區(qū)中指 令仍為原有指令。 步驟13 :在共享內(nèi)存中,將原函數(shù)的第一條指令和第二條指令修改為跳轉(zhuǎn)到補(bǔ)丁 函數(shù)的指令; 修改原函數(shù)的第一條指令和第二條指令,即為原函數(shù)打補(bǔ)丁操作。主VCPU在共享 內(nèi)存修改原函數(shù)的第一條指令和第二條指令后,使執(zhí)行到原函數(shù)的各業(yè)務(wù)VCPU,從原函數(shù) 的第一條指令跳轉(zhuǎn)到補(bǔ)丁函數(shù)中,從而實(shí)現(xiàn)了對原函數(shù)的修改。其中,補(bǔ)丁函數(shù)為替換原函數(shù)的函數(shù)。
修改原函數(shù)的方法具體可為先將原函數(shù)的第二條指令修改為延遲槽指令,即
NOP ;再將原函數(shù)的第一條指令修改為跳轉(zhuǎn)到補(bǔ)丁函數(shù)的指令,即JMP補(bǔ)丁函數(shù)首地址。 若主VCPU先修改原函數(shù)的第一條指令,后修改原函數(shù)的第二條指令。在主VCPU
將原函數(shù)的第一條指令從進(jìn)入異常處理指令修改為跳轉(zhuǎn)指令后,還沒未將原函數(shù)第二條指
令修改為延遲槽指令的情況下,此時執(zhí)行到原函數(shù)第一條指令的業(yè)務(wù)VCPU,會因?yàn)榈诙l
指令不是延遲槽指令,無法跳轉(zhuǎn)到補(bǔ)丁函數(shù)中執(zhí)行,則會導(dǎo)致系統(tǒng)崩潰。 因此,本實(shí)施例中先將主VCPU修改先將原函數(shù)的第二條指令為延遲槽指令,后修
改原函數(shù)的第一條指令為跳轉(zhuǎn)指令。此時若業(yè)務(wù)VCPU執(zhí)行到原函數(shù)到第一條指令,由于此
時原函數(shù)的第一條指令還是進(jìn)入異常處理指令(例如,break),業(yè)務(wù)VCPU則通過第一條指
令進(jìn)入異常處理,而不會再繼續(xù)執(zhí)行原函數(shù)的第二條指令。從而,本實(shí)施例避免了延遲槽指
令對共享原函數(shù)打補(bǔ)丁的影響。 圖lb為本發(fā)明第一實(shí)施例提供的為共享代碼段打補(bǔ)丁的方法中補(bǔ)丁執(zhí)行流程 圖。如圖lb所示,為原函數(shù)打完補(bǔ)丁后,在多核處理器系統(tǒng)運(yùn)行過程中,業(yè)務(wù)VCPU執(zhí)行到 調(diào)用函數(shù)中跳轉(zhuǎn)到原函數(shù)的指令時,由調(diào)用函數(shù)跳轉(zhuǎn)到原函數(shù)的第一條指令開始執(zhí)行。此 時,由于原函數(shù)的第一條指令為跳轉(zhuǎn)到補(bǔ)丁函數(shù)的指令,第二條指令為延遲槽指令,則業(yè)務(wù) VCPU從原函數(shù)跳轉(zhuǎn)到補(bǔ)丁函數(shù)中執(zhí)行。執(zhí)行到補(bǔ)丁函數(shù)的末尾時再返回到調(diào)用函數(shù)A中, 繼續(xù)執(zhí)行調(diào)用函數(shù)A中的指令,從而達(dá)到了為原函數(shù)打補(bǔ)丁的目的。
步驟14 :向各業(yè)務(wù)VCPU發(fā)送第二中斷信息; 第二中斷信息用于指示業(yè)務(wù)VCPU,中斷當(dāng)前業(yè)務(wù)立即刷新各自的快速指令緩沖
區(qū),各業(yè)務(wù)VCPU自身的快速指令緩沖區(qū)中指令與共享內(nèi)存中指令同步更新。 在主VCPU在共享內(nèi)存修改原函數(shù)的第一條指令和第二條指令時,某個業(yè)務(wù)VCPU
已將原函數(shù)的第一條指令和第二條指令,從共享內(nèi)存中調(diào)入自身的快速指令緩沖區(qū),其刷
新自身的快速指令緩沖區(qū)后,則會將自身的快速緩沖區(qū)中該原函數(shù)的第一條指令和第二條
指令,更新為主VCPU修改后的原函數(shù)的第一條指令和第二條指令。 本實(shí)施例,在多核處理器系統(tǒng)運(yùn)行過程中,在主VCPU對原函數(shù)進(jìn)行打補(bǔ)丁操作之 前,將原函數(shù)的第一條指令先修改為跳轉(zhuǎn)到異常處理的指令,并向業(yè)務(wù)VCPU發(fā)送中斷信 息,使業(yè)務(wù)VCPU立即刷新快速指令緩沖區(qū)。由于,本發(fā)明實(shí)施例中業(yè)務(wù)VCPU接收到主CPU 發(fā)送的中斷信息后,不需要向主VCPU發(fā)送響應(yīng)消息;并且主CPU向業(yè)務(wù)VCPU發(fā)送中斷信息 后,即可對原函數(shù)進(jìn)行打補(bǔ)丁操作,因此,本發(fā)明實(shí)施例能使補(bǔ)丁快速生效。另外,在主VCPU 對原函數(shù)打補(bǔ)丁操作時,若業(yè)務(wù)VCPU執(zhí)行到原函數(shù)的第一條指令時,通過上述跳轉(zhuǎn)到異常 處理的指令進(jìn)入異常處理,再從異常處理進(jìn)入補(bǔ)丁函數(shù),從而能保證主VCPU對原函數(shù)進(jìn)行
正常的打補(bǔ)丁操作,同時避免了延遲指令對為共享原函數(shù)打補(bǔ)丁的影響。因此本發(fā)明實(shí)施
例為共享代碼段打補(bǔ)丁的方法,在主VCPU對原函數(shù)打補(bǔ)丁操作時,不會影響到該業(yè)務(wù)VCPU 的正常業(yè)務(wù)處理,還能使執(zhí)行到原函數(shù)的業(yè)務(wù)VCPU從原函數(shù)跳轉(zhuǎn)到補(bǔ)丁函數(shù)中執(zhí)行,并且
不會導(dǎo)致業(yè)務(wù)阻塞和業(yè)務(wù)數(shù)據(jù)丟失。 圖2為本發(fā)明第二實(shí)施例提供的為共享代碼段打補(bǔ)丁的方法的流程圖。若在圖1 對應(yīng)的實(shí)施例中,主VCPU在步驟13中對原函數(shù)的第一條指令和第二條指令有誤,并已執(zhí)行 過步驟14 :向各業(yè)務(wù)VCPU發(fā)送第二中斷消息,則主VCPU通過本實(shí)施例中方法,將原函數(shù)的第一條指令和第二條指令恢復(fù)為原函數(shù)原有指令。在主VCPU恢復(fù)原函數(shù)的第一條指令和 第二條指令的過程中,與圖1對應(yīng)的實(shí)施例方法類似,不會的影響到各業(yè)務(wù)VCPU的正常業(yè) 務(wù)處理,并且還能使執(zhí)行到原函數(shù)第一條指令的業(yè)務(wù)VCPU,通過異常處理進(jìn)入補(bǔ)丁數(shù)中執(zhí) 行。具體地,如圖2所示,本實(shí)施例包括 步驟21 :恢復(fù)原函數(shù)的第一條指令和第二條指令前,在共享內(nèi)存中將原函數(shù)的第
一條指令修改為跳轉(zhuǎn)到異常處理的指令; 其中,跳轉(zhuǎn)到異常處理的指令,可為break。
步驟22 :向各業(yè)務(wù)VCPU發(fā)送第三中斷消息; 第三中斷信息用于指示各業(yè)務(wù)VCPU,中斷當(dāng)前業(yè)務(wù)立即刷新自身的快速指令緩沖 區(qū),以使各業(yè)務(wù)VCPU自身的快速指令緩沖區(qū)中指令與共享內(nèi)存中指令同步更新;
步驟23 :在共享內(nèi)存中,將原函數(shù)的第一條指令和第二條指令,恢復(fù)成對原函數(shù) 修改前的指令; 在步驟23中,主VCPU將原函數(shù)的第一條指令和第二條指令,恢復(fù)成為原函數(shù)打補(bǔ)
丁之前的指令,即對原函數(shù)修改前的指令。
步驟24 :向各業(yè)務(wù)VCPU發(fā)送第四中斷信息; 第四中斷信息用于指示業(yè)務(wù)VCPU,中斷當(dāng)前業(yè)務(wù)立即刷新各自的快速指令緩沖 區(qū),以使各業(yè)務(wù)VCPU自身的快速指令緩沖區(qū)中指令與共享內(nèi)存中指令同步更新。
本實(shí)施例在主VCPU恢復(fù)原函數(shù)的第一條指令和第二條指令之前,將原函數(shù)的第 一條指令先修改為跳轉(zhuǎn)到異常處理的指令,并向業(yè)務(wù)VCPU發(fā)送中斷信息,使業(yè)務(wù)VCPU立即 刷新快速指令緩沖區(qū)。在主VCPU恢復(fù)原函數(shù)的第一條指令和第二條指令時,若業(yè)務(wù)VCPU 執(zhí)行到原函數(shù)則通過跳轉(zhuǎn)到異常處理的指令進(jìn)入異常處理,再從異常處理跳轉(zhuǎn)到補(bǔ)丁函數(shù) 的首地址處,開始執(zhí)行補(bǔ)丁函數(shù)中的指令,以保證主VCPU對原函數(shù)進(jìn)行修改時。由于,在主 VCPU對原函數(shù)打補(bǔ)丁操作時,若業(yè)務(wù)VCPU執(zhí)行到原函數(shù)則從異常處理進(jìn)入補(bǔ)丁函數(shù),因此 本發(fā)明為共享代碼段打補(bǔ)丁的方法,在主VCPU對原函數(shù)打補(bǔ)丁操作時,不影響業(yè)務(wù)VCPU的
正常業(yè)務(wù)處理,不會造成業(yè)務(wù)阻塞和數(shù)據(jù)丟失。 圖3a為本發(fā)明第三實(shí)施例提供的為共享代碼段打補(bǔ)丁的方法的流程圖。圖3b為 本發(fā)明第三實(shí)施例提供的為共享代碼段打補(bǔ)丁的方法的信令交互圖。本實(shí)施例結(jié)合圖l所 示實(shí)施例中主VCPU的動作,主要從業(yè)務(wù)VCPU角度說明打補(bǔ)丁操作的過程。請參見圖3a和 圖3b,本實(shí)施例包括 步驟31 :接收到主VCPU發(fā)送的第一中斷信息后,根據(jù)第一中斷信息的指示,中斷 當(dāng)前業(yè)務(wù)立即刷新快速指令緩沖區(qū); 各業(yè)務(wù)VCPU中斷當(dāng)前業(yè)務(wù),立即刷新自身快速指令緩沖區(qū)的目的是,使自身的快 速指令緩沖區(qū)中指令與共享內(nèi)存中指令同步更新,以保證自身的快速指令緩沖區(qū)中指令與 共享內(nèi)存中相應(yīng)指令保持一致。 步驟32 :執(zhí)行到原函數(shù)的第一條指令時,根據(jù)原函數(shù)的第一條指令,進(jìn)入異常處 理; 若某個業(yè)務(wù)VCPU接收到第一中斷信息時,已將原函數(shù)的第一條指令從共享內(nèi)存 中調(diào)到自身的快速指令緩沖區(qū),刷新自身的快速指令緩沖區(qū)后,其快速指令緩沖區(qū)中該原 函數(shù)的第一條指令則更新為共享內(nèi)存中該原函數(shù)的第一條指令,即跳轉(zhuǎn)到異常處理的指令。在還沒有接收到主VCPU發(fā)送的第二中斷信息時,即在自身的快速指令緩沖區(qū)中該原函 數(shù)的第一條指令還沒有更新之前,當(dāng)該業(yè)務(wù)VCPU執(zhí)行到第一條指令時,根據(jù)跳轉(zhuǎn)到異常處 理的指令,進(jìn)入到異常處理。 若某個業(yè)務(wù)VCPU接收到第一中斷信息時,還沒將原函數(shù)的第一條指令從共享內(nèi) 存中調(diào)到自身的快速指令緩沖區(qū),刷新自身的快速指令緩沖區(qū)后,其快速指令緩沖區(qū)中指 令仍為原有指令。當(dāng)后續(xù)該業(yè)務(wù)VCPU將該原函數(shù)的第一條指令調(diào)入快速緩沖區(qū)中,在還沒 有接收到主VCPU發(fā)送的第二中斷信息時,若執(zhí)行到了該原函數(shù)的第一條指令,由于此時第 一條指令為跳轉(zhuǎn)到異常處理的指令,該業(yè)務(wù)VCPU則根據(jù)跳轉(zhuǎn)到異常處理的指令進(jìn)入異常處理。 步驟33 :在異常處理中,根據(jù)需要打補(bǔ)丁的原函數(shù)的首地址,在補(bǔ)丁區(qū)查找補(bǔ)丁 函數(shù)的首地址; 補(bǔ)丁區(qū)存儲有原函數(shù)的首地址、補(bǔ)丁函數(shù)的首地址、原函數(shù)與補(bǔ)丁函數(shù)的映射關(guān) 系,以及原函數(shù)的前兩條指令等信息。 步驟34 :根據(jù)補(bǔ)丁函數(shù)的首地址,從異常處理跳轉(zhuǎn)到補(bǔ)丁函數(shù)中執(zhí)行。 業(yè)務(wù)VCPU根據(jù)原函數(shù)的首地址在補(bǔ)丁區(qū)查找到對應(yīng)補(bǔ)丁函數(shù)的首地址。查找到
對應(yīng)補(bǔ)丁函數(shù)的首地址后,將異常處理的返回地址修改為補(bǔ)丁函數(shù)的首地址,然后從異常
處理進(jìn)入到補(bǔ)丁函數(shù),執(zhí)行補(bǔ)丁函數(shù)中指令。因此,在業(yè)務(wù)VCPU還沒有接收到主VPCU發(fā)送
的第二中斷消息之前,即主VCPU對原函數(shù)的補(bǔ)丁操作還沒生效之前,若業(yè)務(wù)VCPU執(zhí)行了該
原函數(shù)的第一條指令,則會從異常處理中進(jìn)入到補(bǔ)丁函數(shù)進(jìn)行執(zhí)行。從而不僅沒有影響到
以業(yè)務(wù)VCPU的正常業(yè)務(wù)處理,而且還能使該業(yè)務(wù)VCPU執(zhí)行補(bǔ)丁函數(shù)的中指令。 步驟35 :在根據(jù)第一中斷信息的指示,中斷當(dāng)前業(yè)務(wù),刷新快速指令緩沖區(qū)之后,
接收主VCPU發(fā)送的第二中斷信息,根據(jù)第二中斷信息的指示,中斷當(dāng)前業(yè)務(wù)立即刷新自身
的快速指令緩沖區(qū)。 業(yè)務(wù)VCPU刷新自身的快速指令緩沖區(qū),會使業(yè)務(wù)VCPU自身的快速指令緩沖區(qū)中 指令與共享內(nèi)存中指令同步更新。 在根據(jù)第一中斷信息的指示,中斷當(dāng)前業(yè)務(wù),刷新快速指令緩沖區(qū)之后,業(yè)務(wù)VCPU 接收到主VCPU發(fā)送的第二中斷信息時,說明主VCPU在共享內(nèi)存中已對原函數(shù)的前兩條 指令進(jìn)行了修改,若此時自身的快速指令緩沖區(qū)存儲有該原函數(shù)的第一條指令和第二條指 令,則刷新快速指令緩沖區(qū)后,該原函數(shù)的第一條指令和第二條指令,則更新為主VCPU修 改后的指令,即第一條為Jump,第二條為Nop。更新后,在該業(yè)務(wù)VCPU執(zhí)行到該原函數(shù)的第 一條指令時,則從原函數(shù)直接跳轉(zhuǎn)到補(bǔ)丁函數(shù)中執(zhí)行,從而實(shí)現(xiàn)了對原函數(shù)的打補(bǔ)丁操作。
本實(shí)施例,在多核處理器系統(tǒng)運(yùn)行過程中,各業(yè)務(wù)VCPU接收到主CPU發(fā)送的第一 中斷信息后,立即刷新各自的快速指令緩沖區(qū)。在業(yè)務(wù)VCPU執(zhí)行到原函數(shù)的第一條指令 時,且沒有接收到主VCPU發(fā)送的第二中斷信息之前,根據(jù)跳轉(zhuǎn)到異常處理的指令跳轉(zhuǎn)到異 常處理中,然后從異常處理中進(jìn)入補(bǔ)丁函數(shù)中,開始執(zhí)行補(bǔ)丁函數(shù)。因此本發(fā)明實(shí)施例為共 享代碼段打補(bǔ)丁的方法,在主VCPU對原函數(shù)打補(bǔ)丁操作時,不會影響到該業(yè)務(wù)VCPU的正常 業(yè)務(wù)處理,還能使執(zhí)行到原函數(shù)的業(yè)務(wù)VCPU從原函數(shù)跳轉(zhuǎn)到補(bǔ)丁函數(shù)中執(zhí)行。
圖4a為本發(fā)明第四實(shí)施例提供的為共享代碼段打補(bǔ)丁的方法的流程圖。業(yè)務(wù) VCPU在圖3a對應(yīng)的實(shí)施例中接收到主VCPU發(fā)送的第二中斷信息,并根據(jù)對各自的快速指
15令緩沖區(qū)刷新的后,還有可能會接收到主VCPU發(fā)送的第三中斷信息。圖4b為本發(fā)明第四 實(shí)施例提供的為共享代碼段打補(bǔ)丁的方法信令交互圖。本實(shí)施例結(jié)合圖1、圖2對應(yīng)實(shí)施例 中主VCPU的執(zhí)行流程,主要從業(yè)務(wù)VCPU角度來說明業(yè)務(wù)VCPU在接收到主VCPU發(fā)送的第 三中斷信息后的執(zhí)行流程。如圖4a和圖4b所示,本實(shí)施例包括 步驟41 :接收主VCPU發(fā)送的第三中斷信息后,根據(jù)第三中斷信息的指示,中斷當(dāng) 前業(yè)務(wù)立即刷新快速指令緩沖區(qū); 業(yè)務(wù)VCPU接收到主VCPU發(fā)送的第三中斷信息,說明主VCPU對原函數(shù)已進(jìn)行了修 改。各業(yè)務(wù)VCPU立即刷新自身的快速指令緩沖區(qū),使自身的快速指令緩沖區(qū)中指令與共享 內(nèi)存中指令同步更新。 步驟42 :執(zhí)行到原函數(shù)的第一條指令時,根據(jù)原函數(shù)的第一條指令,進(jìn)入異常處 理; 主VCPU向各業(yè)務(wù)VCPU發(fā)送第三中斷信息后,對原函數(shù)的第一條指令和第二條指
令進(jìn)行恢復(fù)操作,使其恢復(fù)為原函數(shù)中原有的第一條指令和第二條指令。在此過程中,與圖
3對應(yīng)的實(shí)施例類似,若此時業(yè)務(wù)VCPU執(zhí)行到原函數(shù)的第一條指令,則通過跳轉(zhuǎn)到異常處
理的指令進(jìn)入異常處理。因此,不會影響到業(yè)務(wù)VCPU的正常業(yè)務(wù)處理。 步驟43 :在異常處理中,根據(jù)需要打補(bǔ)丁的原函數(shù)的首地址,在補(bǔ)丁區(qū)查找補(bǔ)丁
函數(shù)的首地址;補(bǔ)丁函數(shù)為替換原函數(shù)的函數(shù); 步驟44 :根據(jù)補(bǔ)丁函數(shù)的首地址,從異常處理返回到補(bǔ)丁函數(shù)中執(zhí)行。 步驟45 :在根據(jù)第三中斷信息的指示,中斷當(dāng)前業(yè)務(wù),刷新快速指令緩沖區(qū)之后,
接收主VCPU發(fā)送的第四中斷信息,根據(jù)第二中斷信息的指示,中斷當(dāng)前業(yè)務(wù)立即刷新自身
的快速指令緩沖區(qū)。 業(yè)務(wù)VCPU刷新自身的快速指令緩沖區(qū),會使業(yè)務(wù)VCPU自身的快速指令緩沖區(qū)中 指令與共享內(nèi)存中指令同步更新。 在根據(jù)第三中斷信息的指示,中斷當(dāng)前業(yè)務(wù)立即刷新自身的快速指令緩沖區(qū)之 后,業(yè)務(wù)VCPU接收主VCPU發(fā)送的第四中斷信息。 本實(shí)施例在多核處理器系統(tǒng)運(yùn)行過程中,若主VCPU需要恢復(fù)之前對原函數(shù)第一 條指令和第二條指令的修改,事先將原函數(shù)的第一條指令修改為跳轉(zhuǎn)到異常處理的指令, 然后向各業(yè)務(wù)VCPU發(fā)第三中斷信息,使各VCPU刷新各自的指令緩沖區(qū)。主VCPU發(fā)送第三 中斷消息后,開始對原函數(shù)的前兩條指令進(jìn)行恢復(fù)操作,在此階段,若業(yè)務(wù)VCPU執(zhí)行到原 函數(shù)的第一條指令,則會通過跳轉(zhuǎn)到異常處理指令進(jìn)入補(bǔ)丁函數(shù)。因此本發(fā)明實(shí)施例為共 享代碼段打補(bǔ)丁的方法,在主VCPU對原函數(shù)進(jìn)行恢復(fù)操作時,不會影響到該業(yè)務(wù)VCPU的正 常業(yè)務(wù)處理,還能使執(zhí)行到原函數(shù)的業(yè)務(wù)VCPU從原函數(shù)跳轉(zhuǎn)到補(bǔ)丁函數(shù)中執(zhí)行。
圖5為本發(fā)明第五實(shí)施例提供的為共享代碼段打補(bǔ)丁的方法流程圖,本實(shí)施例從 主VCPU角度說明打補(bǔ)丁操作的過程,如圖5所示,本實(shí)施例包括 步驟51 :為原函數(shù)打補(bǔ)丁前,在共享內(nèi)存中,將原函數(shù)的第一條指令修改為跳轉(zhuǎn) 到異常處理的指令; 在多核處理器系統(tǒng)運(yùn)行過程中,主VCPU將原函數(shù)的第一條指令修改為跳轉(zhuǎn)到異 常處理的指令,其目的是在后續(xù)最后一個VCPU修改原函數(shù)過程中,若其它業(yè)務(wù)VCPU執(zhí)行到 原函數(shù),該業(yè)務(wù)VCPU根據(jù)跳轉(zhuǎn)到導(dǎo)演處理的指令進(jìn)入異常處理。其中,跳轉(zhuǎn)到異常處理的指令可為break.;原函數(shù)為需要打補(bǔ)丁的共享函數(shù)。
步驟52 :向各業(yè)務(wù)VCPU發(fā)送第一補(bǔ)丁激活消息; 第一補(bǔ)丁激活消息用于指示各業(yè)務(wù)VCPU在處理完當(dāng)前業(yè)務(wù)后刷新自身的快速指令緩沖區(qū),以使各業(yè)務(wù)VCPU自身的快速指令緩沖區(qū)中指令與共享內(nèi)存中指令同步更新;并指示最后一個刷新自身的快速指令緩沖區(qū)的業(yè)務(wù)VCPU,在共享內(nèi)存中修改原函數(shù)的第一條指令和第二條指令。 為確定出最后一個刷新自身的快速指令緩沖區(qū)的業(yè)務(wù)VCPU,主VCPU發(fā)送第一補(bǔ)丁激活消息前,會在共享內(nèi)存中保存需要接收第一補(bǔ)丁激活消息的所有業(yè)務(wù)VCPU編號。每一個業(yè)務(wù)VCPU在接收到補(bǔ)丁激活消息后且刷新自身的快速指令緩沖區(qū)之前,都會在共享內(nèi)存中記錄自己的VCPU編號,并查看共享內(nèi)存中是否已記錄有除自身之外的所有業(yè)務(wù)VCPU的編號,如果是,則表明自己是最后一個業(yè)務(wù)VCPU。 由于消息的特點(diǎn),業(yè)務(wù)VCPU接收到主VCPU發(fā)送第一補(bǔ)丁激活消息后,不立即處理該第一補(bǔ)丁激活消息。而是在處理完當(dāng)前業(yè)務(wù)后,再刷新自身的快速指令緩沖區(qū)。最后一個業(yè)務(wù)VCPU,在刷新自身的快速指令緩沖區(qū)之前,在共享內(nèi)存中修改原函數(shù)的第一條指令和第二條指令,即對原函數(shù)進(jìn)行補(bǔ)丁操作。如果修改原函數(shù)指令的業(yè)務(wù)VCPU不是最后一個刷新瞬自身的快速指令緩沖區(qū)的業(yè)務(wù)VCPU,當(dāng)該業(yè)務(wù)VCPU在共享內(nèi)存中修改原函數(shù)的第一條指令和第二指令時,若后續(xù)沒有刷新自身快速指令緩沖區(qū)的其它業(yè)務(wù)VCPU此時已執(zhí)
行到原函數(shù)的第一條指令或第二條指令,則會引起指令執(zhí)行錯誤異常因此,本發(fā)明實(shí)施例
中采用最后一個刷新自身緩沖區(qū)的VCPU,修改原函數(shù)的第一條指令和第二條指令。
業(yè)務(wù)VCPU處理完當(dāng)前業(yè)務(wù),對接收到第一補(bǔ)丁激活信息進(jìn)行處理,即刷新自身的快速指令緩沖區(qū)后,自身的快速指令緩沖區(qū)中存儲有原函數(shù)的第一條指令,則該條指令為跳轉(zhuǎn)到異常處理的指令。該業(yè)務(wù)VCPU執(zhí)行到原函數(shù)中的該指令時,進(jìn)入異常處理,再從異
常處理中進(jìn)入補(bǔ)丁函數(shù)。 本發(fā)明實(shí)施例為共享代碼段打補(bǔ)丁的方法,在多核處理器系統(tǒng)運(yùn)行過程中,主VCPU將原函數(shù)的第一條指令修改為跳轉(zhuǎn)到異常處理的指令后,向業(yè)務(wù)VCPU發(fā)送第一補(bǔ)丁激活消息,使業(yè)務(wù)VCPU處理完當(dāng)前業(yè)務(wù)后刷新快速指令緩沖區(qū)。最后一個刷新快速指令緩沖區(qū)的業(yè)務(wù)VCPU對原函數(shù)進(jìn)行打補(bǔ)丁的操作后,通知其它業(yè)務(wù)VCPU刷新各自的快速指令緩沖區(qū)。在最后一個業(yè)務(wù)VCPU對原函數(shù)進(jìn)行打補(bǔ)丁操作時,其它業(yè)務(wù)VCPU若執(zhí)行到原函
數(shù),則從原函數(shù)的第一條指令則進(jìn)入異常處理,再從異常處理中跳轉(zhuǎn)到補(bǔ)丁函數(shù)的首地址
執(zhí)行補(bǔ)丁函數(shù)中的指令。從而,最后一個業(yè)務(wù)VCPU對原函數(shù)進(jìn)行補(bǔ)丁操作時,不影響其它業(yè)務(wù)VCPU的正常業(yè)務(wù)處理,不會造成業(yè)務(wù)阻塞和丟失。 圖6為本發(fā)明第六實(shí)施例提供的為共享代碼段打補(bǔ)丁的方法的流程圖。在圖5對應(yīng)的實(shí)施例步驟52之后,若最后一個刷新自身快速指令緩沖區(qū)的業(yè)務(wù)VCPU對原函數(shù)的修改出現(xiàn)錯誤,則通過本實(shí)施例對原函數(shù)的指令進(jìn)行恢復(fù)。具體地,如圖6所示,本實(shí)施例包括 步驟61 :恢復(fù)原函數(shù)的第一條指令和第二第指令前,在共享內(nèi)存中,將原函數(shù)的
第一條指令修改為跳轉(zhuǎn)到異常處理的指令; 跳轉(zhuǎn)到異常處理的指令可為break。
步驟62 :向各業(yè)務(wù)VCPU發(fā)送第二補(bǔ)丁激活消息;
第二補(bǔ)丁激活消息用于指示各業(yè)務(wù)VCPU刷新自身的快速指令緩沖區(qū),以使各業(yè) 務(wù)VCPU自身的快速指令緩沖區(qū)中指令與共享內(nèi)存中指令同步更新;并指示各業(yè)務(wù)VCPU中 最后一個刷新自身的快速指令緩沖區(qū)的VCPU,在共享內(nèi)存中,將原函數(shù)的第一條指令和第 二條指令恢復(fù)為原有指令。 本實(shí)施例中的第二補(bǔ)丁激活消息,與圖5對應(yīng)實(shí)施列中第一補(bǔ)丁激活消息的區(qū)別 在于,第二補(bǔ)丁激活消息指示最后一個刷新自身的快速指令緩沖區(qū)的業(yè)務(wù)VCPU,在共享內(nèi) 存中,將原函數(shù)的第一條指令和第二條指令恢復(fù)為原有指令。 本實(shí)施例,在多核處理器系統(tǒng)運(yùn)行過程中,若對原函數(shù)的打補(bǔ)丁操作出現(xiàn)錯誤,需 要對原函數(shù)的指令恢復(fù)時,主VCPU先將原函數(shù)的第一條指令修改為跳轉(zhuǎn)到異常處理的指 令,并向業(yè)務(wù)VCPU發(fā)送第二補(bǔ)丁激活消息。業(yè)務(wù)VCPU處理完當(dāng)前業(yè)務(wù)后,根據(jù)第二補(bǔ)丁激 活消息刷新自身的快速指令緩沖區(qū)后,若其它業(yè)務(wù)VCPU執(zhí)行到原函數(shù)的第一條指令即跳 轉(zhuǎn)到異常處理的指令,根據(jù)跳轉(zhuǎn)到異常處理的指令進(jìn)入異常處理,再從異常處理中跳轉(zhuǎn)到 補(bǔ)丁函數(shù)的首地址執(zhí)行補(bǔ)丁函數(shù)中的指令。從而,最后一個業(yè)務(wù)VCPU對原函數(shù)進(jìn)行恢復(fù)操 作時,不影響其它業(yè)務(wù)VCPU的正常業(yè)務(wù)處理,不會造成業(yè)務(wù)阻塞和丟失。
圖7a為本發(fā)明第七實(shí)施例提供的一種為共享代碼段打補(bǔ)丁的方法的流程圖,本 實(shí)施例主要從業(yè)務(wù)VCPU角度說明打補(bǔ)丁操作的過程,如圖7a所示,本實(shí)施例包括
步驟71a :業(yè)務(wù)VCPU接收主VCPU發(fā)送的第一補(bǔ)丁激活消息;
主VCPU發(fā)送第一補(bǔ)丁激活消息的目的是,使各業(yè)務(wù)VCPU處理完當(dāng)前業(yè)務(wù)后,刷新 自身快速指令緩沖區(qū)。當(dāng)業(yè)務(wù)VCPU中的快速指令緩沖區(qū)已存儲有原函數(shù)的第一條指令,此 時刷新可以使共享內(nèi)存中修改后的原函數(shù)的第一條指令調(diào)入快速指令緩沖區(qū),從而在業(yè)務(wù) VCPU(除最后一個刷新自身快速指令緩沖區(qū)的業(yè)務(wù)VCPU之外)執(zhí)行到原函數(shù)的第一條指 令時,進(jìn)入異常處理,再從異常處理進(jìn)入補(bǔ)丁函數(shù)中執(zhí)行。如此,在最后一個業(yè)務(wù)VCPU對原 函數(shù)進(jìn)行打補(bǔ)丁操作(將第一條指令修改為Jump,第二條指令修改為Nop),不影響其它業(yè) 務(wù)VCPU的正常業(yè)務(wù)處理,而且還能使執(zhí)行到原函數(shù)的其它業(yè)務(wù)VCPU從原函數(shù)跳轉(zhuǎn)到補(bǔ)丁 函數(shù)中執(zhí)行。 步驟72a :當(dāng)業(yè)務(wù)VCPU是最后一個刷新自身的快速指令緩沖區(qū)的業(yè)務(wù)VCPU時,根 據(jù)第一補(bǔ)丁激活消息的指示,在共享內(nèi)存中將原函數(shù)的第一條指令和第二條指令修改為跳 轉(zhuǎn)到補(bǔ)丁函數(shù)的指令; 在業(yè)務(wù)VCPU處理完當(dāng)前業(yè)務(wù)后,準(zhǔn)備刷新自身的快速指令緩沖區(qū)之前,判斷出自 身是最后一個刷新自身的快速指令緩沖區(qū)的業(yè)務(wù)VCPU時。在共享內(nèi)存中將原函數(shù)的第一 條指令和第二條指令修改為跳轉(zhuǎn)到補(bǔ)丁函數(shù)的指令。 步驟73a :業(yè)務(wù)VCPU刷新自身的快速指令緩沖區(qū),并通過主VCPU通知除最后一個 刷新自身的快速指令緩沖區(qū)的業(yè)務(wù)VCPU以外的其它業(yè)務(wù)VCPU刷新自身的快速指令緩沖 區(qū)。 業(yè)務(wù)VCPU刷新自身的快速指令緩沖區(qū),會使自身的快速指令緩沖區(qū)中指令與共 享內(nèi)存中指令同步更新。 本發(fā)明實(shí)施例為共享代碼段打補(bǔ)丁的方法,在多核處理器系統(tǒng)運(yùn)行過程中,主 VCPU將原函數(shù)的第一條指令修改為跳轉(zhuǎn)到異常處理的指令后,向業(yè)務(wù)VCPU發(fā)送補(bǔ)丁激活 消息,使業(yè)務(wù)VCPU處理完當(dāng)前業(yè)務(wù)后刷新快速指令緩沖區(qū)。最后一個刷新快速指令緩沖區(qū)的業(yè)務(wù)VCPU對原函數(shù)進(jìn)行打補(bǔ)丁的操作后,通知其它業(yè)務(wù)VCPU刷新各自的快速指令緩沖區(qū)。在最后一個業(yè)務(wù)VCPU對原函數(shù)進(jìn)行打補(bǔ)丁操作時,其它業(yè)務(wù)VCPU若執(zhí)行到原函數(shù),則從原函數(shù)的第一條指令則進(jìn)入異常處理,再從異常處理中跳轉(zhuǎn)到補(bǔ)丁函數(shù)的首地址執(zhí)行補(bǔ)丁函數(shù)中的指令。從而,最后一個業(yè)務(wù)VCPU對原函數(shù)進(jìn)行補(bǔ)丁操作時,不影響其它業(yè)務(wù)VCPU的正常業(yè)務(wù)處理,不會造成業(yè)務(wù)阻塞和丟失。 圖7b為本發(fā)明第七實(shí)施例提供的另一種為共享代碼段打補(bǔ)丁的方法的流程圖,圖7c為本發(fā)明第七實(shí)施例提供的另一種為共享代碼段打補(bǔ)丁的方法的信令交互圖。本實(shí)施例結(jié)合圖5對應(yīng)實(shí)施例中主VCPU的執(zhí)行流程,主要從業(yè)務(wù)VCPU角度說明打補(bǔ)丁操作的過程,如圖7b和圖7c所示,本實(shí)施例包括 步驟71 :業(yè)務(wù)VCPU接收主VCPU發(fā)送的第一補(bǔ)丁激活消息; 步驟72 :判斷是否為最后一個刷新自身快速指令緩沖區(qū)的業(yè)務(wù)VCPU ; 為確定出最后一個刷新自身的快速指令緩沖區(qū)的業(yè)務(wù)VCPU,主VCPU發(fā)送第一補(bǔ)
丁激活消息前,會在共享內(nèi)存中保存需要接收第一補(bǔ)丁激活消息的所有業(yè)務(wù)VCPU編號。每
一個業(yè)務(wù)VCPU在接收到補(bǔ)丁激活消息后且刷新自身的快速指令緩沖區(qū)之前,都會在共享
內(nèi)存中記錄自己的VCPU編號。并根據(jù)主VCPU在共享內(nèi)存中保存的需要接收第一補(bǔ)丁激活
消息的所有業(yè)務(wù)VCPU編號,查看共享內(nèi)存中是否已記錄有除自身之外的所有業(yè)務(wù)VCPU的
編號,如果是,則表明自己是最后一個業(yè)務(wù)VCPU。 若業(yè)務(wù)VCPU在處理完當(dāng)前業(yè)務(wù),并在刷新自身快速指令緩沖區(qū)之前,判斷出自己不是最后一個刷新自身快速指令緩沖區(qū)的VCPU,則執(zhí)行步驟73至步驟76,具體如下
步驟73 :刷新自身快速指令緩沖區(qū); 步驟74:在執(zhí)行到原函數(shù)的第一條指令時,根據(jù)原函數(shù)的跳轉(zhuǎn)到異常處理的指令,進(jìn)入異常處理;沒有執(zhí)行原函數(shù)的第一條指令,表明正常處理業(yè)務(wù)。 步驟75 :在異常處理中,根據(jù)需要打補(bǔ)丁的原函數(shù)的首地址,在補(bǔ)丁區(qū)查找補(bǔ)丁函數(shù)的首地址; 步驟76 :根據(jù)補(bǔ)丁函數(shù)的首地址,從異常處理返回到補(bǔ)丁函數(shù)中執(zhí)行。 若業(yè)務(wù)VCPU在處理完當(dāng)前業(yè)務(wù),并在刷新自身快速指令緩沖區(qū)之前,判斷出自己
是最后一個刷新自身快速指令緩沖區(qū)的VCPU,則執(zhí)行步驟77至步驟78,具體如下 步驟77 :在共享內(nèi)存中將原函數(shù)的第一條指令和第二條指令修改為跳轉(zhuǎn)到補(bǔ)丁
函數(shù)的指令; 最后一個刷新自身的快速指令緩沖區(qū)的業(yè)務(wù)VCPU,具體修改原函數(shù)第一條指令和第二指令的方法可為先將原函數(shù)的第二條指令修改為延遲槽指令,即NOP ;再將原函數(shù)的第一條指令修改為跳轉(zhuǎn)到補(bǔ)丁函數(shù)的指令,即JMP補(bǔ)丁函數(shù)首地址。 步驟78 :刷新自身的快速指令緩沖區(qū),通過主VCPU通知其它各業(yè)務(wù)VCPU刷新自身的快速指令緩沖區(qū)。 最后一個刷新自身的快速指令緩沖區(qū)的業(yè)務(wù)VCPU,在修改完原函數(shù)的第一條指令和第二條指令,刷新自身的快速指令緩沖區(qū),并通過主VCPU通知其它各業(yè)務(wù)VCPU刷新自身的快速指令緩沖區(qū),以使各業(yè)務(wù)VCPU自身的快速指令緩沖區(qū)中指令與共享內(nèi)存中指令同步更新。 本發(fā)明實(shí)施例為共享代碼段打補(bǔ)丁的方法,在多核處理器系統(tǒng)運(yùn)行過程中,主VCPU將原函數(shù)的第一條指令修改為跳轉(zhuǎn)到異常處理的指令后,向業(yè)務(wù)VCPU發(fā)送補(bǔ)丁激活 消息,使業(yè)務(wù)VCPU處理完當(dāng)前業(yè)務(wù)后刷新快速指令緩沖區(qū)。最后一個刷新快速指令緩沖區(qū) 的業(yè)務(wù)VCPU對原函數(shù)進(jìn)行打補(bǔ)丁的操作后,通知其它業(yè)務(wù)VCPU刷新各自的快速指令緩沖 區(qū)。在最后一個業(yè)務(wù)VCPU對原函數(shù)進(jìn)行打補(bǔ)丁操作時,其它業(yè)務(wù)VCPU若執(zhí)行到原函數(shù),
則從原函數(shù)的第一條指令則進(jìn)入異常處理,再從異常處理中跳轉(zhuǎn)到補(bǔ)丁函數(shù)的首地址執(zhí)行
補(bǔ)丁函數(shù)中的指令。從而,最后一個業(yè)務(wù)VCPU對原函數(shù)進(jìn)行補(bǔ)丁操作時,不影響其它業(yè)務(wù) VCPU的正常業(yè)務(wù)處理,不會造成業(yè)務(wù)阻塞和丟失。 圖8a為本發(fā)明第八實(shí)施例提供的為共享代碼段打補(bǔ)丁的方法的流程圖。在圖7對 應(yīng)的實(shí)施例步驟72之后,若最后一個刷新自身快速指令緩沖區(qū)的業(yè)務(wù)VCPU對原函數(shù)的修 改出現(xiàn)錯誤,則通過本實(shí)施例對原函數(shù)的指令進(jìn)行恢復(fù)。圖8b為本發(fā)明第八實(shí)施例提供的 為共享代碼段打補(bǔ)丁的方法的信令交互圖。具體地,如圖8a和圖8b所示,本實(shí)施例包括
步驟81 :接收主VCPU發(fā)送的第二補(bǔ)丁激活消息; 主VCPU在共享內(nèi)存中將原函數(shù)的第一條指令修改為跳轉(zhuǎn)到異常處理的指令后, 向各業(yè)務(wù)VCPU發(fā)送第二補(bǔ)丁激活消息的目的是,使各業(yè)務(wù)VCPU處理完當(dāng)前業(yè)務(wù)后刷新自 身的快速指令緩沖區(qū)中指令,以使自身的快速指令緩沖區(qū)中指令與共享內(nèi)存中指令進(jìn)行同 步更新。 與圖7對應(yīng)實(shí)施列相類似,在對原函數(shù)進(jìn)行打補(bǔ)丁操作,即同時修改第一條指令 和第二條指令之前,主VCPU先將第一條指令修改為break,然后向業(yè)務(wù)VCPU發(fā)送第二補(bǔ)丁 激活消息。第二補(bǔ)丁激活消息與第一補(bǔ)丁激活消息的不同在于,指示最后一個刷新快速指 令緩沖區(qū)的業(yè)務(wù)VCPU,將原函數(shù)的第一條指令和第二條指令,恢復(fù)為對原函數(shù)修改前的指令。 步驟82 :判斷自身是否是最后一個刷新自身的快速指令緩沖區(qū)的業(yè)務(wù)VCPU ;
各業(yè)務(wù)VCPU在處理當(dāng)前業(yè)務(wù)后,在刷新自身的快速指令緩沖區(qū)之前,需判斷自身 是否是最后一個刷新自身的快速指令緩沖區(qū)的業(yè)務(wù)VCPU,以根據(jù)第一補(bǔ)丁激活消息進(jìn)行不 同的操作。若不是最后一個刷新自身的快速指令緩沖區(qū)的業(yè)務(wù)VCPU,則執(zhí)行步驟83至步驟 86 : 步驟83 :刷新自身的快速指令緩沖區(qū); 步驟84 :根據(jù)原函數(shù)的第一條指令,進(jìn)入異常處理; 業(yè)務(wù)VCPU在執(zhí)行到原函數(shù)的第一條指令時,由于其自身的快速指令緩沖區(qū)中指 令已經(jīng)過與共享內(nèi)存的同步更新,其自身的快速指令緩沖區(qū)中原函數(shù)的第一條指令為跳轉(zhuǎn) 到異常處理的指令。因此,該業(yè)務(wù)VCPU從原函數(shù)的第一條指令進(jìn)入異常處理,執(zhí)行異常處 理程序。沒有執(zhí)行原函數(shù)的第一條指令,表明正常處理業(yè)務(wù)。 步驟85 :在異常處理中,根據(jù)需要打補(bǔ)丁的原函數(shù)的首地址,在補(bǔ)丁區(qū)查找補(bǔ)丁 函數(shù)的首地址; 步驟86 :根據(jù)補(bǔ)丁函數(shù)的首地址,從異常處理返回到補(bǔ)丁函數(shù)中執(zhí)行; 若是最后一個刷新自身的快速指令緩沖區(qū)的業(yè)務(wù)VCPU,則執(zhí)行步驟87至步驟88,
具體如下 步驟87 :在共享內(nèi)存中恢復(fù)原函數(shù)的第一條指令和第二條指令; 最后一個刷新自身的快速指令緩沖區(qū)的業(yè)務(wù)VCPU,具體修改原函數(shù)第一條指令和第二指令的方法可為先將原函數(shù)的第二條指令(延遲槽指令,即NOP)恢復(fù)成對原函數(shù)修改前的第二條指令,再將原函數(shù)的第一條指令(跳轉(zhuǎn)到異常處理的指令,即break)恢復(fù)成對原函數(shù)修改前的第一條指令。 步驟88 :刷新自身的快速指令緩沖區(qū),通過主VCPU通知其它各業(yè)務(wù)VCPU刷新自身的快速指令緩沖區(qū)。 最后一個刷新自身的快速指令緩沖區(qū)的業(yè)務(wù)VCPU,在恢復(fù)原函數(shù)的第一條指令和第二條指令后,刷新自身的快速指令緩沖區(qū),并通過主VCPU通知其它各業(yè)務(wù)VCPU刷新自身的快速指令緩沖區(qū),以使各業(yè)務(wù)VCPU自身的快速指令緩沖區(qū)中指令與共享內(nèi)存中指令同步更新。 本實(shí)施例,在多核處理器系統(tǒng)運(yùn)行過程中,若對原函數(shù)的打補(bǔ)丁操作出現(xiàn)錯誤,需
要對原函數(shù)的指令恢復(fù)時,主VCPU先將原函數(shù)的第一條指令修改為跳轉(zhuǎn)到異常處理的指
令,并向業(yè)務(wù)VCPU發(fā)送第二補(bǔ)丁激活消息。業(yè)務(wù)VCPU處理完當(dāng)前業(yè)務(wù)后,根據(jù)第二補(bǔ)丁激
活消息刷新自身的快速指令緩沖區(qū)后,若其它業(yè)務(wù)VCPU執(zhí)行到原函數(shù)的第一條指令即跳
轉(zhuǎn)到異常處理的指令,根據(jù)跳轉(zhuǎn)到異常處理的指令進(jìn)入異常處理,再從異常處理中跳轉(zhuǎn)到
補(bǔ)丁函數(shù)的首地址執(zhí)行補(bǔ)丁函數(shù)中的指令。從而,最后一個業(yè)務(wù)VCPU對原函數(shù)進(jìn)行恢復(fù)操
作時,不影響其它業(yè)務(wù)VCPU的正常業(yè)務(wù)處理,不會造成業(yè)務(wù)阻塞和丟失。 以下是對本發(fā)明實(shí)施例為共享代碼段打補(bǔ)丁的裝置的說明。其中,第九實(shí)施列和
第十一實(shí)施例是以中斷和異常相結(jié)合的方式,對原函數(shù)進(jìn)行打補(bǔ)丁的裝置;第十二實(shí)施例
至第十六實(shí)施例是以消息和異常相結(jié)合的方式,對原函數(shù)進(jìn)行打補(bǔ)丁的裝置。 圖9為本發(fā)明第九實(shí)施例為共享代碼段打補(bǔ)丁的裝置的結(jié)構(gòu)示意圖。如圖9所示,
本實(shí)施例包括第一修改模塊91、第一中斷模塊92和第一補(bǔ)丁模塊93以及第二中斷模塊94。 第一修改模塊91在主VCPU為原函數(shù)打補(bǔ)丁前,在共享內(nèi)存中,將原函數(shù)的第一條
指令修改為跳轉(zhuǎn)到異常處理的指令;其中,原函數(shù)為需要打補(bǔ)丁的共享函數(shù)。第一中斷模塊92在第一修改模塊91在共享內(nèi)存中,將原函數(shù)的第一條指令修改為跳轉(zhuǎn)到異常處理的指令后,向業(yè)務(wù)VCPU發(fā)送第一中斷消息。第一中斷信息用于指示各業(yè)務(wù)VCPU中斷當(dāng)前業(yè)務(wù)立即刷新自身的快速指令緩沖區(qū),使第一修改模塊91修改后的指令快速生效。從而,在主VCPU為原函數(shù)打補(bǔ)丁時,使各業(yè)務(wù)VCPU根據(jù)原函數(shù)的第一條指令跳轉(zhuǎn)到異常處理中。
第一補(bǔ)丁模塊93在第一中斷模塊92向業(yè)務(wù)VPCU發(fā)送第一中斷信息后,在共享內(nèi)存中,將原函數(shù)的第一條指令和第二條指令修改為跳轉(zhuǎn)到補(bǔ)丁函數(shù)的指令。第一補(bǔ)丁模塊93的具體操作可為先將原函數(shù)的第二條指令修改為延遲槽指令;將原函數(shù)的第一條指令修改為跳轉(zhuǎn)到補(bǔ)丁函數(shù)的指令。由于,第一補(bǔ)丁模塊93在共享內(nèi)存中,將原函數(shù)的第一條指令和第二條指令修改為跳轉(zhuǎn)到補(bǔ)丁函數(shù)的指令時,各業(yè)務(wù)VCPU已根據(jù)第一中斷信息的指示,刷新了自身的快速指令緩沖區(qū)。因而,若各業(yè)務(wù)VCPU執(zhí)行到原函數(shù)時,會跳轉(zhuǎn)到異常處理中,從而不會受到第一補(bǔ)丁模塊93為原函數(shù)打補(bǔ)丁的影響。 第二中斷模塊94在第一補(bǔ)丁模塊93在共享內(nèi)存中,將原函數(shù)的第一條指令和第二條指令修改為跳轉(zhuǎn)到補(bǔ)丁函數(shù)的指令后,向業(yè)務(wù)VPCU發(fā)送第二中斷信息。第二中斷信息用于指示各業(yè)務(wù)VCPU中斷當(dāng)前業(yè)務(wù),刷新自身的快速指令緩沖區(qū),從而使原函數(shù)打的補(bǔ)丁函數(shù)快速生效。
本實(shí)施例中各模塊的工作機(jī)理參見圖l對應(yīng)實(shí)施例中的描述,在此不再贅述。
本實(shí)施例,在多核處理器系統(tǒng)運(yùn)行過程中,在第一補(bǔ)丁模塊93對原函數(shù)進(jìn)行打補(bǔ) 丁操作之前,第一修改模塊91將原函數(shù)的第一條指令先修改為跳轉(zhuǎn)到異常處理的指令,并 指示第一中斷模塊92向業(yè)務(wù)VCPU發(fā)送中斷信息,使業(yè)務(wù)VCPU立即刷新快速指令緩沖區(qū)。 由于,本發(fā)明實(shí)施例中業(yè)務(wù)VCPU接收到第一補(bǔ)丁模塊93發(fā)送的中斷信息后,不需要向主 VCPU發(fā)送響應(yīng)消息;并且第一補(bǔ)丁模塊93向業(yè)務(wù)VCPU發(fā)送中斷信息后,即可對原函數(shù)進(jìn) 行打補(bǔ)丁操作,因此,本發(fā)明實(shí)施例能使補(bǔ)丁快速生效。另外,在第一補(bǔ)丁模塊93對原函數(shù) 打補(bǔ)丁操作時,若業(yè)務(wù)VCPU執(zhí)行到原函數(shù)的第一條指令時,通過上述跳轉(zhuǎn)到異常處理的指 令進(jìn)入異常處理,再從異常處理進(jìn)入補(bǔ)丁函數(shù),從而能保證第一補(bǔ)丁模塊93對原函數(shù)進(jìn)行 正常的打補(bǔ)丁操作。因此本發(fā)明實(shí)施例為共享代碼段打補(bǔ)丁的裝置,在第一補(bǔ)丁模塊93對 原函數(shù)打補(bǔ)丁操作時,不會影響到該業(yè)務(wù)VCPU的正常業(yè)務(wù)處理,還能使執(zhí)行到原函數(shù)的業(yè) 務(wù)VCPU從原函數(shù)跳轉(zhuǎn)到補(bǔ)丁函數(shù)中執(zhí)行,并且不會導(dǎo)致業(yè)務(wù)阻塞和業(yè)務(wù)數(shù)據(jù)丟失。
圖IO為本發(fā)明第十實(shí)施例為共享代碼段打補(bǔ)丁的裝置的結(jié)構(gòu)示意圖,如圖10所 示,在圖9對應(yīng)實(shí)施例的基礎(chǔ)上,還包括第二修改模塊95、第三中斷模塊96、第一恢復(fù)模塊 97和第四中斷模塊98。 若第一補(bǔ)丁模塊93對原函數(shù)的第一條指令和第二條指令有誤,并且在第一補(bǔ)丁 模塊93修改完后,第二中斷模塊94已向各業(yè)務(wù)VCPU發(fā)送過第二中斷信息,則通過本實(shí)施 例中第一恢復(fù)模塊,將原函數(shù)的第一條指令和第二條指令恢復(fù)為對原函數(shù)修改前的指令。 具體如下 第二修改模塊95已向各業(yè)務(wù)VCPU發(fā)送過第二中斷信息后,并在恢復(fù)原函數(shù)的第 一條指令和第二條指令前,在共享內(nèi)存中,將原函數(shù)的第一條指令修改為跳轉(zhuǎn)到異常處理 的指令。第三中斷模塊96在第二修改模塊95在共享內(nèi)存中,將原函數(shù)的第一條指令修改 為跳轉(zhuǎn)到異常處理的指令后,向業(yè)務(wù)VCPU發(fā)送第三中斷消息,以指示業(yè)務(wù)VCPU中斷當(dāng)前業(yè) 務(wù),刷新自身的快速指令緩沖區(qū)。第一恢復(fù)模塊97在第三中斷模塊96向業(yè)務(wù)VCPU發(fā)送第 三中斷消息后,在共享內(nèi)存中,將原函數(shù)的第一條指令和第二條指令,恢復(fù)成對原函數(shù)修改 前的指令。第四中斷模塊98在第一恢復(fù)模塊97在共享內(nèi)存中,將原函數(shù)的第一條指令和 第二條指令,恢復(fù)成對原函數(shù)修改前的指令后,向業(yè)務(wù)VCPU發(fā)送第四中斷信息,以指示業(yè) 務(wù)VCPU,中斷當(dāng)前業(yè)務(wù)立即刷新各自的快速指令緩沖區(qū),從而使業(yè)務(wù)VCPU自身的快速指令 緩沖區(qū)中指令與共享內(nèi)存中指令同步更新。 本實(shí)施例中各模塊的工作機(jī)理參見圖2對應(yīng)實(shí)施例中的描述,在此不再贅述。
本實(shí)施例在第一恢復(fù)模塊97恢復(fù)原函數(shù)的第一條指令和第二條指令之前,第二 修改模塊95將原函數(shù)的第一條指令先修改為跳轉(zhuǎn)到異常處理的指令,并通過第三中斷模 塊96向業(yè)務(wù)VCPU發(fā)送第三中斷信息,使業(yè)務(wù)VCPU立即刷新快速指令緩沖區(qū)。在第一恢復(fù) 模塊97恢復(fù)原函數(shù)的第一條指令和第二條指令時,若業(yè)務(wù)VCPU執(zhí)行到原函數(shù)則通過跳轉(zhuǎn) 到異常處理的指令進(jìn)入異常處理,再從異常處理跳轉(zhuǎn)到補(bǔ)丁函數(shù)的首地址處,開始執(zhí)行補(bǔ) 丁函數(shù)中的指令,以保證第一恢復(fù)模塊97對原函數(shù)進(jìn)行修改時。由于,在第一恢復(fù)模塊94 對原函數(shù)打補(bǔ)丁操作時,若業(yè)務(wù)VCPU執(zhí)行到原函數(shù)則從異常處理進(jìn)入補(bǔ)丁函數(shù),因此本實(shí) 施例,在第一恢復(fù)模塊97對原函數(shù)打補(bǔ)丁操作時,不影響業(yè)務(wù)VCPU的正常業(yè)務(wù)處理,不會 造成業(yè)務(wù)阻塞和數(shù)據(jù)丟失。
22
圖lla為本發(fā)明第十一實(shí)施例為共享代碼段打補(bǔ)丁的裝置的結(jié)構(gòu)示意圖。如圖11a所示,本實(shí)施例包括第一刷新模塊lll、第一異常處理模塊112和第一補(bǔ)丁函數(shù)執(zhí)行模塊113以及第二刷新模塊114。 第一刷新模塊111接收到主VCPU發(fā)送的第一中斷信息后,根據(jù)第一中斷信息的指示,中斷當(dāng)前業(yè)務(wù)立即刷新快速指令緩沖區(qū),以使業(yè)務(wù)VCPU自身的快速指令緩沖區(qū)中指令與共享內(nèi)存中指令同步更新。后續(xù),在業(yè)務(wù)VCPU執(zhí)行到原函數(shù)的第一條指令時,第一異常處理模塊112根據(jù)原函數(shù)的跳轉(zhuǎn)到異常處理的指令,進(jìn)入異常處理;在異常處理中,根據(jù)需要打補(bǔ)丁的原函數(shù)的首地址,在補(bǔ)丁區(qū)查找補(bǔ)丁函數(shù)的首地址;補(bǔ)丁函數(shù)為替換原函數(shù)的函數(shù)。第一異常處理模塊112查找到補(bǔ)丁函數(shù)的首地址后,第一補(bǔ)丁函數(shù)執(zhí)行模塊113從異常處理返回到補(bǔ)丁函數(shù)的首地址,并執(zhí)行補(bǔ)丁函數(shù)。 由于主業(yè)務(wù)VCPU在向業(yè)務(wù)VCPU發(fā)送第一中斷信息后,會進(jìn)行為原函數(shù)打補(bǔ)丁的操作,并在為原函數(shù)打補(bǔ)丁之后向各業(yè)務(wù)VCPU發(fā)送第二中斷信息。因此,第二刷新模塊114在第一刷新模塊lll根據(jù)第一中斷信息的指示,中斷當(dāng)前業(yè)務(wù),刷新快速指令緩沖區(qū)之后,接收主VCPU發(fā)送的第二中斷信息,根據(jù)第二中斷信息的指示,中斷當(dāng)前業(yè)務(wù),刷新自身的快速指令緩沖區(qū),以使業(yè)務(wù)VCPU自身的快速指令緩沖區(qū)中指令與共享內(nèi)存中指令同步更新。 上述各模塊的工作機(jī)理參見圖3a和圖3b對應(yīng)實(shí)施例中的描述,在此不再贅述。
若主VCPU為原函數(shù)打補(bǔ)丁之后,需要對原函數(shù)的第一條指令和第二條指令進(jìn)行恢復(fù)時,如圖11b所示,業(yè)務(wù)VCPU可通過以下模塊第三刷新模塊115、第二異常處理模塊116、第二補(bǔ)丁函數(shù)執(zhí)行模塊117和第四刷新模塊118,處理與主VPUC的交互、并不影響當(dāng)前業(yè)務(wù)的正常處理。 第三刷新模塊115在第二刷新模塊114刷新快速指令緩沖區(qū)后,接收主VCPU發(fā)送的第三中斷信息,根據(jù)第三中斷信息的指示,中斷當(dāng)前業(yè)務(wù),刷新自身的快速指令緩沖區(qū)。第二異常處理模塊116在第三刷新模塊115刷新快速指令緩沖區(qū)后,執(zhí)行到原函數(shù)的第一條指令時,根據(jù)主VCPU原函數(shù)的第一條指令,進(jìn)入異常處理;在異常處理中,根據(jù)需要打補(bǔ)丁的原函數(shù)的首地址,在補(bǔ)丁區(qū)查找出補(bǔ)丁函數(shù)的首地址。第二補(bǔ)丁函數(shù)執(zhí)行模塊117在第二異常處理模塊116查找出補(bǔ)丁函數(shù)的首地址后,根據(jù)補(bǔ)丁函數(shù)的首地址,從異常處理跳轉(zhuǎn)到補(bǔ)丁函數(shù)中執(zhí)行。 第四刷新模塊118在第三刷新模塊115根據(jù)第三中斷信息的指示,中斷當(dāng)前業(yè)務(wù),刷新自身的快速指令緩沖區(qū)之后,接收主VCPU發(fā)送的第四中斷信息的指示,根據(jù)第四中斷信息的指示,中斷當(dāng)前業(yè)務(wù),刷新自身的快速指令緩沖區(qū),以使業(yè)務(wù)VCPU自身的快速指令緩沖區(qū)中指令與共享內(nèi)存中指令同步更新。 上述各模塊的工作機(jī)理參見圖4a和圖4b對應(yīng)實(shí)施例中的描述,在此不再贅述。
本實(shí)施例,在多核處理器系統(tǒng)運(yùn)行過程中,第一刷新模塊111接收到主CPU發(fā)送的中斷信息后,立即刷新各自的快速指令緩沖區(qū)。在業(yè)務(wù)VCPU執(zhí)行到原函數(shù)的第一條指令時,且沒有接收到主VCPU發(fā)送的第二中斷信息之前,根據(jù)跳轉(zhuǎn)到異常處理的指令跳轉(zhuǎn)到異常處理中,然后從異常處理中進(jìn)入補(bǔ)丁函數(shù)中,開始執(zhí)行補(bǔ)丁函數(shù)。因此本實(shí)施例,在主VCPU對原函數(shù)打補(bǔ)丁操作或恢復(fù)操作時,不會影響到該業(yè)務(wù)VCPU的正常業(yè)務(wù)處理,還能使執(zhí)行到原函數(shù)的業(yè)務(wù)VCPU從原函數(shù)跳轉(zhuǎn)到補(bǔ)丁函數(shù)中執(zhí)行。
圖12為本發(fā)明第十二實(shí)施例為共享代碼段打補(bǔ)丁的裝置的結(jié)構(gòu)示意圖。如圖12 所示,本實(shí)施例包括第三修改模塊121和第一消息發(fā)送模塊122。 為原函數(shù)打補(bǔ)丁前,第三修改模塊121在共享內(nèi)存中,將原函數(shù)的第一條指令修 改為跳轉(zhuǎn)到異常處理的指令。第一消息發(fā)送模塊122在第三修改模塊121在共享內(nèi)存中, 將原函數(shù)的第一條指令修改為跳轉(zhuǎn)到異常處理的指令后,向各業(yè)務(wù)VCPU發(fā)送第一補(bǔ)丁激 活消息。 第一補(bǔ)丁激活消息用于指示各業(yè)務(wù)VCPU在處理完當(dāng)前業(yè)務(wù)后刷新自身的快速指 令緩沖區(qū),以使各業(yè)務(wù)VCPU自身的快速指令緩沖區(qū)中指令與共享內(nèi)存中指令同步更新。第 一補(bǔ)丁激活消息還指示最后一個刷新自身的快速指令緩沖區(qū)的VCPU,在共享內(nèi)存中修改原 函數(shù)的第一條指令和第二條指令。 本實(shí)施例中各模塊的工作機(jī)理參見圖5對應(yīng)實(shí)施例中的描述,在此不再贅述。
本實(shí)施例,在多核處理器系統(tǒng)運(yùn)行過程中,第三修改模塊121將原函數(shù)的第一條 指令修改為跳轉(zhuǎn)到異常處理的指令后,第一消息發(fā)送模塊122向業(yè)務(wù)VCPU發(fā)送第一補(bǔ)丁激 活消息,使業(yè)務(wù)VCPU處理完當(dāng)前業(yè)務(wù)后刷新快速指令緩沖區(qū)。最后一個刷新快速指令緩沖 區(qū)的業(yè)務(wù)VCPU對原函數(shù)進(jìn)行打補(bǔ)丁的操作后,通知其它業(yè)務(wù)VCPU刷新各自的快速指令緩 沖區(qū)。在最后一個業(yè)務(wù)VCPU對原函數(shù)進(jìn)行打補(bǔ)丁操作時,其它業(yè)務(wù)VCPU若執(zhí)行到原函數(shù), 則從原函數(shù)的第一條指令則進(jìn)入異常處理,再從異常處理中跳轉(zhuǎn)到補(bǔ)丁函數(shù)的首地址執(zhí)行 補(bǔ)丁函數(shù)中的指令。從而,最后一個業(yè)務(wù)VCPU對原函數(shù)進(jìn)行補(bǔ)丁操作時,不影響其它業(yè)務(wù) VCPU的正常業(yè)務(wù)處理,不會造成業(yè)務(wù)阻塞和丟失。 圖13為本發(fā)明第十三實(shí)施例為共享代碼段打補(bǔ)丁的裝置的結(jié)構(gòu)示意圖。如圖13 所示,在圖12對應(yīng)實(shí)施例的基礎(chǔ)上,本實(shí)施例還包括第二消息發(fā)送模塊124和第四修改模 塊123。 若最后一個刷新自身快速指令緩沖區(qū)的VCPU,對原函數(shù)的第一條指令和第二條指 令有誤,并且已通知過各業(yè)務(wù)VCPU發(fā)送再次刷新自身的快速指令緩沖區(qū)??赏ㄟ^本實(shí)施例 第二消息發(fā)送模塊124,向各業(yè)務(wù)VCPU發(fā)送第二激活補(bǔ)丁消息,指示最后一個刷新自身快 速指令緩沖區(qū)的VCPU。將原函數(shù)的第一條指令和第二條指令修改為原函數(shù)原有的指令。
具體地,第四修改模塊123,在第一消息發(fā)送模塊向業(yè)務(wù)VCPU發(fā)送第一補(bǔ)丁激活 消息之后,在共享內(nèi)存中,將原函數(shù)的第一條指令修改為跳轉(zhuǎn)到異常處理的指令。第二消息 發(fā)送模塊124在第四修改模塊123在共享內(nèi)存中,將原函數(shù)的第一條指令修改為跳轉(zhuǎn)到異 常處理的指令之后,向各業(yè)務(wù)VCPU發(fā)送第二補(bǔ)丁激活消息;第二補(bǔ)丁激活消息用于指示各 業(yè)務(wù)VCPU刷新自身的快速指令緩沖區(qū),以使各業(yè)務(wù)VCPU自身的快速指令緩沖區(qū)中指令與 共享內(nèi)存中指令同步更新。第二補(bǔ)丁激活消息還指示各業(yè)務(wù)VCPU中最后一個刷新自身的 快速指令緩沖區(qū)的VCPU,在共享內(nèi)存中,將原函數(shù)的第一條指令和第二條指令恢復(fù)為對原 函數(shù)修改前的指令。 本實(shí)施例中各模塊的工作機(jī)理參見圖6對應(yīng)實(shí)施例中的描述,在此不再贅述。
本實(shí)施例,在多核處理器系統(tǒng)運(yùn)行過程中,若對原函數(shù)的打補(bǔ)丁操作出現(xiàn)錯誤,需 要對原函數(shù)的指令恢復(fù)時,第四修改模塊124先將原函數(shù)的第一條指令修改為跳轉(zhuǎn)到異常 處理的指令,第二消息發(fā)送模塊123再向業(yè)務(wù)VCPU發(fā)送第二補(bǔ)丁激活消息。業(yè)務(wù)VCPU處 理完當(dāng)前業(yè)務(wù)后,根據(jù)第二補(bǔ)丁激活消息刷新自身的快速指令緩沖區(qū)后,若其它業(yè)務(wù)VCPU執(zhí)行到原函數(shù)的第一條指令即跳轉(zhuǎn)到異常處理的指令,根據(jù)跳轉(zhuǎn)到異常處理的指令進(jìn)入異 常處理,再從異常處理中跳轉(zhuǎn)到補(bǔ)丁函數(shù)的首地址執(zhí)行補(bǔ)丁函數(shù)中的指令。從而,最后一個 業(yè)務(wù)VCPU對原函數(shù)進(jìn)行恢復(fù)操作時,不影響其它業(yè)務(wù)VCPU的正常業(yè)務(wù)處理,不會造成業(yè)務(wù) 阻塞和丟失。 圖14為本發(fā)明第十四實(shí)施例為共享代碼段打補(bǔ)丁的裝置的結(jié)構(gòu)示意圖。如圖14 所示,本實(shí)施例包括第一接收模塊141、第二補(bǔ)丁模塊142和第一刷新通知模塊143以及 判斷模塊144。 第一接收模塊141接收到主VCPU發(fā)送的第一補(bǔ)丁激活消息后,判斷模塊144判 斷。當(dāng)前業(yè)務(wù)VCPU是否是最后一個刷新自身的快速指令緩沖區(qū)的業(yè)務(wù)VCPU。判斷模塊144 判斷出當(dāng)前業(yè)務(wù)VPCU是最后一個刷新自身的快速指令緩沖區(qū)的業(yè)務(wù)VCPU時,第二補(bǔ)丁模 塊142根據(jù)第一補(bǔ)丁激活消息的指示,在共享內(nèi)存中修改原函數(shù)的前兩條指令。第一刷新 通知模塊143在第二補(bǔ)丁模塊在共享內(nèi)存中將原函數(shù)的第一條指令和第二條指令修改為 跳轉(zhuǎn)到補(bǔ)丁函數(shù)的指令后,刷新業(yè)務(wù)VCPU的快速指令緩沖區(qū),并通過主VCPU通知除最后一 個刷新自身的快速指令緩沖區(qū)的業(yè)務(wù)VCPU以外的其它業(yè)務(wù)VCPU刷新自身的快速指令緩沖 區(qū),以使業(yè)務(wù)VCPU自身的快速指令緩沖區(qū)中指令與共享內(nèi)存中指令同步更新。
本實(shí)施例中各模塊的工作機(jī)理參見圖7a和圖7b對應(yīng)實(shí)施例中的描述,在此不再 贅述。 本發(fā)明實(shí)施例為共享代碼段打補(bǔ)丁的裝置,在多核處理器系統(tǒng)運(yùn)行過程中,主 VCPU將原函數(shù)的第一條指令修改為跳轉(zhuǎn)到異常處理的指令后,向業(yè)務(wù)VCPU發(fā)送補(bǔ)丁激活 消息,使業(yè)務(wù)VCPU處理完當(dāng)前業(yè)務(wù)后刷新快速指令緩沖區(qū)。最后一個刷新快速指令緩沖區(qū) 的業(yè)務(wù)VCPU對原函數(shù)進(jìn)行打補(bǔ)丁的操作后,通知其它業(yè)務(wù)VCPU刷新各自的快速指令緩沖 區(qū)。在最后一個業(yè)務(wù)VCPU對原函數(shù)進(jìn)行打補(bǔ)丁操作時,其它業(yè)務(wù)VCPU若執(zhí)行到原函數(shù),則 從原函數(shù)的第一條指令則進(jìn)入異常處理,再從異常處理中跳轉(zhuǎn)到補(bǔ)丁函數(shù)的首地址執(zhí)行補(bǔ) 丁函數(shù)中的指令。從而,第二補(bǔ)丁模塊142對原函數(shù)進(jìn)行補(bǔ)丁操作時,不影響其它業(yè)務(wù)VCPU 的正常業(yè)務(wù)處理,不會造成業(yè)務(wù)阻塞和丟失。 在上述方案中,若第二補(bǔ)丁模塊142對原函數(shù)的打補(bǔ)丁操作出現(xiàn)錯誤,需要對原 函數(shù)的指令恢復(fù)時,為不影響業(yè)務(wù)VCPU的正常執(zhí)行,主VCPU先將原函數(shù)的第一條指令修改 為跳轉(zhuǎn)到異常處理的指令,再向業(yè)務(wù)VCPU發(fā)送第二補(bǔ)丁激活消息。第二補(bǔ)丁激活消息指示 最后一個業(yè)務(wù)VCPU刷新自身的快速指令緩沖區(qū)之前,對原函數(shù)的前兩條指令進(jìn)行恢復(fù)操 作。因此,在圖14對應(yīng)實(shí)施例的基礎(chǔ)上,圖15對應(yīng)實(shí)施例還包括第二接收模塊145和第 二恢復(fù)模塊146以及第二刷新通知模塊147。圖15為本發(fā)明第十五實(shí)施例為共享代碼段打 補(bǔ)丁的裝置的結(jié)構(gòu)示意圖。 當(dāng)?shù)诙a(bǔ)丁模塊142在共享內(nèi)存中將原函數(shù)的第一條指令和第二條指令修改為 跳轉(zhuǎn)到補(bǔ)丁函數(shù)的指令后,第二接收模塊145接收到主VCPU發(fā)送的第二補(bǔ)丁激活消息時。 判斷模塊144判斷出當(dāng)前業(yè)務(wù)VCPU是最后一個刷新自身的快速指令緩沖區(qū)的業(yè)務(wù)VCPU 時。第二恢復(fù)模塊146根據(jù)第二補(bǔ)丁激活消息的指示,在業(yè)務(wù)VCPU處理完當(dāng)前業(yè)務(wù)后,在
共享內(nèi)存中將原函數(shù)的第一條指令和第二條指令,恢復(fù)成對原函數(shù)修改前的指令。 第二刷新通知模塊147在第二恢復(fù)模塊146將在共享內(nèi)存中將原函數(shù)的第一條指
令和第二條指令,恢復(fù)成對原函數(shù)修改前的指令后,刷新業(yè)務(wù)VCPU的快速指令緩沖區(qū),并
25通過主VCPU通知除最后一個刷新自身的快速指令緩沖區(qū)的業(yè)務(wù)VCPU以外的其它業(yè)務(wù)VCPU 刷新自身的快速指令緩沖區(qū),以使業(yè)務(wù)VCPU自身的快速指令緩沖區(qū)中指令與共享內(nèi)存中 指令同步更新。 本實(shí)施例中各模塊的工作機(jī)理參見圖7a和圖7b對應(yīng)實(shí)施例中的描述,在此不再 贅述。 本實(shí)施例中業(yè)務(wù)VCPU處理完當(dāng)前業(yè)務(wù),根據(jù)第二補(bǔ)丁激活消息刷新自身的快速 指令緩沖區(qū)后,若有業(yè)務(wù)VCPU執(zhí)行到原函數(shù)的第一條指令即跳轉(zhuǎn)到異常處理的指令,根據(jù) 跳轉(zhuǎn)到異常處理的指令進(jìn)入異常處理,再從異常處理中跳轉(zhuǎn)到補(bǔ)丁函數(shù)的首地址執(zhí)行補(bǔ)丁 函數(shù)中的指令。從而,第二恢復(fù)模塊146對原函數(shù)進(jìn)行恢復(fù)操作時,不影響其它業(yè)務(wù)VCPU 的正常業(yè)務(wù)處理,不會造成業(yè)務(wù)阻塞和丟失。 圖16為本發(fā)明第十六實(shí)施例提供的為共享代碼段打補(bǔ)丁的裝置。如圖16所示, 在圖14對應(yīng)實(shí)施例的基礎(chǔ)上,本實(shí)施例還包括第五刷新模塊148、第三異常處理模塊149 和第三補(bǔ)丁函數(shù)執(zhí)行模塊140。 第一接收模塊141接收到主VCPU發(fā)送的第一補(bǔ)丁激活消息或第二接收模塊145 接收到主VCPU發(fā)送的第二補(bǔ)丁激活消息后,第五刷新模塊148在判斷模塊144判斷出當(dāng)前 業(yè)務(wù)VCPU不是最后一個刷新自身的快速指令緩沖區(qū)的業(yè)務(wù)VCPU時,在當(dāng)前業(yè)務(wù)VCPU處理 完當(dāng)前業(yè)務(wù)后,根據(jù)第一補(bǔ)丁激活消息或第二補(bǔ)丁激活消息的指示,刷新業(yè)務(wù)VCPU的快速 指令緩沖區(qū)。從而,使各業(yè)務(wù)VCPU自身的快速指令緩沖區(qū)中指令與共享內(nèi)存中指令同步更 新。在上述業(yè)務(wù)VCPU執(zhí)行到原函數(shù)的第一條指令時,第三異常處理模塊149根據(jù)原函數(shù)的 跳轉(zhuǎn)到異常處理的指令,進(jìn)入異常處理;并在異常處理中,根據(jù)原函數(shù)的首地址,在補(bǔ)丁區(qū) 查找補(bǔ)丁函數(shù)的首地址。第三異常處理模塊149查找出補(bǔ)丁函數(shù)的首地址后,第三補(bǔ)丁函 數(shù)執(zhí)行模塊140根據(jù)補(bǔ)丁函數(shù)的首地址,從異常處理跳轉(zhuǎn)到補(bǔ)丁函數(shù)中執(zhí)行。
上述各模塊的工作機(jī)理參見圖7a、圖7b、圖8a和圖8b對應(yīng)實(shí)施例中的描述,在此 不再贅述。 本發(fā)明實(shí)施例為共享代碼段打補(bǔ)丁的裝置,在多核處理器系統(tǒng)運(yùn)行過程中,主 VCPU將原函數(shù)的第一條指令修改為跳轉(zhuǎn)到異常處理的指令后,向業(yè)務(wù)VCPU發(fā)送補(bǔ)丁激活 消息,使業(yè)務(wù)VCPU處理完當(dāng)前業(yè)務(wù)后刷新快速指令緩沖區(qū)。最后一個刷新快速指令緩沖區(qū) 的業(yè)務(wù)VCPU對原函數(shù)進(jìn)行打補(bǔ)丁的操作后,通知其它業(yè)務(wù)VCPU刷新各自的快速指令緩沖 區(qū)。在最后一個業(yè)務(wù)VCPU對原函數(shù)進(jìn)行打補(bǔ)丁操作時,其它業(yè)務(wù)VCPU若執(zhí)行到原函數(shù),則 從原函數(shù)的第一條指令則進(jìn)入異常處理,再從異常處理中跳轉(zhuǎn)到補(bǔ)丁函數(shù)的首地址執(zhí)行補(bǔ) 丁函數(shù)中的指令。從而,第二補(bǔ)丁模塊142對原函數(shù)進(jìn)行補(bǔ)丁操作時,不影響其它業(yè)務(wù)VCPU 的正常業(yè)務(wù)處理,不會造成業(yè)務(wù)阻塞和丟失。 本領(lǐng)域普通技術(shù)人員可以理解實(shí)現(xiàn)上述方法實(shí)施例的全部或部分步驟可以通過 程序指令相關(guān)的硬件來完成,前述的程序可以存儲于一計算機(jī)可讀取存儲介質(zhì)中,該程序 在執(zhí)行時,執(zhí)行包括上述方法實(shí)施例的步驟;而前述的存儲介質(zhì)包括R0M、 RAM、磁碟或者 光盤等各種可以存儲程序代碼的介質(zhì)。 最后應(yīng)說明的是以上實(shí)施例僅用以說明本發(fā)明的技術(shù)方案,而非對其限制;盡 管參照前述實(shí)施例對本發(fā)明進(jìn)行了詳細(xì)的說明,本領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)理解其依然 可以對前述各實(shí)施例所記載的技術(shù)方案進(jìn)行修改,或者對其中部分技術(shù)特征進(jìn)行等同替換;而這些修改或者替換,并不使相應(yīng)技術(shù)方案的本質(zhì)脫離本發(fā)明各實(shí)施例技術(shù)方案的精 神和范圍。
權(quán)利要求
一種為共享代碼段打補(bǔ)丁的方法,其特征在于,包括為原函數(shù)打補(bǔ)丁前,在共享內(nèi)存中,將原函數(shù)的第一條指令修改為跳轉(zhuǎn)到異常處理的指令,所述原函數(shù)為需要打補(bǔ)丁的共享函數(shù);向業(yè)務(wù)VCPU發(fā)送第一中斷消息,所述第一中斷信息用于指示所述業(yè)務(wù)VCPU中斷當(dāng)前業(yè)務(wù),刷新自身的快速指令緩沖區(qū);在所述共享內(nèi)存中,將所述原函數(shù)的第一條指令和第二條指令修改為跳轉(zhuǎn)到補(bǔ)丁函數(shù)的指令,以使執(zhí)行到所述原函數(shù)的所述業(yè)務(wù)VCPU從所述原函數(shù)跳轉(zhuǎn)到所述補(bǔ)丁函數(shù),所述補(bǔ)丁函數(shù)為替換所述原函數(shù)的函數(shù);向所述業(yè)務(wù)VCPU發(fā)送第二中斷信息,所述第二中斷信息用于指示所述業(yè)務(wù)VCPU中斷當(dāng)前業(yè)務(wù),刷新自身的快速指令緩沖區(qū)。
2. 根據(jù)權(quán)利要求l所述的為共享代碼段打補(bǔ)丁的方法,其特征在于,在向所述業(yè)務(wù) VCPU發(fā)送第二中斷信息之后,還包括恢復(fù)所述原函數(shù)的第一條指令和第二條指令前,在所述共享內(nèi)存中將所述原函數(shù)的第 一條指令修改為跳轉(zhuǎn)到異常處理的指令;向所述業(yè)務(wù)VCPU發(fā)送第三中斷消息,所述第三中斷信息用于指示所述業(yè)務(wù)VCPU中斷當(dāng)前業(yè)務(wù),刷新自身的快速指令緩沖區(qū);在所述共享內(nèi)存中,將所述原函數(shù)的第一條指令和第二條指令,恢復(fù)成對所述原函數(shù) 修改前的指令;向所述業(yè)務(wù)VCPU發(fā)送第四中斷信息,所述第四中斷信息用于指示所述業(yè)務(wù)VCPU,中斷 當(dāng)前業(yè)務(wù)立即刷新各自的快速指令緩沖區(qū),以使所述業(yè)務(wù)VCPU自身的快速指令緩沖區(qū)中 指令與所述共享內(nèi)存中指令同步更新。
3. —種為共享代碼段打補(bǔ)丁的方法,其特征在于,包括接收到主VCPU發(fā)送的第一中斷信息后,根據(jù)所述第一中斷信息的指示,中斷當(dāng)前業(yè) 務(wù),刷新快速指令緩沖區(qū),以使所述業(yè)務(wù)VCPU自身的快速指令緩沖區(qū)中指令與所述共享內(nèi) 存中指令同步更新,所述原函數(shù)為需要打補(bǔ)丁的函數(shù);執(zhí)行到原函數(shù)的第一條指令時,根據(jù)所述原函數(shù)的第一條指令,進(jìn)入異常處理,在所述 異常處理中,根據(jù)所述原函數(shù)的首地址,在補(bǔ)丁區(qū)查找出補(bǔ)丁函數(shù)的首地址,所述補(bǔ)丁函數(shù) 為替換所述原函數(shù)的函數(shù);根據(jù)所述補(bǔ)丁函數(shù)的首地址,從所述異常處理跳轉(zhuǎn)到所述補(bǔ)丁 函數(shù)中執(zhí)行;在根據(jù)所述第一中斷信息的指示,中斷當(dāng)前業(yè)務(wù),刷新快速指令緩沖區(qū)之后,接收所述 主VCPU發(fā)送的第二中斷信息;根據(jù)所述第二中斷信息的指示,中斷當(dāng)前業(yè)務(wù),刷新自身的快速指令緩沖區(qū),以使所述 業(yè)務(wù)VCPU自身的快速指令緩沖區(qū)中指令與所述共享內(nèi)存中指令同步更新。
4. 根據(jù)權(quán)利要求3所述的為共享代碼段打補(bǔ)丁的方法,其特征在于,在根據(jù)所述第二 中斷信息的指示,中斷當(dāng)前業(yè)務(wù),刷新自身的快速指令緩沖區(qū)之后,還包括接收到所述主VCPU發(fā)送的第三中斷信息后,根據(jù)所述第三中斷信息的指示,中斷當(dāng)前 業(yè)務(wù),刷新自身的快速指令緩沖區(qū),以使所述業(yè)務(wù)VCPU自身的快速指令緩沖區(qū)中指令與所 述共享內(nèi)存中指令同步更新;執(zhí)行到所述原函數(shù)的第一條指令時,根據(jù)所述主VCPU所述原函數(shù)的第一條指令,進(jìn)入異常處理;在異常處理中,根據(jù)需要打補(bǔ)丁的原函數(shù)的首地址,在補(bǔ)丁區(qū)查找出補(bǔ)丁函數(shù)的 首地址;根據(jù)所述補(bǔ)丁函數(shù)的首地址,從所述異常處理跳轉(zhuǎn)到所述補(bǔ)丁函數(shù)中執(zhí)行;在根據(jù)所述第三中斷信息的指示,中斷當(dāng)前業(yè)務(wù),刷新自身的快速指令緩沖區(qū)之后,接 收所述主VCPU發(fā)送的第四中斷信息的指示;根據(jù)所述第四中斷信息的指示,中斷當(dāng)前業(yè)務(wù),刷新自身的快速指令緩沖區(qū),以使所述 業(yè)務(wù)VCPU自身的快速指令緩沖區(qū)中指令與所述共享內(nèi)存中指令同步更新。
5. —種為共享代碼段打補(bǔ)丁的方法,其特征在于,包括為原函數(shù)打補(bǔ)丁前,在共享內(nèi)存中,將原函數(shù)的第一條指令修改為跳轉(zhuǎn)到異常處理的 指令,所述原函數(shù)為需要打補(bǔ)丁的函數(shù);向各業(yè)務(wù)VCPU發(fā)送第一補(bǔ)丁激活消息,所述第一補(bǔ)丁激活消息用于指示所述業(yè)務(wù) VCPU在處理完當(dāng)前業(yè)務(wù)后刷新自身的快速指令緩沖區(qū),以使所述業(yè)務(wù)VCPU自身的快速指 令緩沖區(qū)中指令與所述共享內(nèi)存中指令同步更新;指示最后一個刷新自身的快速指令緩沖 區(qū)的VCPU,在刷新自身的快速指令緩沖區(qū)之前,在所述共享內(nèi)存中修改所述原函數(shù)的第一 條指令和第二條指令。
6. 根據(jù)權(quán)利要求5所述的為共享代碼段打補(bǔ)丁的方法,其特征在于,在向所述業(yè)務(wù) VCPU發(fā)送第一補(bǔ)丁激活消息之后,還包括恢復(fù)所述原函數(shù)的第一條指令和第二條指令前,在所述共享內(nèi)存中,將所述原函數(shù)的 第一條指令修改為跳轉(zhuǎn)到異常處理的指令;向所述業(yè)務(wù)VCPU發(fā)送第二補(bǔ)丁激活消息,所述第二補(bǔ)丁激活消息用于指示所述業(yè)務(wù) VCPU刷新自身的快速指令緩沖區(qū),以使所述業(yè)務(wù)VCPU自身的快速指令緩沖區(qū)中指令與所 述共享內(nèi)存中指令同步更新;指示所述業(yè)務(wù)VCPU中最后一個刷新自身的快速指令緩沖區(qū) 的業(yè)務(wù)VCPU,在刷新自身的快速指令緩沖區(qū)之前,在共享內(nèi)存中將所述原函數(shù)的第一條指 令和第二條指令,恢復(fù)成對所述函數(shù)修改前的指令。
7. —種為共享代碼段打補(bǔ)丁的方法,其特征在于,包括 業(yè)務(wù)VCPU接收主VCPU發(fā)送的第一補(bǔ)丁激活消息;當(dāng)所述業(yè)務(wù)VCPU是最后一個刷新自身的快速指令緩沖區(qū)的業(yè)務(wù)VCPU時,根據(jù)所述第 一補(bǔ)丁激活消息的指示,在共享內(nèi)存中將原函數(shù)的第一條指令和第二條指令修改為所述跳 轉(zhuǎn)到補(bǔ)丁函數(shù)的指令,所述原函數(shù)為需要打補(bǔ)丁的函數(shù);所述業(yè)務(wù)VCPU刷新自身的快速指令緩沖區(qū),并通過所述主VCPU通知除最后一個刷新 自身的快速指令緩沖區(qū)的業(yè)務(wù)VCPU以外的其它業(yè)務(wù)VCPU刷新自身的快速指令緩沖區(qū),以 使所述業(yè)務(wù)VCPU自身的快速指令緩沖區(qū)中指令與所述共享內(nèi)存中指令同步更新。
8. 根據(jù)權(quán)利要求7所述的為共享代碼段打補(bǔ)丁的方法,其特征在于,在共享內(nèi)存中將 所述原函數(shù)的第一條指令和第二條指令修改為所述跳轉(zhuǎn)到補(bǔ)丁函數(shù)的指令之后,還包括接收所述主VCPU發(fā)送的第二補(bǔ)丁激活消息;當(dāng)所述業(yè)務(wù)VCPU是最后一個刷新自身的快速指令緩沖區(qū)的業(yè)務(wù)VCPU時,根據(jù)所述第 二補(bǔ)丁激活消息的指示,處理完當(dāng)前業(yè)務(wù)后,在所述共享內(nèi)存中將所述原函數(shù)的第一條指 令和第二條指令,恢復(fù)成對所述原則函數(shù)修改前的指令;所述業(yè)務(wù)VCPU刷新自身的快速指令緩沖區(qū),并通過所述主VCPU通知所述除最后一個 刷新自身的快速指令緩沖區(qū)的業(yè)務(wù)VCPU以外的其它業(yè)務(wù)VCPU刷新自身的快速指令緩沖區(qū),以使所述業(yè)務(wù)VCPU自身的快速指令緩沖區(qū)中指令與所述共享內(nèi)存中指令同步更新。
9. 權(quán)利要求8所述的為共享代碼段打補(bǔ)丁的方法,其特征在于,還包括 當(dāng)所述業(yè)務(wù)VCPU不是最后一個刷新自身的快速指令緩沖區(qū)的業(yè)務(wù)VCPU時,根據(jù)所述第一補(bǔ)丁激活消息或第二補(bǔ)丁激活消息的指示,處理完當(dāng)前業(yè)務(wù)后刷新自身的快速指令緩 沖區(qū),以使各業(yè)務(wù)VCPU自身的快速指令緩沖區(qū)中指令與共享內(nèi)存中指令同步更新;在執(zhí)行到所述原函數(shù)的第一條指令時,根據(jù)所述原函數(shù)的第一條指令,進(jìn)入異常處理; 在異常處理中,根據(jù)所述原函數(shù)的首地址,在補(bǔ)丁區(qū)查找出所述補(bǔ)丁函數(shù)的首地址;根據(jù)所述補(bǔ)丁函數(shù)的首地址,從所述異常處理跳轉(zhuǎn)到所述補(bǔ)丁函數(shù)中執(zhí)行。
10. —種為共享代碼段打補(bǔ)丁的裝置,其特征在于,包括第一修改模塊,用于為原函數(shù)打補(bǔ)丁前,在共享內(nèi)存中,將原函數(shù)的第一條指令修改為 跳轉(zhuǎn)到異常處理的指令,所述原函數(shù)為需要打補(bǔ)丁的共享函數(shù);第一中斷模塊,用于在所述第一修改模塊在共享內(nèi)存中,將原函數(shù)的第一條指令修改 為跳轉(zhuǎn)到異常處理的指令后,向業(yè)務(wù)VCPU發(fā)送第一中斷消息,所述中斷信息用于指示所述 業(yè)務(wù)VCPU中斷當(dāng)前業(yè)務(wù),刷新自身的快速指令緩沖區(qū);第一補(bǔ)丁模塊,用于在所述第一中斷模塊向所述業(yè)務(wù)VPCU發(fā)送第一中斷信息后,在所 述共享內(nèi)存中,將所述原函數(shù)的第一條指令和第二條指令修改為跳轉(zhuǎn)到補(bǔ)丁函數(shù)的指令, 以使執(zhí)行到所述原函數(shù)的所述業(yè)務(wù)VCPU從所述原函數(shù)跳轉(zhuǎn)到所述補(bǔ)丁函數(shù),所述補(bǔ)丁函 數(shù)為替換所述原函數(shù)的函數(shù);第二中斷模塊,用于在所述第一補(bǔ)丁模塊在所述共享內(nèi)存中,將所述原函數(shù)的第一條 指令和第二條指令修改為跳轉(zhuǎn)到補(bǔ)丁函數(shù)的指令后,向所述業(yè)務(wù)VPCU發(fā)送第二中斷信息。
11. 根據(jù)權(quán)利要求IO所述的為共享代碼段打補(bǔ)丁的裝置,其特征在于,還包括 第二修改模塊,用于在向所述業(yè)務(wù)VCPU發(fā)送第二中斷信息之后、恢復(fù)所述原函數(shù)的第一條指令和第二條指令前,在共享內(nèi)存中將原函數(shù)的第一條指令修改為跳轉(zhuǎn)到異常處理的 指令;第三中斷模塊,用于所述第二修改模塊在共享內(nèi)存中,將原函數(shù)的第一條指令修改為 跳轉(zhuǎn)到異常處理的指令后,向所述業(yè)務(wù)VCPU發(fā)送第三中斷消息,所述第三中斷信息用于指 示所述業(yè)務(wù)VCPU中斷當(dāng)前業(yè)務(wù),刷新自身的快速指令緩沖區(qū);第一恢復(fù)模塊,用于在所述第三中斷模塊向所述業(yè)務(wù)VCPU發(fā)送第三中斷消息后,在所 述共享內(nèi)存中,將所述原函數(shù)的第一條指令和第二條指令,恢復(fù)成對所述原函數(shù)修改前的 指令;第四中斷模塊,用于在所述第一恢復(fù)模塊在所述共享內(nèi)存中,將所述原函數(shù)的第一條 指令和第二條指令,恢復(fù)成對所述原函數(shù)修改前的指令后,向所述業(yè)務(wù)VCPU發(fā)送第四中斷 信息,所述第四中斷信息用于指示所述業(yè)務(wù)VCPU,中斷當(dāng)前業(yè)務(wù)立即刷新各自的快速指令 緩沖區(qū),以使所述業(yè)務(wù)VCPU自身的快速指令緩沖區(qū)中指令與所述共享內(nèi)存中指令同步更 新。
12. —種為共享代碼段打補(bǔ)丁的裝置,其特征在于,包括第一刷新模塊,用于接收到主VCPU發(fā)送的第一中斷信息后,根據(jù)所述第一中斷信息的 指示,中斷當(dāng)前業(yè)務(wù),刷新快速指令緩沖區(qū),以使所述業(yè)務(wù)VCPU自身的快速指令緩沖區(qū)中 指令與所述共享內(nèi)存中指令同步更新,所述原函數(shù)為需要打補(bǔ)丁的函數(shù);第一異常處理模塊,用于在所述第一刷新模塊刷新快速指令緩沖區(qū)后,執(zhí)行到原函數(shù) 的第一條指令時,根據(jù)所述原函數(shù)的第一條指令,進(jìn)入異常處理,在所述異常處理中,根據(jù) 所述原函數(shù)的首地址,在補(bǔ)丁區(qū)查找出補(bǔ)丁函數(shù)的首地址,所述補(bǔ)丁函數(shù)為替換所述原函 數(shù)的函數(shù);第一補(bǔ)丁函數(shù)執(zhí)行模塊,用于在所述第一異常處理模塊查找出所述補(bǔ)丁函數(shù)的首地址 后,根據(jù)所述補(bǔ)丁函數(shù)的首地址,從所述異常處理跳轉(zhuǎn)到所述補(bǔ)丁函數(shù)中執(zhí)行;第二刷新模塊,用于在所述第一刷新模塊根據(jù)所述第一中斷信息的指示,中斷當(dāng)前業(yè) 務(wù),刷新快速指令緩沖區(qū)之后,接收所述主VCPU發(fā)送的第二中斷信息,根據(jù)所述第二中斷 信息的指示,中斷當(dāng)前業(yè)務(wù),刷新自身的快速指令緩沖區(qū),以使所述業(yè)務(wù)VCPU自身的快速 指令緩沖區(qū)中指令與所述共享內(nèi)存中指令同步更新。
13. 根據(jù)權(quán)利要求12所述的為共享代碼段打補(bǔ)丁的裝置,其特征在于,還包括 第三刷新模塊,用于在所述第二刷新模塊刷新快速指令緩沖區(qū)后,接收到所述主VCPU發(fā)送的第三中斷信息后,根據(jù)所述第三中斷信息的指示,中斷當(dāng)前業(yè)務(wù),刷新自身的快速指 令緩沖區(qū),以使所述業(yè)務(wù)VCPU自身的快速指令緩沖區(qū)中指令與所述共享內(nèi)存中指令同步 更新;第二異常處理模塊,用于在所述第三刷新模塊刷新快速指令緩沖區(qū)后,執(zhí)行到所述原 函數(shù)的第一條指令時,根據(jù)所述主VCPU所述原函數(shù)的第一條指令,進(jìn)入異常處理;在異常 處理中,根據(jù)需要打補(bǔ)丁的原函數(shù)的首地址,在補(bǔ)丁區(qū)查找出補(bǔ)丁函數(shù)的首地址;第二補(bǔ)丁執(zhí)行模塊,用于在所述第二異常處理模塊查找出所述補(bǔ)丁函數(shù)的首地址后, 根據(jù)所述補(bǔ)丁函數(shù)的首地址,從所述異常處理跳轉(zhuǎn)到所述補(bǔ)丁函數(shù)中執(zhí)行;第四刷新模塊,用于在所述第三刷新模塊根據(jù)所述第三中斷信息的指示,中斷當(dāng)前業(yè) 務(wù),刷新自身的快速指令緩沖區(qū)之后,接收所述主VCPU發(fā)送的第四中斷信息的指示,根據(jù) 所述第四中斷信息的指示,中斷當(dāng)前業(yè)務(wù),刷新自身的快速指令緩沖區(qū),以使所述業(yè)務(wù)VCPU 自身的快速指令緩沖區(qū)中指令與所述共享內(nèi)存中指令同步更新。
14. 一種為共享代碼段打補(bǔ)丁的裝置,其特征在于,包括第三修改模塊,用于為原函數(shù)打補(bǔ)丁前,在共享內(nèi)存中,將原函數(shù)的第一條指令修改為 跳轉(zhuǎn)到異常處理的指令,所述原函數(shù)為需要打補(bǔ)丁的函數(shù);第一消息發(fā)送模塊,用于所述第三修改模塊在共享內(nèi)存中,將原函數(shù)的第一條指令修 改為跳轉(zhuǎn)到異常處理的指令后,向各業(yè)務(wù)VCPU發(fā)送第一補(bǔ)丁激活消息,所述第一補(bǔ)丁激活 消息用于指示所述業(yè)務(wù)VCPU在處理完當(dāng)前業(yè)務(wù)后刷新自身的快速指令緩沖區(qū),以使所述 業(yè)務(wù)VCPU自身的快速指令緩沖區(qū)中指令與所述共享內(nèi)存中指令同步更新;指示最后一個 刷新自身的快速指令緩沖區(qū)的VCPU,在刷新自身的快速指令緩沖區(qū)之前,在共享內(nèi)存中修 改所述原函數(shù)的第一條指令和第二條指令。
15. 根據(jù)權(quán)利要求14所述的為共享代碼段打補(bǔ)丁的裝置,其特征在于,還包括 第四修改模塊,用于在所述第一消息發(fā)送模塊向所述業(yè)務(wù)VCPU發(fā)送第一補(bǔ)丁激活消息之后,在所述共享內(nèi)存中,將所述原函數(shù)的第一條指令修改為跳轉(zhuǎn)到異常處理的指令;第二消息發(fā)送模塊,用于所述第四修改模塊在所述共享內(nèi)存中,將所述原函數(shù)的第一 條指令修改為跳轉(zhuǎn)到異常處理的指令之后,向所述業(yè)務(wù)VCPU發(fā)送第二補(bǔ)丁激活消息,所述 第二補(bǔ)丁激活消息用于指示所述業(yè)務(wù)VCPU在處理完當(dāng)前業(yè)務(wù)后刷新自身的快速指令緩沖區(qū),以使所述業(yè)務(wù)VCPU自身的快速指令緩沖區(qū)中指令與所述共享內(nèi)存中指令同步更新;指示所述業(yè)務(wù)VCPU中最后一個刷新自身的快速指令緩沖區(qū)的業(yè)務(wù)VCPU,在刷新自身的快速指令緩沖區(qū)之前,在共享內(nèi)存中將所述原函數(shù)的第一條指令和第二條指令,恢復(fù)成對所述 原函數(shù)修改前的指令。
16. —種為共享代碼段打補(bǔ)丁的裝置,其特征在于,包括 第一接收模塊,用于業(yè)務(wù)VCPU接收主VCPU發(fā)送的第一補(bǔ)丁激活消息; 判斷模塊,用于判斷所述業(yè)務(wù)VCPU是否是最后一個刷新自身的快速指令緩沖區(qū)的業(yè)務(wù)VCPU ;第二補(bǔ)丁模塊,用于在所述判斷模塊判斷出所述業(yè)務(wù)VCPU是最后一個刷新自身的快 速指令緩沖區(qū)的業(yè)務(wù)VCPU時,根據(jù)所述第一補(bǔ)丁激活消息的指示,在共享內(nèi)存中將原函數(shù)的第一條指令和第二條指令修改為所述跳轉(zhuǎn)到補(bǔ)丁函數(shù)的指令,所述原函數(shù)為需要打補(bǔ)丁的函數(shù);第一刷新通知模塊,用于在所述第二補(bǔ)丁模塊在共享內(nèi)存中將原函數(shù)的第一條指令和 第二條指令修改為所述跳轉(zhuǎn)到補(bǔ)丁函數(shù)的指令后,刷新所述業(yè)務(wù)VCPU的快速指令緩沖區(qū), 并通過所述主VCPU通知除最后一個刷新自身的快速指令緩沖區(qū)的業(yè)務(wù)VCPU以外的其它業(yè) 務(wù)VCPU刷新自身的快速指令緩沖區(qū),以使所述業(yè)務(wù)VCPU自身的快速指令緩沖區(qū)中指令與所述共享內(nèi)存中指令同步更新。
17. 根據(jù)權(quán)利要求16所述的為共享代碼段打補(bǔ)丁的裝置,其特征在于,還包括 第二接收模塊,用于第一刷新通知模塊刷新所述業(yè)務(wù)VCPU的快速指令緩沖區(qū)后,接收所述主VCPU發(fā)送的第二補(bǔ)丁激活消息;第二恢復(fù)模塊,用于在所述判斷模塊判斷出所述業(yè)務(wù)VCPU是最后一個刷新自身的快 速指令緩沖區(qū)的業(yè)務(wù)VCPU時,根據(jù)所述第二補(bǔ)丁激活消息的指示,處理完當(dāng)前業(yè)務(wù)后,在所述共享內(nèi)存中將所述原函數(shù)的第一條指令和第二條指令,恢復(fù)成對所述原函數(shù)修改前的指令;第二刷新通知模塊,用于在所述第二恢復(fù)模塊將在所述共享內(nèi)存中將所述原函數(shù)的第 一條指令和第二條指令,恢復(fù)成對所述原函數(shù)修改前的指令后,刷新所述業(yè)務(wù)VCPU的快速 指令緩沖區(qū),并通過所述主VCPU通知所述除最后一個刷新自身的快速指令緩沖區(qū)的業(yè)務(wù) VCPU以外的其它業(yè)務(wù)VCPU刷新自身的快速指令緩沖區(qū),以使所述業(yè)務(wù)VCPU自身的快速指令緩沖區(qū)中指令與所述共享內(nèi)存中指令同步更新。
18. 根據(jù)權(quán)利要求17所述的為共享代碼段打補(bǔ)丁的裝置,其特征在于,還包括 第五刷新模塊,用于在所述判斷模塊判斷出所述業(yè)務(wù)VCPU不是最后一個刷新自身的快速指令緩沖區(qū)的業(yè)務(wù)VCPU時,根據(jù)所述第一補(bǔ)丁激活消息或第二補(bǔ)丁激活消息的指示, 在所述業(yè)務(wù)VCPU處理完當(dāng)前業(yè)務(wù)后,刷新所述業(yè)務(wù)VCPU的快速指令緩沖區(qū),以使各業(yè)務(wù)VCPU自身的快速指令緩沖區(qū)中指令與共享內(nèi)存中指令同步更新;第三異常處理模塊,用于在所述第五刷新模塊刷新所述業(yè)務(wù)VCPU的快速指令緩沖區(qū) 后,執(zhí)行到原函數(shù)的第一條指令時,根據(jù)所述原函數(shù)的第一條指令,進(jìn)入異常處理;在異常 處理中,根據(jù)所述原函數(shù)的首地址,在補(bǔ)丁區(qū)查找出所述補(bǔ)丁函數(shù)的首地址;第三補(bǔ)丁函數(shù)執(zhí)行模塊,用于在所述第三異常處理模塊查找出所述補(bǔ)丁函數(shù)的首地址 后,根據(jù)所述補(bǔ)丁函數(shù)的首地址,從所述異常處理跳轉(zhuǎn)到所述補(bǔ)丁函數(shù)中執(zhí)行。
全文摘要
本發(fā)明實(shí)施例提供一種為共享代碼段打補(bǔ)丁的方法及裝置。該為共享代碼段打補(bǔ)丁的方法包括為原函數(shù)打補(bǔ)丁前,在共享內(nèi)存中,將原函數(shù)的第一條指令修改為跳轉(zhuǎn)到異常處理的指令;原函數(shù)為需要打補(bǔ)丁的共享函數(shù);向各業(yè)務(wù)VCPU發(fā)送第一中斷消息;第一中斷信息用于指示各業(yè)務(wù)VCPU中斷當(dāng)前業(yè)務(wù)立即刷新自身的快速指令緩沖區(qū);將原函數(shù)的第一條指令和第二條指令修改為跳轉(zhuǎn)到補(bǔ)丁函數(shù)的指令;向各業(yè)務(wù)VCPU發(fā)送第二中斷信息,以指示各業(yè)務(wù)VCPU,中斷當(dāng)前業(yè)務(wù)立即刷新各自的快速指令緩沖區(qū)。本發(fā)明實(shí)施例實(shí)現(xiàn)了在不影響業(yè)務(wù)VCPU正常業(yè)務(wù)處理的情況下,對共享代碼段進(jìn)行補(bǔ)丁操作并使補(bǔ)丁快速生效。
文檔編號G06F15/167GK101794272SQ20101013893
公開日2010年8月4日 申請日期2010年3月26日 優(yōu)先權(quán)日2010年3月26日
發(fā)明者陳福軍 申請人:成都市華為賽門鐵克科技有限公司