筆者常常不小心用注音輸入法打成「淫笑卡」的音效卡,沒事就被寫成「噓你話」的虛擬化(Virtaulization),是一個涵蓋範圍甚廣甚至無所不在的技術名詞,從個人電腦玩家琅琅上口的硬體虛擬化,一路到程式設計師耳孰能詳的應用程式介面(API, Application Programming Interface),都是虛擬化的應用範圍。
先了解一下維基百科對於虛擬化的定義:
在計算機技術中,虛擬化或虛擬技術(Virtualization)是一種資源管理技術,是將電腦的各種實體資源(CPU、記憶體、磁碟空間、網路適配器等),予以抽象、轉換後呈現出來並可供分割、組合為一個或多個電腦組態環境。由此,打破實體結構間的不可切割的障礙,使用戶可以比原本的組態更好的方式來應用這些電腦硬體資源。這些資源的新虛擬部份是不受現有資源的架設方式,地域或物理組態所限制。一般所指的虛擬化資源包括計算能力和資料儲存。
延伸閱讀:
書評-虛擬化技術的世界,遠比你想像的寬廣
但在了解虛擬化技術之前,應該要對真實世界的電腦具備完整的認知,特別是近代多工作業系統的概念以及「同時」執行多個應用程式的方式,這會讓各位科科更進一步的體認到「指令集架構」作為「電腦的基礎語言」和「軟體硬體之間的介面」的角色。
「系統核心模式」vs.「使用者模式」
兼具管理驅動程式與系統底層的「系統核心模式(Kernel Mode)」與負責應用程式執行的「使用者模式(User Mode)」,定義出2種最基本運作權限的「雙模式運作(Dual Mode)」是近代多工作業系統的基礎,保護系統檔案與共用資源,確保作業系統核心免於一般使用者的破壞與互相干擾,也是需要處理器提供相對應執行權限、系統管理指令、中斷例外處理流程與記憶體保護機制的地方。
當科科按下電腦的電源鈕時,會發生以下的開機順序:
- 處理器從唯讀記憶體(Boot ROM)擷取並執行系統自我檢測程式(POST,Power-On Self-Test)。
- 從硬體或SSD等儲存媒介讀取作業系統載入器(OS Loader)。
- 將作業系統核心(Kernel)載入到記憶體。
- 開始在系統核心模式(Kernel Mode)執行作業系統核心。
- 陸續載入裝置驅動程式(Device Driver),直到可完全運行電腦的基本功能。
- 進入執行階段(Runtime)後,作業系統啟動使用者模式(User Mode),載入與執行應用程式。
應用程式透過「例外、設陷、系統呼叫」要求資源
可能影響系統底層「動搖國本」的處理器指令,都應定義為只能在系統核心模式執行的「特權指令(Privileged Instruction),處理器僅允許這些指令在系統核心模式執行。
假如應用程式需要硬體資源,例如要求增加可使用的主記憶體容量,需要執行系統特權指令,那就會觸發處理器的例外處理機制(Exception Handling),由作業系統的設陷(Trap,或稱為軟體中斷)決定是否執行該指令,如同意,就啟動系統呼叫(System Call)要求作業系統核心進行分配,讓處理器轉而執行相對應的系統程式碼,分配更多的記憶體容量。執行結束後,再恢復執行該應用程式。當應用程式需要存取某硬體裝置,也是透過系統呼叫,讓處理器載入適當的裝置驅動程式,完成後,再讓處理器回到之前的狀態。
多工作業系統也是基於相同的原理,以x86指令集為例,作業系統的應用程式執行狀態、相關資訊與程式用到的暫存器資料,都會紀錄成工作狀態節區(TSS,Task State Segment)資料結構,x86處理器藉由反覆載入、回存TSS的「Context Switch」以實現「分身」多工能力,而多工作業系統就是最常見的虛擬化應用。
但支撐多工作業系統的條件可不簡單,尤其處理器廠商需要絞盡腦汁設法滿足作業系統廠商的需求。為何MS-DOS沒辦法多工?就因為8086沒有雙模式可用,難以隔離,隨便一個應用程式都可能毀掉作業系統。這也是x86指令集歷代演進中最重要的一環,沒有之一。繼續閱讀:硬科技:為何x86的虛擬化這麼難搞(中)
3 則回應