康華:主要從事
linux
作業系統核心、虛擬機器、
linux
技術標準、計算機安全、軟體測試等領域的研究與開發工作,曾就職
mii-hp
軟體實驗室
、瞬聯軟體公司
/motorola
、lenovo
研究院。其所合寫的
linux
專欄見http://www.csdn.net/subject/linux/
。如果需要可以聯絡通過
(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 ...