作業系統核心

核心定址空間(kernel address space)

每個執行中的程式都透過虛擬位址看待記憶體——一份由硬體翻譯成真實實體記憶體的私有地圖。核心定址空間是那份地圖中保留給核心自身的部分:核心程式碼、核心資料結構,以及實體記憶體的直接映射所住的那些位址。在 Linux 之類的系統中,關鍵的設計抉擇是把每個行程的虛擬位址範圍切成兩半——一個使用者部分,程式可自由碰觸;一個核心部分,它被禁止直接碰觸——並讓核心那半在每個行程中都映射成相同的內容,於是不論哪個行程在跑,核心都「永遠在那裡」。

把一個 64 位元的位址範圍想成一把長尺。低位址(譬如到 0x7fffffffffff 為止)是使用者空間:你的程式碼、你的堆疊、你的堆積、你的函式庫。高位址是核心空間:只有核心能讀寫它們。分頁表把核心分頁標為特權,所以只要使用者模式的程式碼一解參考某個核心指標,CPU 便會拒絕並引發一個錯誤(fault)。當系統呼叫或中斷把你帶進核心時,CPU 切換到它的特權模式,此時那些高位址才變得可用;在返回的途中,那份特權又被卸下。因為核心那半在各行程間共享,進入核心並不需要換進一整份新的記憶體地圖——核心早已映射在那條線之上。

這個切分是記憶體保護、以及把核心當作信任邊界的架構脊樑。這正是為何核心不能盲目跟隨一個使用者程式遞來的指標——那個指標可能指進核心空間,或根本指向空無——而這也正是 copy_to_user 與 copy_from_user 存在的全部理由。一個值得知道的微妙之處:像 Meltdown 這樣的旁路攻擊,迫使核心不再把核心映射完整地共享進使用者的分頁表(一種稱為分頁表隔離的緩解措施),以一點速度換取安全,這顯示「永遠映射在線上方」這幅圖是個帶有安全例外的簡化。

x86-64(簡化):使用者空間 0x0 .. 0x00007fffffffffff | 核心空間 0xffff800000000000 .. 往上。使用者程式碼解參考一個核心位址 -> CPU 分頁錯誤,被終結;只有特權模式能碰觸上半部。

虛擬範圍被切分:使用者程式碼只能碰低半部;高半部屬於核心,映射進每個行程但具特權。

「核心空間」是一段具有特權分頁權限的虛擬位址,而非一塊獨立的實體晶片。一個使用者指標只在那個行程的使用者半部裡有意義——這正是為何核心必須驗證並複製使用者指標,而非直接解參考它們。

又称
kernel space vs user spacekernel virtual address space核心空間使用者空間/核心空間