一、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),可通過以下指令檢視:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5iN4kjMkdDZlNWOxEzMhBDO3AjNkVTOzYGMjNWZkhTNj9CXzAzLchDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL2M3Lc9CX6MHc0RHaiojIsJye.png)
也可手動挂載到其它位置:
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的實作