從VMM中終止GUEST OS中執行程序

2021-04-13 12:36:02 字數 3389 閱讀 7683

康華:主要從事

linux

作業系統核心、虛擬機器、

linux

技術標準、計算機安全、軟體測試等領域的研究與開發工作,曾就職

mii-hp

軟體實驗室

、瞬聯軟體公司

/motorola

、lenovo

研究院。其所合寫的

linux

專欄見http://www.csdn.net/subject/linux/

。如果需要可以聯絡通過

[email protected]

(msn

)聯絡他. 

摘要:

本文在從

vmm中識別

guest os

中執行程序的基礎上

, 給出了從

vmm中殺死

guest os

中給定程序的方法並予以實現。

現在我們已經實現了在

vmm監視

guest os

中執行程序這一任務。那麼下乙個目標將是如何控制

guest os

中的程序。最簡單但又是最有用的控制需求就是終止

guest os

中的執行程序——這個功能可用於終止

guest os

中可疑程序,而

guest os

全然不知

;或者可以用於解除迴圈程序死鎖等種種目的。

就實現終止

guest os

程序這一目標,我所能想到的方法最少有4種

,下來我簡要介紹和對比一下各種方法的優缺點。1.在

vmm中阻止

guest os

切換到目標程序,最直接的方法莫過於在切換時

,不要將目標程序的頁目錄基位址載入

cr3,

而給其載入乙個非法位址。(這樣以來

guest os

會如何反映

,我沒有嘗試)

2.修改

guest os

的執行位址

(linux

系統中該位址是儲存在

task_struture

結構中域

:thread.eip中)

為乙個非法位址,這樣以來當目標程序被排程後,其執行時將發生位址錯誤。不用說

,guest os

會終止它的執行。

linux

下會在終止程序時給出

oops

或者段錯誤等提示。

上面兩種方法都屬於暴力操作——借助於程序錯誤而讓

guest os

殺死程序。下面我給出兩個較為幽雅的方法終止

guest

程序。3

.向目標程序空間中注射入一段自殺**

,並修改目標程序的執行位址

(同方法

2)到自殺**處——這種方法可以將其看成是

vmm給程序打

patch

的乙個特例。當目標程序重新執行時,就會執行自殺**終止自身。

順便說兩點

,1 注射**到程序空間需要事先分配一段物理記憶體區以容納

patch

**,然後需要將這段記憶體影射到程序空間

(需要修改程序頁表)。

2 自殺**只需要含有標準的

exit

呼叫就可以了。 4

.從vmm

中模擬guest os

傳送終止訊號給目標程序.

我們知道

sigkill

訊號可以終止程序

,而深究其執行過程會發現訊號執行分兩個階段

: a

產生訊號;b

傳遞訊號。

n產生訊號是指使用者或者程式利用系統呼叫

sys_signal

在目標程序的描述符

(task_structure)

中設定訊號相關域

,表示訊號已到。

n傳遞訊號是指當程序被排程到時,核心會檢查其是否有未處理訊號

(看那些訊號相關域

),如果有

,則執行對應的訊號處理程式。

我們從vmm

中執行第一步:產生訊號,也就是給

guest os

的目標程序的描述符中訊號相關域置位。而第二步傳遞訊號仍由

guest os

核心按原先方式執行,不去干預。這是最幽雅的一種終止程序的方法。其執行效果近似於在

shell

下傳送kill

命令來殺死程序——

guest os

的程序會立刻消失,只要其被排程到。

新增乙個新的

ioctl

項kvm_vm_kill,

其處理過程需要做:

1.設定程序描述符中

pending

域中的signal

域。由於

sigkill是第9

個訊號,所以通過其下語句設定它

set.sig[(9 - 1) / 32] |= 1ul << ((9 - 1) % 32)。2.

設定程序描述符中

thread info

域中的tif_sigpending

標識。這是因為核心會在恢復程序執行前檢查該標誌是否被設定。當其被設定時,核心才會去處理訊號。

從vmm

中終止目標程序的前提是:目標程序被排程。所以如果目標程序不被排程,比如在阻塞狀態,那麼就不能被立刻殺死。而我們知道在

guest

的shell

中kill

命令則可以殺死任何程序,不管它在什麼狀態下。這是應為

kill

命令能主動喚醒目標程序,以能迅速殺死它。而我們在

vmm中無法喚醒

guest os

的程序。(至少目前我沒有想到如何從

vmm上下文執行

guest os

上下文中的喚醒例程)

./kvmctl -k

目前虛擬環境中,

vmm和

guest os

都自成體系,相互之間沒有依賴關係。

vmm的開發力求完全對

guest os

透明,而

guest os

的開發也不考慮

vmm的存在。這樣無疑是符合當前的現狀的最佳方式:

guest os

(無論是

linux

也好,或者是

windows

也好)不需要做任何修改,拿來就可以用。但這種方式未必是最好的,可以想象

vmm和

guest os

之間如果能相互感知,那麼應該能開發出更高效的虛擬系統,其效能和管理性都會有很大提高。鑑於這點,我想今後的

vmm發展和作業系統發展將會考慮相互之間的資訊共享或者互操作等問題,這也許是以後

os開發的新熱點。

VMM2012應用指南之7 向VMM中新增庫伺服器

在vmm中,庫是可用於建立和配置虛擬機器的資源的目錄。該庫包含儲存在庫共享上的各檔案,其中包含儲存在 vmm 資料庫中的作業系統 硬體和模板配置。在庫檢視中新增 建立 使用和管理庫資源。使用 vmm 庫有助於推動經核准的映像和配置的重複使用。要在 vmm 中使用,必須將基於檔案的資源新增到庫,通過將...

VMM中各個類的建構函式 new的引數

vmm data的派生類的new函式中,只是用靜態的log去初始化訊息服務視窗和通知視窗。vmm data的stream id和transactor相關,因此stream id由transactor給出。同理,data id 由generator在每產生乙個產品的時侯increase。functio...

從HIVE中中查詢

從hive資料庫查詢文件 by ymd 拼接sql語句 string sql select from doc file where contains name wildcard 拼接名稱查詢語句 if stringutils.isnoneempty unstructuredbean.getname ...