Linux-Kernel
什麼是 cpu_entry_area?
Linux 核心的文件描述了虛擬記憶體映射。
它說:
fffffe0000000000 - fffffe7fffffffff (=39 bits) cpu_entry_area mapping
這個“cpu入口區”是什麼?是否可以通過某種方式訪問在ring 3(即 CPL3)中執行的程式碼?
我問是因為我正在嘗試使用 QEMU,並且似乎在 QEMU 客戶機(Ubuntu 伺服器 18.04)上執行的一些 CPL3 程式碼嘗試(我不知道它是否成功)訪問
cpu_entry_area
.起初,我認為我做錯了什麼,因為我認為所有高於
0x00007fffffffffff
CPL3 的地址都無法訪問,但後來我發現了vsyscall
(請參閱此處)。我嘗試從 QEMU 來賓中的 CPL3 程式碼訪問
vsyscall
記憶體(特別是*(int *)0xffffffffff600000
),並且成功,但是當我嘗試訪問cpu_entry_area
(特別是*(int *)0xfffffe0000000ee0
)時出現段錯誤。
cpu_entry_area
包含允許 CPU 將控制權移交給核心所需的所有數據和程式碼。啟用 KPTI 後,只有核心的那一部分在使用者空間執行時被映射。你可以看到它的定義arch/x86/include/asm/cpu_entry_area.h
:它包含
- GDT;
- 入口棧;
- TSS;
- 一套蹦床;
- 異常堆棧;
- 調試儲存和緩衝區。
蹦床包含系統呼叫的入口點;參見範例
arch/x86/entry/entry_64.S
,它定義了 64 位呼叫的入口點。這些都不能直接從 ring 3 訪問,但是 ring 3 程式碼可以使用允許更改特權級別(例如
SYSCALL
CPU 指令)的CPU介導的機制跳轉到它。頁表隔離的核心文件提供了更多的上下文。