點擊上方“嵌入式linux充電站”,選擇“置頂/星標公眾號”

上篇介紹了procfs接口的創建,今天再介紹一種debugfs接口的創建。
實現效果
在/sys/kernel/debug/目錄下創建一個ion/test文件,通過cat、echo的方式進行讀寫操作:


前期準備
內核配置打開debugfs:
CONFIG_DEBUG_FS=y
掛載debugfs文件系統:
mount?-t?debugfs?none?/sys/kernel/debug
代碼實現
讀寫變量:
#include?<linux> #include?<linux> #include?<linux> static?struct?dentry?*ion_dir; static?u64?test_u64?=?0; static?int?__init?debugfs_init(void) { ????//創建一個/sys/kernel/debug/ion目錄 ????ion_dir?=?debugfs_create_dir("ion",?NULL); ????if?(!ion_dir)?{ ????????printk("ion_dir?is?nulln"); ????????return?-1; ????} ????/*?創建/sys/kernel/debug/ion/test_u64文件?*/ ????debugfs_create_u64("test_u64",?0644, ????????????????????????ion_dir,?&test_u64); ????return?0; } static?void?__exit?debugfs_exit(void) { ????debugfs_remove_recursive(ion_dir); } module_init(debugfs_init); module_exit(debugfs_exit); MODULE_LICENSE("GPL");</linux></linux></linux>
運行結果:

讀寫字符串:
#include?<linux> #include?<linux> #include?<linux> #include?<linux> #include?<linux> #include?<linux> #include?<linux> static?char?ion_buf[512]?=?"hellon"; static?struct?dentry?*ion_dir; static?int?ion_open(struct?inode?*inode,?struct?file?*filp) { ????//printk("ion?openn"); ????return?0; } ssize_t?ion_read(struct?file?*filp,?char?__user?*buf,?size_t?count,?loff_t?*offp) { ????int?retval?=?0; ????if?((*offp?+?count)?>?512) ????????count?=?512?-?*offp; ????if?(copy_to_user(buf,?ion_buf+*offp,?count))?{ ????????printk("copy?to?user?failed,?count:%ldn",?count); ????????retval?=?-EFAULT; ????????goto?out; ????} ????*offp?+=?count; ????retval?=?count; out: ????return?retval; } ssize_t?ion_write(struct?file?*filp,?const?char?__user?*buff,?size_t?count,?loff_t?*offp) { ????int?retval; ????if?(*offp?>?512) ????????return?0; ????if?(*offp?+?count?>?512) ????????count?=?512?-?*offp; ????if?(copy_from_user(ion_buf+*offp,?buff,?count))?{ ????????printk("copy?from?user?failed,?count:%ldn",?count); ????????retval?=?-EFAULT; ????????goto?out; ????} ????*offp?+=?count; ????retval?=?count; out: ????return?retval; } struct?file_operations?my_fops?=?{ ????.owner?=?THIS_MODULE, ????.read?=?ion_read, ????.write?=?ion_write, ????.open?=?ion_open, }; static?int?__init?debugfs_init(void) { ????printk("INIT?MODULEn"); ????//創建一個/sys/kernel/debug/ion目錄 ????ion_dir?=?debugfs_create_dir("ion",?NULL); ????if?(!ion_dir)?{ ????????printk("ion_dir?is?nulln"); ????????return?-1; ????} ????/*?創建/sys/kernel/debug/ion/test文件?*/ ????struct?dentry?*filent?=?debugfs_create_file("test",?0644,?ion_dir,?NULL,?&my_fops); ????if?(!filent)?{ ????????printk("test?file?is?nulln"); ????????return?-1; ????} ????return?0; } static?void?__exit?debugfs_exit(void) { ????debugfs_remove_recursive(ion_dir); } module_init(debugfs_init); module_exit(debugfs_exit); MODULE_LICENSE("GPL");</linux></linux></linux></linux></linux></linux></linux>
運行結果:

函數接口說明
創建目錄、文件函數:
/*?創建目錄?*/ struct?dentry?*debugfs_create_dir(const?char?*name,?struct?dentry?*parent); /*創建節點?*/ struct?dentry?*debugfs_create_file(const?char?*name,?umode_t?mode, ???????????????????????????????????struct?dentry?*parent,?void?*data, ???????????????????????????????????const?struct?file_operations?*fops);
name:要創建的/sys/kernel/debug下的目錄名
parent:父目錄,用struct dentry結構體表示。如果直接在/sys/kernel/debug/下創建文件,則為NULL
創建不同大小的文件:
//創建十進制的無符號文件 void?debugfs_create_u8(const?char?*name,?umode_t?mode, ???????????????????????struct?dentry?*parent,?u8?*value); void?debugfs_create_u16(const?char?*name,?umode_t?mode, ????????????????????????struct?dentry?*parent,?u16?*value); void?debugfs_create_u32(const?char?*name,?umode_t?mode, ????????????????????????struct?dentry?*parent,?u32?*value); void?debugfs_create_u64(const?char?*name,?umode_t?mode, ????????????????????????struct?dentry?*parent,?u64?*value); //創建十六進制的無符號文件 void?debugfs_create_x8(const?char?*name,?umode_t?mode, ???????????????????????struct?dentry?*parent,?u8?*value); void?debugfs_create_x16(const?char?*name,?umode_t?mode, ????????????????????????struct?dentry?*parent,?u16?*value); void?debugfs_create_x32(const?char?*name,?umode_t?mode, ????????????????????????struct?dentry?*parent,?u32?*value); void?debugfs_create_x64(const?char?*name,?umode_t?mode, ????????????????????????struct?dentry?*parent,?u64?*value);
更詳細的debugfs用法請參考官方文檔:Documentation/filesystems/debugfs.txt
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END