2011-10-04 37 views
1

我試圖(在內核模式下)寫入到內核中動態加載系統調用(無需重新啓動內核並對其進行比較)用戶進程的內存。用戶進程如何訪問我的模塊加載的字符設備

(我知道有一種方法與ptrace的接口要做到這一點,但它不是一個選項。)

我知道做到這一點的唯一方法是加載一個模塊。爲了允許用戶與它通信,我被告知使用字符設備(應該在/ dev /中,對吧?)。我成功加載了一個。 我的問題是我不知道用戶進程如何在沒有系統調用的情況下訪問它。 (我被告知使用ioctl) 任何人都可以顯示一個用戶進程如何調用ioctl,例如,由我的模塊加載的例子嗎?

感謝, 夏嘉曦

回答

0

對於下面的回答中,我假設你要開發一個Linux模塊。重讀您的問題後,我發現我可能誤解了這個問題。


有幾種機制用於與內核驅動程序通信:

  • 一個/proc條目(又名procfs
  • ioctl通過設備接口
  • 直接通過設備接口

最常見的技術是使用read()和/或write()系統調用導致驅動程序操作的最後一種技術。雖然這些系統調用通常會傳遞純數據,但沒有任何東西阻止特定驅動程序通過I/O接口傳遞metadata

在另一方面,如果駕駛員已經有一個有用的純數據紀律這read()write()不利於元數據,則ioctl()系統調用是一種通用的瑞士軍刀做各種事情與加載或卸載磁帶,彈出DVD,查找網卡的以太網地址或查找出現多少磁盤驅動器錯誤等文件相關。已經定義瞭如此多的操作代碼,您可能會找到合理的操作代碼來重用。 ioctl接口的一大缺點是它最適合自定義程序使用,所以通過連接到標準程序管道的ioctl來傳輸數據會很困難或困難。

/proc接口結合了最好的前兩種技術:它是適合於使用stdin/stdout約定與標準的實用程序,但它也提供了一個設備驅動程序的接口,其是獨立於任何I/O的通過常規驅動機制。例如,在您的Linux系統上嘗試cat /proc/net/tcp。它顯示所有TCP連接的狀態。

關於實現procfs功能的好文章是create_proc_entry()。實施ioctl的範圍很好,涵蓋了here。元數據方法與任何其他設備驅動程序一樣易於編碼,但它可能會給經驗豐富的實施者帶來概念障礙。

+0

謝謝,它的工作原理! – user979223

相關問題