上篇介紹了procfs接口的創(chuàng)建,今天再介紹一種debugfs接口的創(chuàng)建。
實(shí)現(xiàn)效果
在/sys/kernel/debug/
目錄下創(chuàng)建一個(gè)ion/test
文件,通過(guò)cat
、echo
的方式進(jìn)行讀寫(xiě)操作:
前期準(zhǔn)備
內(nèi)核配置打開(kāi)debugfs:
CONFIG_DEBUG_FS=y
掛載debugfs文件系統(tǒng):
mount -t debugfs none /sys/kernel/debug
代碼實(shí)現(xiàn)
讀寫(xiě)變量:
#include
#include
#include
static struct dentry *ion_dir;
static u64 test_u64 = 0;
static int __init debugfs_init(void)
{
//創(chuàng)建一個(gè)/sys/kernel/debug/ion目錄
ion_dir = debugfs_create_dir("ion", NULL);
if (!ion_dir) {
printk("ion_dir is null\\n");
return -1;
}
/* 創(chuàng)建/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");
運(yùn)行結(jié)果:
讀寫(xiě)字符串:
#include
#include
#include
#include
#include
#include
#include
static char ion_buf[512] = "hello\\n";
static struct dentry *ion_dir;
static int ion_open(struct inode *inode, struct file *filp)
{
//printk("ion open\\n");
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:%ld\\n", 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:%ld\\n", 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 MODULE\\n");
//創(chuàng)建一個(gè)/sys/kernel/debug/ion目錄
ion_dir = debugfs_create_dir("ion", NULL);
if (!ion_dir) {
printk("ion_dir is null\\n");
return -1;
}
/* 創(chuàng)建/sys/kernel/debug/ion/test文件 */
struct dentry *filent = debugfs_create_file("test", 0644, ion_dir, NULL, &my_fops);
if (!filent) {
printk("test file is null\\n");
return -1;
}
return 0;
}
static void __exit debugfs_exit(void)
{
debugfs_remove_recursive(ion_dir);
}
module_init(debugfs_init);