2013-01-14 93 views
4

我有一個用戶模式進程和內核模塊。現在我想從內核讀取usermode進程的某些區域,但有一個問題:不復制用戶模式內存和VA簡單訪問。 所以我們有:task_struct的目標進程,其他相關的結構(如mm_struct,vma_struct)和虛擬地址,如0x0070abcd,我想讀取或更確切地映射到我的內核模塊。從Linux上的內核直接訪問用戶內存

我可以使用get_user_pages獲取所需內存區域的頁面列表,但下一步是什麼?我應該將頁面以某種方式映射到內核中,然後嘗試將它們作爲連續內存區域讀取,還是有更好的解決方案?

+2

不是一個答案,因爲我目前還不能確認細節,但我建議你在執行'access_process_vm'時看看'mm/memory.c'。 – Hasturkun

+0

看起來像access_process_vm調用copy_from_user_page。我不想複製用戶空間頁面,除非它是唯一可用的解決方案。 – BSen

+0

'copy_from_user_page'大部分時間似乎都是一個簡單的'memcpy()',一些拱門/平臺實現似乎首先處理D/I緩存。除非您知道您使用的是x86或類似軟件,否則我建議您小心謹慎。 – Hasturkun

回答

1

問題是,「看」用戶空間需要鎖定大量的東西。所以最好是做一個簡短的副本,而不是把所有東西都鎖定在任意的時間上。您的用戶空間進程可能不會映射到當前CPU。事實上,它可以被完全交換到磁盤,另一個CPU中運行,在它自己的內核調用的中間,等

Linux Kernel: copy_from_user - struct with pointers