首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 組合語言

虛擬機管理器 (VMM) 架構深度解析:記憶體、中斷、排程三大核心服務

     編輯:組合語言

VMM 定位:Windows 9x 的真正核心

虛擬機管理器(Virtual Machine Manager, VMM)是 Windows 95/98/Me 的核心作業系統組件,運行於 Ring 0,負責:

  • 建立、管理多個虛擬機 (VM),每個 VM 模擬完整 8086 環境
  • 提供核心服務給 VxD(虛擬裝置驅動程式)
  • 實現預emptive 多任務、記憶體保護、硬體虛擬化

所有 VxD、系統 DLL (KERNEL32, USER32, GDI32) 最終都透過 VMM 服務存取硬體資源。

核心服務一:記憶體管理

4GB 線性位址空間劃分

區域範圍用途特性
V86 區域0 ~ 10FFEFh (1MB + 64KB - 16B)當前 VM 的 Real Mode 記憶體映射每個 VM 獨立,切換 VM 時重新映射
應用程式私有區4MB ~ 2GBWin32 進程私有位址空間每個進程獨立 2GB (扣除 4MB)
應用程式共享區2GB ~ 3GB系統 DLL、Win16 程式、記憶體映射檔、DPMI 記憶體所有 VM 共享,Win16 程式互相可見
系統共享區3GB ~ 4GBVMM 核心、VxD、頁表、系統資料結構Ring 0 專用,用戶模式不可存取

三層記憶體管理服務

  1. 頁面記憶體服務:最底層,管理 4KB 頁框分配/釋放/鎖定/解鎖/映射。所有上層服務建立於此。
  2. 堆積記憶體服務:管理小塊記憶體 (<4KB),支援可變大小分配,建立於頁面服務之上。
  3. 表格服務:管理固定大小記憶體塊的鏈結串列,用於各種核心物件陣列。

核心服務二:中斷處理

兩級中斷處理架構

  1. 第一級 (VMM 核心):
    • 中斷向量表 (IDT) 幾乎所有入口點皆指向 VMM 內部處理常式
    • 工作:保存被中斷執行緒完整狀態 (暫存器、旗標、段暫存器)、切換至核心堆疊、識別中斷來源
  2. 第二級 (VxD 服務):
    • VMM 根據中斷類型分派給對應 VxD 的處理常式
    • VxD 執行實際硬體操作、資料傳輸、裝置控制
  3. 重新分派器:第二級完成後,決定下一個執行緒 (可能是被中斷者、可能是更高優先權者),恢復狀態並返回。

VxD 掛接中斷的正確方式

  • VMMCall Hook_V86_Int_Chain:掛接 V86 (Real Mode) 中斷鏈
  • VMMCall Set_PM_Int:設定保護模式中斷門
  • 嚴禁直接修改 IDT:繞過 VMM 協調機制會導致多處理器同步失敗、中斷遺失、系統崩潰。

核心服務三:執行緒排程

雙層排程器架構

排程器職責觸發時機決策輸出
主要排程器選擇最高優先權可執行執行緒中斷返回前、執行緒就緒/封鎖、優先權變更下一個獲得 CPU 的執行緒/VM
時間片管理器 (次要排程器)分配 CPU 時間片、實現輪轉時鐘中斷 (約 18.2Hz/55ms 或 1kHz/1ms)當前執行緒時間片耗盡 → 提升下一執行緒優先權

優先權體系

  • 32 級優先權 (0-31),數值越高優先權越高
  • 動態調整:I/O 完成提升、時間片耗盡降低、鎖競爭提升
  • VxD 可呼叫 VMMCall Adjust_Thread_Priority 等服務調整
  • 硬體中斷處理自動獲得極高優先權 (確保即時性)

執行緒狀態機

就緒 (Ready) ←→ 執行中 (Running)
    ↑    ↓
封鎖 (Blocked) — 等待事件 (I/O, 同步物件, 頁面錯誤)

VMM 服務分類概覽

服務類別代表服務用途
裝置管理Register_Device, Enable_Device, Disable_DeviceVxD 註冊與生命週期
記憶體管理_PageAllocate, _PageFree, _PageLock, _PageUnlock, _HeapAllocate核心記憶體操作
中斷/定時器Hook_V86_Int_Chain, Set_PM_Int, Set_Global_Time_Out, Cancel_Time_Out硬體虛擬化與定時
執行緒/排程Create_Thread, Destroy_Thread, Adjust_Thread_Priority, Get_Cur_Thread_Handle多任務控制
檔案系統IFS_Mgr 相關服務虛擬檔案系統介面
偵錯/追蹤Debug_Out, Get_Debug_Options核心除錯支援

關鍵資料結構

  • VMCB (VM Control Block):每個 VM 一個,包含狀態、高線性映射基址、Client Register 指標、VMID、簽章。
  • Client Register Structure:被中斷 V86/保護模式程式的完整暫存器影像,修改即可改變程式恢復時的狀態。
  • Thread Control Block (TCB):每個執行緒一個,包含優先權、狀態、暫存器儲存區、堆疊指標、所屬 VM/進程指標。
  • Page Table Entries (PTE):管理 4KB 頁面映射、屬性 (Present, RW, User, Dirty, Accessed, Global)。

VMM 歷史地位與現代啟示

VMM 是微內核思想在單核心架構下的務實實踐:核心極小 (排程、記憶體、中斷),其餘功能 (檔案系統、網路、圖形、音訊) 全部下放到 VxD 模組。這種模組化、服務導向、動態載入的設計,直接影響了後來的:

  • Windows NT 驅動模型 (WDM/KMDF):驅動堆疊、IRP、PnP、電源管理
  • Linux 核心模組 (kmod)、裝置驅動子系統
  • 微核心作業系統 (QNX, L4, Zircon/Fuchsia) 的用戶空間服務架構
  • 現代虛擬化管理程式 的裝置模擬、中斷重導向、記憶體二階段轉換

總結

VMM 以不到 200KB 的核心代碼,支撐了 Windows 9x 整個作業系統人格:多虛擬機隔離、預emptive 多任務、32/16 位混合執行、動態裝置驅動。其三大核心服務——分頁記憶體管理、兩級中斷虛擬化、雙層優先權排程——構成了現代作業系統核心的經典藍圖。研讀 VMM 設計,不僅是考古,更是理解作業系統核心架構永恆原理的捷徑。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved