Kernel當核心被映射到與程序本身相同的虛擬地址空間時,為什麼需要
當核心被映射到與程序本身相同的虛擬地址空間時,為什麼需要 copy_from_user()
和 copy_to_user()
?
當核心映射到與程序本身相同的虛擬地址空間時,為什麼需要
copy_from_user()
並且需要?copy_to_user()
在為學習目的開發了一些(玩具)核心模組後,我很快意識到了這一點,
copy_from_user()
並且copy_to_user()
需要將數據從使用者空間緩衝區復製到使用者空間緩衝區;否則與無效地址相關的錯誤會導致崩潰。但是,如果
0x1fffff
虛擬地址指向使用者空間緩衝區,那麼為什麼該地址在核心中無效?核心位於相同的虛擬地址空間中,因此0x1fffff
將映射到相同的物理記憶體。
地址空間映射在某些(不是全部!)架構上是相同的,但即使在它們相同的架構上,保護級別也不同。
copy_from_user
等服務於三個主要目的:
- 他們檢查要讀取或寫入的記憶體的權限是否允許在使用者空間中執行的程序對其進行讀取或寫入——這確保程序不能欺騙核心訪問程序不應訪問的記憶體能夠;
- 它們允許特定的錯誤處理,以便保護錯誤不會使核心崩潰,例如,如果請求的地址目前沒有映射(考慮零頁或換出頁);
- 它們確保核心不會越過它自己的保護,例如 SMAP或核心特定的地址空間 (S/390)。
一些架構使用允許這些函式走捷徑的記憶體佈局,例如使用物理記憶體的直接映射,但你不能假設是這種情況,而且它無論如何也不能處理所有情況(交換出的頁面不是’ t 存在於物理記憶體中)。