第三章 windows執行機理
3.1 核心分析
3.1.1 執行機理
1. 概述
vxd中的「x」代表任意的裝置。可以把vxd看作是32位的dos。windows實現乙個多工的作業系統的方法是把運算時間輪流地分給每個虛擬器。
vmm是乙個32位的保護模式程式。它的主要任務是建立和維護乙個支援虛擬機器的框架,並對每個vm提供服務。vmm是第乙個被載入到記憶體的vxd程式,放在系統目錄下的vmm32.vxd中。
在dos程式中,虛擬裝置驅動程式能控制系統的一切資源。當它們在虛擬機器中執行時,windows需要為每乙個裝置建立一種虛擬的裝置來模擬dos對硬體的操作。乙個vxd程式通常控制真正的硬體裝置,並對該裝置在各個虛擬機器之間的共享進行管理。儘管如此,並不是每個vxd程式必須和乙個硬體裝置相聯。我們可以把vxd程式看做是在第0級別的dll。
windows95下有兩種vxd,靜態vxd和動態vxd。靜態vxd是那些從系統啟動就被載入,在系統關閉前一直存在於記憶體中的vxd程式。動態vxd程式可以在需要的時候,通過程式本身載入或解除安裝。
2. 虛擬機器管理器
虛擬機器管理器(vmm)是windows 9x的真正核心。vmm中使用了虛擬儲存的技術,能夠克服物理記憶體的限制。儘管再物理上不存在,但理論上4gb的空間是能被訪問的。
當乙個win32程式訪問4mb空間內時,它其實訪問的時對映的某物理空間。windows中是按4kb的大小來對記憶體空間進行分頁的。
3. 虛擬裝置
靜態vxd的載入過程:
device=vxd_name
(2) 可以在windows9x登錄檔中的hlm/system/currentcontrolset/services/vxd/key/staticvxd子鍵下加入如下的vxd的路徑和名字:vxd_name=pathname
3.1.2 le檔案的格式
le檔案中**和資料被存放在幾類執行屬性不同的段中:lcode pcode pdata icode dbocode scode rcode 16icode mcode。
總的說來,應該盡可能多地使用pcode和pdata,因為這樣,vmm就可以在需要的時候把段調入調出記憶體。另外,硬體中斷程式及其所用到的服務必須放在lcode段裡。
在乙個彙編的vxd專案中,段的定義是不必要的,段的定義主要用於c的vxd專案編寫。
3.1.3 vxd的設計實現
系統訊息sys_critical_init:大多數vxd程式不要用到這個訊息,除非vxd程式要接管一些其他vxd程式或者保護模式要用到的中斷。
在vmm載入vxd程式的時候,它是按照初始化順序值小的vxd先載入的順序載入的。
動態vxd除了載入機制和接收到的初始化/結束訊息跟靜態vxd不通以外,它能做靜態vxd所能做的一切。
要在乙個段裡面定義函式,應該首先定義乙個段,然後把函式放進去。
vxd程式可以使用所有的暫存器,但是在改動段暫存器的時候一定要小心,一定不要改動cs和ss的內容,除非你對將發生的事情有絕對的把握。你可以使用ds和es,但一定要記住在返回時恢復它們的初值。呼叫暫存器法服務函式時,通過各種暫存器來傳遞服務函式的引數。當呼叫堆疊服務函式時,你把要傳遞的引數壓棧,在eax得到返回值。
3.2 訊息的執行方式
在16位時代,windows的整個核心是32位的、分時的、搶占的。
讀書筆記3
1.資料治理的本質 資料治理的本質是組織對資料的可用性 完整性和安全性的整體管理。可用性指資料可用 可信且有質量保證,不會因為分析結果的準確性造成偏差,從業者可以放心地根據資料結果做業務決策 完整性分為兩個方面,一方面指資料需覆蓋各類資料應用的需要,另一方面指不會因為資料治理沒有到位而造成資料資產的...
《佛陀與想太多的豬》讀書筆記
在當當里看到書的部分內容,描述著雨下著下著就停了,苦難也是,過著過著就停了,散去了.對這個有所共鳴,處在 困境 中的自己難道不應該這麼想嗎?回一下,有哪一件事不是這麼 消散過去的呢?一段時間,自然會好.沒必要花太多時間去擔心,把時間花在刀刃上.於是就買了一套 1234 為了順帶點日語,還買了第一冊的...
Effective C 讀書筆記3
條款8 別讓異常逃離析構函式 c 並不禁止析構函式吐出異常,但不鼓勵這樣做。但如果你的析構函式必須執行乙個動作,而該動作可能會在失敗時丟擲異常,該怎麼辦?兩個辦法解決 一是 如果丟擲異常程式就結束,通常通過呼叫abort函式完成 dbconn dbconn catch 如果程式遭遇乙個於析構期間發生...