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


1.	內核啟動參數 (__setup)
Linux 提供了一種通過 bootloader 向其傳輸啟動參數的功能,內核開發者可以通過這種方式來向內核傳輸資料,從而控制內核啟動行程。
通常的使用方式是,定義一個分析參數的函數,而後使用內核提供的巨集 __setup 把它註冊到內核中,該巨集定義在 linux/init.h 中,
因此要使用它必須包含該標頭檔:
__setup("para_name=", parse_func)
para_name 為參數名,
parse_func 為分析參數值的函數,它負責把該參數的值轉換成相應的內核變數的值並設置那個內核變數。
內核為整數參數值的分析提供了函數 get_option 和 get_options,前者用於分析參數值為一個整數的情況,
而後者用於分析參數值為逗號分割的一系列整數的情況,對於參數值為字串的情況,需要開發者自定義相應的分析函數。

在 program-examples/kern-boot-params.c 說明了三種情況的使用。
該程式列舉了參數為一個整數、逗號分割的整數串以及字串三種情況,
讀者要想測試該程式,需要把該程式拷貝到要使用的內核的源碼目錄樹的一個目錄下,
為了避免與內核其他部分混淆,作者建議在內核源碼樹的根目錄下創建一個新目錄,
如 examples,然後把該程式拷貝到 examples 目錄下並重新命名為 setup_example.c,
並且為該目錄創建一個 Makefile 文件:
obj-y = setup_example.o
Makefile 僅許這一行就足夠了,
然後需要修改源碼樹的根目錄下的 Makefile文件的一行,把下面行
core-y          := usr/
修改為
core-y          := usr/ examples/
注意:如果讀者創建的新目錄和重新命名的檔案名與上面不同,需要修改上面所說 Makefile 文件相應的位置。 
做完以上工作就可以按照內核構建步驟去構建新的內核,在構建好內核並設置好 lilo 或 grub 為該內核的啟動列舉後,
就可以啟動該內核,然後使用lilo或grub的編輯功能為該內核的參動參數行增加如下參數串:
setup_example_int=1234
setup_example_int_array=100,200,300,400
setup_example_string=Thisisatest
當然,該參數串也可以直接寫入到 lilo 或 grub 的配置文件中對應於該新內核的內核命令行參數串中。
讀者可以使用其他參數值來測試該功能。
下面是作者系統上使用上面參數行的輸出:
setup_example_int=1234
setup_example_int_array=100,200,300,400
setup_example_int_array includes 4 intergers
setup_example_string=Thisisatest
讀者可以使用 dmesg | grep setup 來查看該程式的輸出。

---
arrow
arrow
    全站熱搜

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