當核心映射到與進程本身相同的虛擬位址空間時,為什麼需要“copy_from_user()”和“copy_to_user()”?

當核心映射到與進程本身相同的虛擬位址空間時,為什麼需要“copy_from_user()”和“copy_to_user()”?

當核心映射到與進程本身相同的虛擬位址空間時,為什麼需要copy_from_user()它?copy_to_user()

為了學習目的開發了一些(玩具)內核模組後,我很快就意識到了這一點,copy_from_user()並且copy_to_user()需要將資料從用戶空間緩衝區複製到用戶空間緩衝區;否則與無效地址相關的錯誤會導致崩潰。

但是,如果0x1fffff虛擬位址指向使用者空間緩衝區,那麼為什麼該位址在核心中無效?核心位於相同的虛擬位址空間中,因此0x1fffff將映射到相同的實體記憶體。

在此輸入影像描述

在此輸入影像描述

答案1

位址空間映射在某些(不是全部!)架構上是相同的,但即使在它們相同的架構上,保護等級也不同。copy_from_user等服務於三個主要目的:

  • 他們檢查要讀取或寫入的記憶體的權限是否允許在用戶空間中運行的進程讀取或寫入它 - 這確保進程不能欺騙內核存取進程不應該存取的記憶體能夠;
  • 它們允許特定的錯誤處理,以便保護錯誤不會使核心崩潰,例如,如果當前未映射所請求的位址(考慮零頁或換出頁);
  • 它們確保核心不會超出其自身的保護範圍,例如 界面活性劑或核心特定的位址空間(S/390)。

一些架構使用記憶體佈局,允許這些函數採取捷徑,例如使用實體記憶體的直接映射,但您不能假設情況確實如此,而且它無論如何也不能處理所有情況(換出的頁面不存在於實體記憶體中)。

相關內容