2009-12-07 208 views
3

我想將用戶空間內存的指針傳遞給內核模塊中的函數。我不想用copy_from_user。我讀過我應該使用get_user_pages函數。從內核空間訪問用戶空間 - get_user_pages

例如一頁。

struct page **pages; 
pages = kmalloc(1 * sizeof(*pages), GFP_KERNEL); 

down_read(&current->mm->mmap_sem); 
get_user_pages(current,current->mm,uaddr, 1, 1, 0,pages,NULL); 
up_read(&current->mm->mmap_sem); 

uaddr是用戶空間中的地址。

  1. 這樣做後,我可以投入並通過uaddr到我的內核模塊功能?或者,也許我必須以某種方式使用這些struct pages
  2. 爲什麼我必須使用down/up讀取?
  3. 之後,我必須使用SetPageDirty()page_cache_release()函數?

回答

2

這不是get_user_pages的用途(也不是 - 你不能然後只是將uaddr投到你的內核模塊函數中)。

如果您不想打電話copy_from_user調用函數,那麼就只是傳遞一個void __user *你的模塊功能,並有copy_from_user

2

您只能使用頁面類型活動的用戶頁面,例如將Scatter/Gather DMA設置到用戶空間內存中。您不能使用它從內核模式代碼直接訪問用戶空間。因此,出於這個原因的copy_to/from函數。除非你移動大量的數據,爲什麼不使用這些功能?

2
  1. 不,您不能通過uaddr直接訪問用戶空間頁面。結構頁面被填充以允許內核訪問與用戶空間頁面對應的物理頁面。還要注意,它們最不可能是連續的,因此從uaddr的開始就必須小心地將正確的頁索引用於數組。
  2. 您正在更改此進程的頁面映射結構,因此需要在內核中的頁面映射設置時保護它們。
  3. 當您完成get_user_pages()設置的映射時,您必須通過引用的函數「釋放」它們。
0

一旦你得到有效的用戶空間地址,使用get_user_pages來獲取結構頁面指針。一旦收到struct page指針,要在內核模式下訪問它,必須使用kmap將其映射到內核虛擬地址。希望可以幫到