虛擬機管理器(VMM)是Windows 95的實際操作系統,它建立和維護一個管理虛擬機的框架,同時為其他vxd程序提供許多重要的服務。其中三種重要的服務是:
內存管理
中斷處理
線程調度
內存管理
VMM使用Intel 80386或更新的處理器的內存調頁能力來為系統虛擬機創建一個32位的虛地址空間。它把這個地址空間分為四個不同的部分:
V86區 地址從0H到10FFEFH,這個區屬於當前執行的虛擬機。
應用程序私有區地址從4MB到2GB。這是Win32應用程序運行的空間。每個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就會增加中斷處理的執行優先級以便讓它在盡可能短的時間內有更高的機會被調用。
副調度器通過主調度器提供的服務來給享有最高優先級的線程分配cpu時間。副調度器給每個線程一個時間片。當一個線程執行到它的時間片完結時,副調度器就增加下一個線程的優先級,這樣它就會被主調度器選中並執行。
你可以從Walter Oney's Systems Programming for Windows 95和Windows 95 DDK 文檔裡面得到關於這個問題的細節