实现效果
在/sys/kernel/debug/
目录下创建一个ion/test
文件,通过cat
、echo
的方式进行读写操作:
前期准备
内核配置打开debugfs:
CONFIG_DEBUG_FS=y
挂载debugfs文件系统:
mount -t debugfs none /sys/kernel/debug
代码实现
读写变量:
#include < linux/debugfs.h >
#include < linux/module.h >
#include < linux/types.h >
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");
运行结果:
读写字符串:
#include < linux/debugfs.h >
#include < linux/module.h >
#include < linux/fs.h >
#include < linux/uaccess.h >
#include < linux/errno.h >
#include < linux/dcache.h >
#include < linux/types.h >
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");
运行结果:
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
接口
+关注
关注
33文章
8486浏览量
150807 -
驱动
+关注
关注
12文章
1824浏览量
85169 -
Linux
+关注
关注
87文章
11219浏览量
208872 -
代码
+关注
关注
30文章
4741浏览量
68324
发布评论请先 登录
相关推荐
Linux MTD 源代码分析
Linux MTD 源代码分析
Linux MTD介绍:设备层和原始设备层的函数调用关系(红色部分需要我们实现):NOR型Flash芯片驱动
发表于 02-08 16:43
•9次下载
你知道Linux内核里的DebugFS?
DebugFS,顾名思义,是一种用于内核调试的虚拟文件系统,内核开发者通过debugfs和用户空间交换数据。
发表于 04-25 18:55
•1871次阅读
嵌入式Linux系统的驱动原理和使用ARM Linux实现SPI驱动程序的说明
介绍嵌入式Linux系统的驱动原理;分析SPI协议的通信原理和微处理器S3C2440A中SPI接口的硬件结构;阐述SPI驱动程序的实现过程。
发表于 11-14 16:36
•11次下载
linux系统的驱动层实现原理
原理就是将硬件操作的接口全都放到驱动链表上,在驱动层实现device的open、read、write等操作。当然这样做也有弊端,就是驱动fi
发表于 11-02 09:59
•877次阅读
linux内核中的debugfs该怎样去使用呢?
debugfs可用于内核向用户空间提供信息,debugfs是个小型的文件系统,与/proc和sysfs不同,debugfs没有较为严苛的规则和定义,我们可以在里面放置想要的任何信息,以便于系统开发和调试。
Linux驱动函数接口说明
函数接口说明 创建目录、文件函数: /* 创建目录 */ struct dentry *debugfs_create_dir( const char *name, struct dentry
评论