劉江
【摘要】在嵌入式開發(fā)中我們有時需要在用戶層控制內核及其驅動的一些功能。傳統(tǒng)的方法是通過ioctl系統(tǒng)調用實現(xiàn)。而Sysfs為我們提供了一種更為方便的通過讀寫文件的方法。大大方便了嵌入式開發(fā)。
【關鍵詞】嵌入式;內核驅動;Sysfs文件系統(tǒng)
Sysfs是一個向用戶空間導出內核數據結構,對象和性質的文件系統(tǒng),它不僅提供了察看內核內部數據結構的能力,還可以修改這些數據結構。Sysfs已經成為老式的IOCTL機制的一種替代品。向內核發(fā)送神秘的ioctl通常需要一個C程序。與之相比,從/向Sysfs文件讀/寫一個值要簡單的多。一個簡單的shell命令就足夠了。
一、建立屬性文件
Sysfs是用于表現(xiàn)設備驅動模型的文件系統(tǒng),它基于ramfs。要使用Sysfs就需要了解Sysfs提供給外界的API。Sysfs文件系統(tǒng)中提供了四類文件的創(chuàng)建與管理,分別是目錄、普通文件、軟鏈接文件、二進制文件。目錄層次往往代表著設備驅動模型的結構,軟鏈接文件則代表著不同部分間的關系。比如某個設備的目錄只出現(xiàn)在/sys/devices下,其他地方涉及到它時只好用軟鏈接文件鏈接過去,保持了設備唯一的實例。而普通文件和二進制文件往往代表了設備的屬性,讀寫這些文件需要調用相應的屬性讀寫。
我們可以使用DEVICE_ATTR函數宏來建立一個屬性文件。函數宏DEVICE_ATTR原型是DRIVER_ATTR(_name,_mode,_show,_store)。函數宏DEVICE_ATTR內封裝的是__ATTR(_name,_mode,_show,_stroe)方法。_show:表示的是讀方法,_stroe表示的是寫方法。通過以下實例我們可以在Sysfs文件系統(tǒng)中建立一個dev_attr_watchdog的屬性文件。其中wd_show和wd_store分別為讀寫方法。
staticDEVICE_ATTR(watchdog,S_IRUGO|S_IWUSR,wd_show,wd_store);
將_mode設置為S_IRUGO|S_IWUSR使創(chuàng)建的屬性文件為可讀可寫。在驅動的初始化函數中需要調用device_create_file來使屬性文件與驅動設備文件關聯(lián)。函數原型為intdevice_create_file(structdevicedev,conststructdevice_attributeattr);
二、屬性的讀寫
注意到它和虛擬字符設備或proc項的read/write的作用很類似,但有一點不同是show/store函數上的buf/count參數是在Sysfs層已作了用戶區(qū)/內核區(qū)的內存復制,虛擬字符設備上常見的__user屬性在這里并不需要,因而也不需要多一次copy_from_user/copy_to_user,在show/store函數參數上的buf/count參數已經是內核區(qū)的地址,可以直接操作。
使用show和store方法時的注意事項:
(1)緩沖區(qū)的大小應總是為PAGE_SIZE個字節(jié)。多數情況下PAGE_SIZE=4096。
(2)show方法應該返回放入緩沖區(qū)的字節(jié)數。
(3)store方法應該返回實際使用的字節(jié)數。
(4)show和/或者store方法可能會出錯,所以當失敗時,記得返回錯誤值。
三、用戶層操作方法
建立屬性文件后Sysfs會在相應的目錄創(chuàng)建文件,通過讀寫此文件我們就可以直接向驅動層發(fā)送和讀取數據。例如上面DEVICE_ATTR調用會創(chuàng)建/sys/devices/platform/omap/omap_wdt/watchdog文件,此文件就是看門狗驅動在Sysfs中的屬性文件。當需要查看看門狗參數時可以使用cat命令讀取watchdog文件實現(xiàn)。修改看門狗參數時可以使用echo命令向watchdog文件寫入內容實現(xiàn)。
屬性文件的創(chuàng)建使用戶層通過驅動控制硬件的方式更加方便,只需使用系統(tǒng)自帶的cat和echo命令就能實現(xiàn)對硬件的控制,極大地方便了嵌入式開發(fā)。
四、結語
Sysfs給應用程序提供了統(tǒng)一訪問設備的接口。通過這一接口我們可以使用shell腳本在用戶層實現(xiàn)對內核及其驅動的控制。這一功能極大的方便了嵌入式應用的開發(fā)。但是目前Sysfs僅僅是提供了一個可以統(tǒng)一訪問設備的框架,但究竟是否支持Sysfs還需要各設備驅動程序的編程支持。但由于Sysfs強大的功能和用戶空間友好的特性,越來越多的子系統(tǒng)、設備驅動程序逐漸轉向Sysfs。
參考文獻
[1]WolfgangMauerer深入Linux內核架構[M].北京:人民郵電出版社,2010.
[2]JonathanCorber,AlessandroRubini&GregKroan-hartman Linux設備驅動程序[M].北京:中國電力出版社,2005.