天天看點

Linux核心空間-使用者空間通信之debugfs

一、debugfs檔案系統簡介

debugfs虛拟檔案系統是一種核心空間與使用者空間的接口,基于libfs庫實作,專用于開發人員調試,便于向使用者空間導出核心空間資料(當然,反方向也可以)。debugfs在linux核心版本2.6.10引入,作者是Greg Kroah-Hartman。

與procfs和sysfs不同,前者主要提供程序資訊(當然後來又加入裝置、記憶體、網絡等資訊,比較雜亂),後者主要提供裝置資訊,且有一個檔案提供一個值的“規則”,是Linux通用裝置模型的影射。debugfs沒有類似的限制,開發者可以放入任何資訊。

二、debugfs的使用

說明:函數接口請參見:http://docs.huihoo.com/doxygen/linux/kernel/3.7/fs_2debugfs_2file_8c.html#ad5e6fa7f4a3de8d751a7fff4d99e59f3

要使用debugfs,需要在核心編譯配置中配置CONFIG_DEBUG_FS選項,一般的發行版都會預設編譯進了核心,并且将其自動挂載預設的目錄(/sys/kernel/debug),可通過以下指令檢視:

Linux核心空間-使用者空間通信之debugfs

也可手動挂載到其它位置:

debugfs可以将核心中基本整數類型的變量導出為單個檔案,在使用者空間中可以直接對其讀寫(如使用cat、echo指令),隻要權限允許即可。支援的類型有:u8, u16, u32, u64, size_t和 bool。其中bool類型在核心中要定義為u32類型,在使用者空間中對應的檔案内容則顯示為Y或N。示例代碼如下:

debugfs提供的debugfs_create_blob函數可導出資料塊,示例代碼如下:

沒錯,debugfs提供的debugfs_blob_wrapper結構所導出的資料塊隻能讀取,不能修改。

debugfs提供的debugfs_create_u32_array函數可導出核心中u32類型的數組。示例代碼如下:

實作并不難,隻需實作struct file_operations的open、write、read方法即可。然後調用debugfs提供的debugfs_create_file即可。該方法的原型如下:

下面,仿照struct debugfs_blob_wrapper的實作,實作struct my_blob_wrapper和my_blob_wrapper_ops,提供可讀寫的“blob”:

① 在debugfs中建立的檔案和目錄在子產品退出時,并不會自動删除,可調用debugfs_remove_recursive删除整個目錄,或調用debugfs_remove删除單個檔案。

② u32_array在使用者空間檔案中顯示為空格隔開的元素

③ debugfs_create_x{8,16,32,64}與debugfs_create_u{8,16,32,64}的不同在于前者顯示為16進制,後者顯示為10進制

三、debugfs示例完整代碼

四、補充:debugfs bool的實作

繼續閱讀