Linux-Kernel

什麼是 cpu_entry_area?

  • March 25, 2022

Linux 核心的文件描述了虛擬記憶體映射

它說:

fffffe0000000000 - fffffe7fffffffff (=39 bits) cpu_entry_area mapping

這個“cpu入口區”是什麼?是否可以通過某種方式訪問在ring 3(即 CPL3)中執行的程式碼?

我問是因為我正在嘗試使用 QEMU,並且似乎在 QEMU 客戶機(Ubuntu 伺服器 18.04)上執行的一些 CPL3 程式碼嘗試(我不知道它是否成功)訪問cpu_entry_area.

起初,我認為我做錯了什麼,因為我認為所有高於0x00007fffffffffffCPL3 的地址都無法訪問,但後來我發現了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 程式碼可以使用允許更改特權級別(例如SYSCALLCPU 指令)的CPU介導的機制跳轉到它。

頁表隔離的核心文件提供了更多的上下文。

引用自:https://unix.stackexchange.com/questions/476768