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 功能強大。


--
2.	模組參數與 sysfs (module_param)
內核子系統或設備驅動可以直接編譯到內核,也可以編譯成模組,
如果編譯到內核,可以使用前一節介紹的方法通過內核啟動參數來向它們傳遞參數,
如果編譯成模組,則可以通過命令行在插入模組時傳遞參數,或者在運行時,通過 sysfs 來設置或讀取模組資料。

sysfs 是一個基於記憶體的文件系統,實際上它基於 ramfs, sysfs 提供了一種把內核資料結構,
它們的屬性以及屬性與資料結構的聯繫開放給用戶態的方式,它與 kobject 子系統緊密地結合在一起,
因此內核開發者不需要直接使用它,而是內核的各個子系統使用它。
用戶要想使用 sysfs 讀取和設置內核參數,僅需裝載 sysfs 就可以通過文件操作應用來讀取和設置內核通過 sysfs 開放給用戶的各個參數:
$ mkdir -p /var/sysfs
$ mount -t sysfs sysfs /var/sysfs
注意,不要把 sysfs 和 sysctl 混淆,
sysctl 是內核的一些控制參數,其目的是方便用戶對內核的行程進行控制,
而 sysfs 僅僅是把內核的 kobject 物件的層次關係與屬性開放給用戶查看,因此 sysfs 的絕大部分是唯讀的,
模組作為一個 kobject 也被出口到 sysfs,模組參數則是作為模組屬性出口的,
內核實現者為模組的使用提供了更靈活的方式,
允許用戶設置模組參數在 sysfs 的可見性並允許用戶在編寫模組時設置這些參數在 sysfs 下的訪問許可權,
然後用戶就可以通過 sysfs 來查看和設置模組參數,從而使得用戶能在模組運行時控制模組行為。

對於模組而言,聲明為 static 的變數都可以通過命令行來設置,
但要想在 sysfs 下可見,必須通過巨集 module_param 來顯式聲明,該巨集有三個參數,
第一個為參數名,即已經定義的變數名,
第二個參數則為變數類型,可用的類型有 byte, short, ushort, int, uint, long, ulong, charp 和 bool 或 invbool,
	分別對應於 c 類型 char, short, unsigned short, int, unsigned int, long, unsigned long, char * 和 int,
	用戶也可以自定義類型 XXX(如果用戶自己定義了 param_get_XXX,param_set_XXX 和 param_check_XXX)。
第三個參數用於指定訪問許可權,如果為 0,該參數將不出現在 sysfs 文件系統中,
	允許的訪問許可權為 S_IRUSR, S_IWUSR, S_IRGRP, S_IWGRP, S_IROTH   和 S_IWOTH 的組合,
	    它們分別對應於 用戶讀,  用戶寫,  用戶組讀,用戶組寫,其他用戶讀和 其他用戶寫,因此用文件的訪問許可權設置是一致的。
在 program-examples/module-param-exam.c 是一個利用模組參數和 sysfs 來進行用戶態與內核態資料交互的例子。
該模組有三個參數可以通過命令行設置,下面是作者系統上的運行結果示例:
$ insmod ./module-param-exam.ko my_invisible_int=10 my_visible_int=20 
mystring="Hello,World"
my_invisible_int = 10
my_visible_int = 20
mystring = 'Hello,World'
$ ls /sys/module/module_param_exam/parameters/
mystring  my_visible_int
$ cat /sys/module/module_param_exam/parameters/mystring
Hello,World
$ cat /sys/module/module_param_exam/parameters/my_visible_int
20
$ echo 2000 > /sys/module/module_param_exam/parameters/my_visible_int
$ cat /sys/module/module_param_exam/parameters/my_visible_int
2000
$ echo "abc" > /sys/module/module_param_exam/parameters/mystring
$ cat /sys/module/module_param_exam/parameters/mystring
abc
$ rmmod module_param_exam
my_invisible_int = 10
my_visible_int = 2000
mystring = 'abc'

 

arrow
arrow
    全站熱搜

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