android底层驱动学习之debug方法(proc、sysfs、debugfs)
在调试内核驱动程序时,刚开始接触时,不知如何输出自己想要的信息,所以我们需要建立一些debug方法来获取。
下面先说下自己今天学的几种方法:
1. proc文件系统
a. 首先,proc文件系统是个什么东西呢
Linux系统上的/proc目录是一种文件系统,即proc文件系统。与其它常见的文件系统不同的是,/proc是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息,甚至可以通过更改其中某些文件来改变内核的运行状态。与sysfs对比相当于是XP系统。
b. 如何使用proc来debug内核呢?(对于3.10.0以后的kernel)
l 创建一个file_operations对象,如
static const structfile_operations fts_proc_fops =
{
.owner =THIS_MODULE,
.read = fts_debug_read,
.write = fts_debug_write,
};
l 通过proc_create创建对应的目录,如:
Struct proc_dir_entry fts_proc_entry = proc_create(PROC_NAME, 0777, NULL, &fts_proc_fops);由于第三个参数指的是parent,现在用了NULL,则默认在proc下面
l 最后就是丰富fts_debug_read和 fts_debug_write实现函数
在ft5526触屏中,read主要用于读取内核版本,write通过获取用户空间设下来的信息来写内核空间。
以上就是proc虚拟文件系统的用法。
2. sysfs虚拟文件系统
a. 什么是sysfs文件系统呢?
Sysfs文件系统是一个类 似于proc文件系统的特殊文件系统,用于将系统中的设备组织成层次结构,并向用户模式程序提供详细的内核数据结构信息,与proc相比,sysfs相当于是win 7
b. 如何创建和使用sysfs来debug问题呢?
l 首先创建自己的attribute数组,如:
static struct attribute *fts_attributes[]=
{
&dev_attr_ftstpfwver.attr,
&dev_attr_ftstpdriverver.attr,
&dev_attr_ftsfwupdate.attr,
&dev_attr_ftstprwreg.attr,
&dev_attr_ftsfwupgradeapp.attr,
&dev_attr_ftsgetprojectcode.attr,
&dev_attr_ftstpvendor.attr,
&dev_attr_debug.attr,
NULL
};
l 然后把attribute数组加入到attribute_group中,如:
static struct attribute_group fts_attribute_group=
{
.attrs = fts_attributes
};
l 那如何创建group呢?如:
sysfs_create_group(&client->dev.kobj,&fts_attribute_group);
l 如何加入具体的实现函数呢?如:
static DEVICE_ATTR(ftsfwupgradeapp,S_IRUGO|S_IWUSR, fts_fwupgradeapp_show, fts_fwupgradeapp_store);
颜色一样的函数名必须一样。那fts_fwupgradeapp_show, fts_fwupgradeapp_store这两个就是具体的实现函数了。
l 在用户空间如何使用呢?如:
先进入对应的目录,然后
cat ftsfwupgradeapp 这样就会执行fts_fwupgradeapp_show;
echo ftsfwupgradeapp 这样执行 fts_fwupgradeapp_store
3. debugfs虚拟文件系统
a. 什么是debugfs文件系统?
DebugFS,顾名思义,是一种用于内核调试的虚拟文件系统,内核开发者通过debugfs和用户空间交换数据。类似的虚拟文件系统还有procfs和sysfs等,这几种虚拟文件系统都并不实际存储在硬盘上,而是Linux内核运行起来后才建立起来。
procfs,其目的是反映进程的状态信息;而sysfs主要用于Linux设备模型。不论是procfs或是sysfs的接口应该保持相对稳定,因为用户态程序很可能会依赖它们
b. 如何使用debugfs来调试?
l 创建初始文件夹:
struct dentry data->dir =debugfs_create_dir(FTS_DEBUG_DIR_NAME, NULL);
l 定义fileoperations:
static const struct file_operations debug_dump_info_fops=
{
.owner = THIS_MODULE,
.open = debugfs_dump_info_open,
.read = seq_read,
.release = single_release,
};
l 在前一个文件夹下创建文件:
debugfs_create_file("dump_info", S_IRUSR | S_IWUSR,data->dir,data, &debug_dump_info_fops);
l 用法和proc其实是一样的,只是为了区别进程信息、设备信息、调试信息而已
4. proc、sysfs、debugfs的区别:
l procfs 历史最早,最初就是用来跟内核交互的唯一方式,用来获取处理器、内存、设备驱动、进程等各种信息;sysfs 跟 kobject 框架紧密联系,而 kobject 是为设备驱动模型而存在的,所以 sysfs 是为设备驱动服务的;debugfs 从名字来看就是为debug而生,所以更加灵活
l 默认情况下,它们分别挂载在/proc,/sys/,/sys/kernel/debug/
下面简单介绍这三个文件系统的用法。在介绍之前,请记下他们的官方文档:
l procfs —Documentation/filesystems/proc.txt
sysfs —Documentation/filesystems/sysfs.txt
debugfs —Documentation/filesystems/debugfs.txt