2013-05-09 190 views

回答

2

我假設您在執行某些需要用戶空間地址的系統調用時遇到問題。在這種情況下,我們並不需要檢查地址是否有效 - 事實上,我們需要做相反的事情:防止失敗機制參與。

Kernel System Calls by Alessandro Rubini

像,使用一個 用戶提供的指針從用戶空間的數據傳輸給/任何其他功能,系統調用檢查是否提供 緩衝器是有效的地址或沒有。在正常操作期間,位於用戶地址範圍(0-3GB,用於標準內核 配置)的地址 被認爲是有效的,而位於內核地址空間(3GB-4GB)內的地址不是。

您可以使用宏get_dsget_fs,並set_fs一起定義被認爲是有效的最高虛擬地址,從而使你內核空間的地址傳遞給系統調用。

mm_segment_t fs = get_fs();  /* save previous value */ 

set_fs (get_ds());     /* use kernel limit */ 

/* system calls can be invoked */ 

set_fs(fs);      /* restore before returning to user space */ 
  1. 首先我們節省使用get_fs宏當前配置。
  2. 接下來我們用set_fs宏設置一個新的上限。
    • get_ds宏爲內核提供了最大可能的虛擬地址。
  3. 現在所有的內核地址都有效。
    • 此配置持續到下一個set_fs
    • 根據您的心願調用盡可能多的系統調用,而不用擔心通常的用戶空間地址檢查失敗。
  4. 最後我們用set_fs宏將限制返回到以前的配置。

重要:確保到極限返回到以前的配置(只有用戶空間的地址是有效的);否則,從用戶空間傳遞的無效指針可能會對您的驅動程序造成嚴重破壞!

+1

感謝您提供豐富的答案。我發現函數__virt_addr_valid告訴我地址​​所在的頁面是否被映射。 – user2158345 2013-05-09 20:25:11