2010-07-20 39 views
6

我是Linux內核模塊編程的新成員。從我迄今閱讀材料,我已經發現,有3種方式爲用戶程序來請求服務或/ dev中 我們對用戶程序和Linux內核模塊之間的通信有什麼選擇?

  • 將文件與Linux內核模塊

    1. 設備文件進行通信在/ proc文件系統
    2. ioctl()調用

    問題:我們對用戶程序和Linux內核模塊之間的通信有什麼其他選擇?

  • 回答

    6

    您的選項3)實際上是選項1)的子選項 - ioctl()是與設備文件交互的一種方式(read()write()是常用方式)。

    兩個值得考慮其他的方法是:

    • sysfs文件系統;
    • Netlink套接字。
    +0

    網絡鏈路插座看好,但一直沒能找到它使用的netlink套接字工作的例子。管理寫我自己但仍然很多問題沒有答案。 – binW 2010-07-23 11:18:03

    6

    基本上,許多標準的IPC機制 - 比較。 http://en.wikipedia.org/wiki/Inter-process_communication - 可用於:

    1. 文件和存儲器映射的文件:設備文件(如上述)或類似的特殊文件中的/ dev,PROCFS,sysfs中,debugfs,或自己的文件系統,笛卡兒積具有讀/寫,IOCTL,MMAP

    2. 可能信號(使用與KTHREAD)

    3. 套接字:使用所選擇的協議:TCP,UDP(CF 。knfsd,但可能不會太容易),PF_LOCAL,或網絡鏈路(多子接口 - 基礎網絡鏈路,genetlink,連接器,...)

    此外,

    4. 系統調用(不雖然真的可以使用)

    5. 網絡接口(類似於tun)。 //git.netfilter.org/libmnl(用戶空間側)

  • 淨/核心/的rtnetlink:

    工作網絡鏈路的例子 - - 僅舉幾可以在例如

    • GIT中找到.c(base netlink)
    • net/netfilter/nf_conntrack_netlink.c(nfnetlink)
    • fs/quota/netlink。C(genetlink)
  • 3
    +1

    您的權利鏈接包含大量有用的信息,但鏈接不是答案。請參閱http://stackoverflow.com/questions/how-to-answer這解釋了爲什麼簡單鏈接不是我們想要的。 – stsquad 2012-01-12 12:32:06

    +0

    我回答了你的「」我們有什麼其他的選擇用於用戶程序和linux內核模塊之間的通信?「」問題的一部分..如果你問了其他選項,它們是如何工作的,我會寫幾個關於他們的網頁,我爲什麼給你這個鏈接,因爲它有他們的工作實例,我認爲這是自我解釋。 – Santi1986 2012-01-16 10:09:07

    +1

    由於stackoverflow頁面解釋了外部頁面的鏈接可能是暫時的。如果鏈接頁面消失,答案突然變得毫無用處。沒有人建議你需要寫一篇文章,但總結選項會使它成爲一個更有用的答案。 – stsquad 2012-01-16 14:30:12

    1

    This Linux document給出了一些的,其中內核和用戶空間可以互動的方式(通信)。他們是以下。

    • Procfs,sysfs和類似的機制。這也包括/dev條目,以及內核空間在用戶空間中公開文件的所有方法(/ proc,/ dev等等,條目基本上是從內核空間公開的文件)。
    • Socket based mechanisms。 Netlink是一種套接字,專門用於用戶空間和內核空間之間的通信。
    • System calls
    • Upcalls。內核在用戶空間中執行代碼。例如產生一個新的過程。
    • mmap - 存儲器映射內核存儲器的區域到用戶空間。這允許內核和用戶空間讀/寫同一個內存區域。

    除了這些,下面的列表中增加了我知道的一些其他機制。

    • Interrupts。用戶空間可以引發中斷與內核空間通信。例如,一些CPU使用int80進行系統調用(而其他CPU可能使用不同的機制,如syscall指令)。內核必須事先定義相應的中斷處理程序。
    • vDSO/vsyscall - 這些都是在Linux內核機制以優化一些系統調用的執行。這個想法是有一個共享內存區域,當進程進行系統調用時,用戶空間庫從該區域獲取數據,而不是實際調用相應的系統調用。這節省了上下文切換開銷。