close

原文網址 http://blog.xuite.net/tzeng015/twblog/113272242

 

在 Linux 下用戶空間與內核空間資料交換的九種方式,包括
http://svn.openfoundry.org/vwebsdk/Reference/switch.txt

 

在 Linux 下用戶空間與內核空間資料交換的九種方式,包括
1. 內核啟動參數 (__setup)
2. 模組參數與 sysfs (module_param)
3. sysctl (register_sysctl_table)
4. 系統調用
5. netlink 是一種雙向的資料交換方式,它使用起來非常簡單高效,特別是它的廣播特性在一些應用中非常方便。
6. procfs 一般用于向用戶保留少量的數據訊息,或用戶透過它設置內核變量從而控制內核行為。
7. seq_file 是單向的,即只能向內核傳遞,而不能從內核獲取,其餘的均可以進行雙向資料交換,即既可以從用戶應用傳遞給內核,有可以從內核傳遞給應用態應用。
實際上倚賴于 procfs,因此為了使用 seq_file,必須使內核支持 procfs。
8. debugfs 用于內核開發者調試使用,它比其他集中模式都方便,但是僅用于簡單類型的變量處理。
9. relayfs 是一種非常複雜的數據交換模式,要想準確使用並不容易,但是如果使用得當,它遠比 procfs 和 seq_file 功能強大。


5. netlink
Netlink 相對於系統調用,ioctl 以及 /proc 文件系統而言具有以下優點:
I. 為了使用 netlink, 用戶僅需要在 include/linux/netlink.h 中增加一個新類型的 netlink 協定定義即可,
如 #define NETLINK_MYTEST 17 然後,內核和用戶態應用就可以立即通過 socket API 使用該 netlink 協定類型進行資料交換。
但系統調用需要增加新的系統調用, ioctl 則需要增加設備或文件,那需要不少代碼,
proc 文件系統則需要在 /proc 下添加新的文件或目錄,那將使本來就混亂的 /proc 更加混亂。
II. netlink 是一種非同步通信機制,在內核與用戶態應用之間傳遞的消息保存在 socket 緩存佇列中,
發送消息只是把消息保存在接收者的 socket 的接收佇列,而不需要等待接收者收到消息,
但系統調用與 ioctl 則是同步通信機制,如果傳遞的資料太長,將影響調度粒度。
III.使用 netlink 的內核部分可以採用模組的方式實現,使用 netlink 的應用部分和內核部分沒有編譯時依賴,
但系統調用就有依賴,而且新的系統調用的實現必須靜態地連接到內核中,它無法在模組中實現,
使用新系統調用的應用在編譯時需要依賴內核。
IV. netlink 支援多播,內核模組或應用可以把消息多播給一個 netlink 組,
屬於該 neilink 組的任何內核模組或應用都能接收到該消息,
內核事件向用戶態的通知機制就使用了這一特性,任何對內核事件感興趣的應用都能收到該子系統發送的內核事件,
在後面的文章中將介紹這一機制的使用。
V. 內核可以使用 netlink 首先發起會話,但系統調用和 ioctl 只能由用戶應用發起調用。
VI. netlink 使用標準的 socket API,因此很容易使用,但系統調用和 ioctl 則需要專門的培訓才能使用。

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 橘 的頭像

    小橘的小天地

    橘 發表在 痞客邦 留言(0) 人氣()