Linux 是否總是將使用者空間和核心空間分開?
我在回想起我最近對程式的介紹,並記得編寫了一個故意隨機讀寫記憶體地址的 C++ 程序。我這樣做是為了看看會發生什麼。
令我驚訝的是,在我的 Windows 98 PC 上,我的程序會產生一些非常奇怪的副作用。有時它會切換作業系統設置,或創建圖形故障。通常情況下,它什麼也不做,或者只是讓整個系統崩潰。
後來我了解到這是因為 Windows 98 沒有限制使用者程序可以訪問的內容。我可以讀寫其他程序甚至作業系統使用的 RAM。
據我了解,Windows NT 改變了這種情況(儘管我認為它需要一段時間才能正確)。現在,Windows 會阻止您在不屬於您的程序的 RAM 中四處尋找。
我隱約記得後來在 Linux 系統上執行我的程序並沒有得到幾乎那麼多有趣的結果。如果我理解正確,這至少部分是由於使用者和核心空間的分離。
所以,我的問題是:
有沒有一段時間 Linux 沒有分離使用者和核心空間?換句話說,我的惡意程序是否曾經對 Linux 系統造成類似的破壞?
Linux一直通過防止使用者空間直接訪問它使用的記憶體來保護核心;它還始終保護程序不直接訪問彼此的記憶體。程序只能通過虛擬地址空間訪問記憶體,該地址空間可以訪問核心為它們映射的記憶體;訪問外部分配的記憶體會導致分段錯誤。(程序可以通過系統呼叫和驅動程序訪問核心,包括臭名昭著的
/dev/mem
和/dev/kmem
;它們還可以相互共享記憶體。)MMU 在 Unix/Linux 核心中嗎?還是只是在具有自己記憶體的硬體設備中?解釋了當今 Linux 如何處理核心/使用者分離(Linux 的早期版本對此進行了不同的處理;有關詳細資訊,請參閱Linux 記憶體管理概述和80386 記憶體管理)。
一些與 Linux 相關的項目消除了這種分離;例如,嵌入式 Linux 核心子集是與 8086 CPU 兼容的 Linux 子集,因此它不提供硬體強制保護。µClinux為沒有記憶體管理單元的嵌入式系統提供支持,並且它的核心“成分”現在是主線核心的一部分,但這樣的配置在“PC”架構上是不可能的。