2012-06-20 22 views
5

是否可以從Linux內核模塊調用ioctl? 任何人都可以提供它如何使用的例子嗎?如何在Linux的內核空間使用ioctl()?

+3

你真的不應該這樣做。如果你做了一個搜索,你會發現一些實現相關的代碼,用於如何在內核空間內完成一個任意的系統調用,但是請考慮是否有辦法實現真正​​的目標而不會像這樣打破模型。 –

回答

5

您可以嘗試撥打sys_ioctl
如果內核編譯爲CONFIG_COMPAT,則導出它。

或者,如果您有設備驅動程序的struct file_operations,可以直接調用它的ioctl處理程序。

但是,ioctl句柄會期望指針參數位於當前正在運行的進程的地址空間中,而不是在內核地址空間中。將使用copy_from_user來閱讀它們。如果您指出內核地址空間,則copy_from_user將失敗。我不明白你會如何解決這個問題。

編輯:

如果將調用下面的代碼之間的ioctl處理程序比copy_from_user永遠不會失敗。

mm_segment_t fs; 

    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

file_operations中的ioctl處理程序已被棄用。你能想出更新的方式來使用ioctl嗎? – iammurtaza

+0

您能否詳細說明get_fs()和set_fs()如何神奇地允許內核空間執行系統調用,以及在此「copy_from_user()」之後如何不再產生問題? –

+0

'set_fs'影響驗證傳遞給'copy_to_user'的地址確實在當前用戶的地址空間中的機制。它使內核認爲當前地址空間是內核地址空間。 – ugoren

相關問題