虛擬記憶體

行程隔離(process isolation)

想像一棟公寓,每位住戶住在一間完全密封的單位:他們看不進、走不進、也無法意外損壞任何別人的家,更動不了地下室那些大樓自己的機械。即使某位住戶的公寓失火,其他人也安然無恙。行程隔離(process isolation)正是給執行中程式的這份保證:每個行程都表現得彷彿獨佔整台機器,無法讀取、破壞或弄當任何其他行程——或作業系統。

具體來說,隔離靠的是給每個行程自己的分頁表、因而自己私有的虛擬位址空間。因為同一個虛擬位址在兩個行程中對應到不同的實體頁框(或不對應到任何頁框),一個行程根本無從命名另一個行程的記憶體——它形成不出任何能轉換到鄰居頁框的虛擬位址。保護位元再加一層,而使用者/核心的特權邊界讓使用者程式碰不到核心分頁。情境切換時,作業系統換掉使用中的分頁表(並可能清空或標記 TLB),瞬間改變執行中行程能觸及哪些實體記憶體。

為何重要:隔離大概是虛擬記憶體帶給我們最重要的一件事。它讓現代機器能並肩執行不受信任的程式、把臭蟲圈住使一次崩潰不會拖垮整個系統、並在使用者與應用程式之間執行安全邊界。誠實的細節:隔離的強度,只等同於實作它的硬體與作業系統——刻意的共享仍然可能(共享函式庫、記憶體映射檔案、共享記憶體區域把同一頁框對應進多張分頁表),而像 Spectre 與 Meltdown 這樣的微架構側通道顯示,推測執行可能跨越分頁表本應封死的邊界洩漏資訊。邏輯上的隔離,並不自動意味著時序上的隔離。

兩個瀏覽器分頁以各自獨立的行程執行。一個讓某分頁崩潰的指標臭蟲,無法伸進另一分頁的記憶體或作業系統,因為它的分頁表根本不含對應到那些頁框的對應——所以只有那一個分頁死掉。

各自獨立的分頁表,意味著一個行程連命名另一個行程的記憶體都辦不到——隔離是與生俱來的。

Spectre 與 Meltdown 是誠實的提醒:由分頁表強制的邏輯隔離,仍可能透過推測執行造成的時序側通道洩漏。架構層級的隔離與微架構層級的隔離,不是同一回事。

又稱
address-space isolation程序隔離