Iczelion 的 Win32Asm VxD 彙編教程 (二) (轉)

worldblog發表於2007-12-12
Iczelion 的 Win32Asm VxD 彙編教程 (二) (轉)[@more@]

虛擬機器管理器

虛擬機器管理器(VMM)是 95的實際操作,它建立和維護一個管理虛擬機器的,同時為其他vxd提供許多重要的服務。其中三種重要的服務是:
  • 管理
  • 中斷處理
  • 執行緒排程

記憶體管理

VMM使用 80386或的的記憶體調頁能力來為系統虛擬機器建立一個32位的虛地址空間。它把這個地址空間分為四個不同的部分:
  • V86區 地址從0H到10FFEFH,這個區屬於當前的虛擬機器。
  • 應用程式私有區地址從4MB到2GB。這是應用程式執行的空間。每個Win32的程式都有它自己的2GB(要減去4MB)。
  • 應用程式共享區地址從2GB到3GB。這個區域是在虛擬機器內的所有 應用程式共享的。系統DLL(user32,kernel32,gid32)都駐存在這裡。所有的Win16程式也放在這裡,因為它們行為都是不規範的的:它們對記憶體中的其他Win16程式進行讀寫。只有在這個區域裡,Win16程式才可以看到其他所有的Win16程式。記憶體對映和分配給DPMI的記憶體也被存放在這裡。
  • 系統共享區地址從3GB到4GB。這裡是VMM和VXM存放的地方。
VMM為VxD程式提供三種VxD服務:
  • 頁面記憶體服務 這種服務分配/管理頁面大小為4KB的記憶體。這是提供的最低階的服務,其他所有的服務都是建立在頁面記憶體服務上的。
  • 堆記憶體服務 管理小的記憶體塊。這種高階別的記憶體管理服務建立在頁面記憶體服務的基礎上。
  • 表服務管理可用來實行鏈結表的固定大小的記憶體塊。

處理中斷

在保護下,中斷指向中斷描述表(IDT)。VMM透過VxD的幫助監視虛擬機器的IDT。通常VMM處理IDT內幾乎所有的中斷入口。它進行第一級的中斷處理:儲存被中斷程式的狀態,把控制傳送到第二級的中斷處理,第二級的中斷處理通常由各種VxD程式來進行實際的處理。當第二級中斷處理程式完成了它的工作之後,它把控制轉交給重分派程式,由重分派程式來恢復被中斷程式的狀態並從先前被中斷的地方繼續執行。
上面的描述太過簡單。由於被中斷的虛擬機器的時間片可能已過,重分派也許不會馬上執行。VxD程式透過VMM服務如:Set_PM_Int或Hook_V86_Int_Chain來中斷處理。VxD程式不應該直接改動IDT中的中斷入口(除非你很確切的知道將發生的後果)。

執行緒排程

VMM使用兩個排程器來在虛擬機器之間實現有優先順序的多執行緒處理:
  • 主排程器
  • 時間片管理器副排程器
主排程器的任務是選擇有最高優先順序的執行緒來執行。這種選擇在VMM處理一箇中斷(如計時器中斷)時進行。選擇的結果決定了當VMM從中斷服務返回時由哪一個執行緒/虛擬機器獲得控制權。主排程器工作的結果是確定的,一個執行緒要麼獲得控制權,要麼沒有,只有一個執行緒可以得到控制權。VMM和其他的VxD可以透過VMM服務來調整執行緒的執行優先順序。例如,當一個硬中斷髮生時,VMM就會增加中斷處理的執行優先順序以便讓它在儘可能短的時間內有更高的機會被。
副排程器透過主排程器提供的服務來給享有最高優先順序的執行緒分配時間。副排程器給每個執行緒一個時間片。當一個執行緒執行到它的時間片完結時,副排程器就增加下一個執行緒的優先順序,這樣它就會被主排程器選中並執行。

你可以從Walter Oney's Systems Programming for Windows 95Windows 95 DDK 文件裡面得到關於這個問題的細節。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-991906/,如需轉載,請註明出處,否則將追究法律責任。

相關文章