在调试驱动,可能需要对驱动里的某些变量进行读写,或函数调用。可通过sysfs接口创建驱动对应的属性,使得可以在用户空间通过sysfs接口的show和store函数与硬件交互;

Syss接口可通过sysfs_create_group()来创建,如果设备驱动要创建,需要用到函数宏DEVICE_ATTR;

另外总线对应BUS_ATTR、设备驱动对应DRIVER_ATTR、类(class)对应CLASS_ATTR,均在kernel/include/linux/device.h下定义:

 1 //下面的show和store只是简单举例2 static ssize_t gpio_show(struct device *d, struct device_attribute*attr, char *buf)3 {4        printk("gpio_show()\n");5        returnpr_info("store\n");6 }7  8 static ssize_t gpio_store(struct device *d, struct device_attribute *attr,const char *buf,size_t count)9 {
10        printk("gpio_store()\n");
11        returnpr_info("store\n");
12 }
13
14 //用DEVICE_ATTR宏创建属性gpio文件,如果show()或是store()没有功能,就以NULL代替
15 static DEVICE_ATTR(gpio, S_IWUSR |S_IRUGO, gpio_show, gpio_store);
16
17 //属性结构体数组最后一项必须以NULL结尾。
18 static struct attribute *gpio_attrs[] = {
19        &dev_attr_gpio.attr,
20        NULL
21 };

DEVICE_ATTR:

DEVICE_ATTR 的定义DEVICE_ATTR(_name,_mode, _show, _store);可知这里gpio是name,mode是S_IWUSR |S_IRUGO,读操作_show是gpio_show函数,写操作_store 是gpio_store函数;

因为:

1 #define DEVICE_ATTR(_name, _mode, _show, _store) \
2     struct device_attribute dev_attr_##_name = __ATTR(_name, _mode, _show, _store)

device_attribute:

1 /* interface for exporting device attributes */
2 struct device_attribute {
3     struct attribute    attr;
4     ssize_t (*show)(struct device *dev, struct device_attribute *attr,
5             char *buf);
6     ssize_t (*store)(struct device *dev, struct device_attribute *attr,
7              const char *buf, size_t count);
8 };

Mode是权限位,在kernel/include/uapi/linux/stat.h

 1 #define S_IRWXU 00700 //用户可读写和执行2 #define S_IRUSR 00400//用户可读3 #define S_IWUSR 00200//用户可写4 #define S_IXUSR 00100//用户可执行5  6 #define S_IRWXG 00070//用户组可读写和执行7 #define S_IRGRP 00040//用户组可读8 #define S_IWGRP 00020//用户组可写9 #define S_IXGRP 00010//用户组可执行
10
11 #define S_IRWXO 00007//其他可读写和执行
12 #define S_IROTH 00004//其他可读
13 #define S_IWOTH 00002//其他可写
14 #define S_IXOTH 00001//其他可执行

device_attribute结构体

为了使对属性的读写变得有意义,一般将attribute结构嵌入到其他数据结构中。子系统通常都会定义自己的属性结构,并且提供添加和删除属性文件的包装函数,比如设备属性结构体定义:

1 /* interface for exporting device attributes */
2 struct device_attribute {
3        struct attribute    attr;
4        ssize_t (*show)(structdevice *dev, struct device_attribute *attr,
5                      char*buf);
6        ssize_t (*store)(structdevice *dev, struct device_attribute *attr,
7                       const char *buf, size_t count);
8 };

2.     定义attribute属性结构体数组到属性组中:

 1 static const struct attribute_group gpio_attr_grp = {2        .attrs = gpio_attrs,3 }4 我们这里只有一个属性结构体数组只有一个成员,可以有多个,比如:5 static struct attribute *gpio_keys_attrs[] = {6        &dev_attr_keys.attr,7        &dev_attr_switches.attr,8        &dev_attr_disabled_keys.attr,9        &dev_attr_disabled_switches.attr,
10        &dev_attr_test.attr,
11        NULL,
12 };

属性attribute结构体定义:

1 struct attribute {
2        const char           *name;
3        umode_t                     mode;
4 #ifdef CONFIG_DEBUG_LOCK_ALLOC
5        bool                     ignore_lockdep:1;
6        struct lock_class_key *key;
7        struct lock_class_key skey;
8 #endif
9 };

创建sysfs接口后,就可以在adb shell 终端查看到和操作接口了。当我们将数据 echo 到接口中时,在用户空间完成了一次 write 操作,对应到 kernel ,调用了驱动中的”store”。当我们cat一个接口时则会调用”show” 。这样就建立了 android 层到 kernel 的桥梁,操作的细节在”show”和”store” 中完成的。

3.     创建属性文件的sysfs接口:

1 ret = sysfs_create_group(&pdev->dev.kobj,&gpio_attr_grp);
2 sysfs_create_group()在kobj目录下创建一个属性集合,并显示集合中的属性文件。如果文件已存在,会报错。
3
4 //删除接口
5 sysfs_remove_group(&pdev->dev.kobj,&gpio_keys_attr_group);
6 sysfs_remove_group()在kobj目录下删除一个属性集合,并删除集合中的属性文件

Linux内核调试sysfs相关推荐

  1. linux内核调试指南

    Hunnad的专栏 * 条新通知 * 登录 * 注册 * 欢迎 * 退出 * 我的博客 * 配置 * 写文章 * 文章管理 * 博客首页 * * * * 空间 * 博客 * 好友 * 相册 * 留言 ...

  2. Linux Kernel - Debug Guide (Linux内核调试指南 )

    linux内核调试指南 一些前言 作者前言 知识从哪里来 为什么撰写本文档 为什么需要汇编级调试 ***第一部分:基础知识*** 总纲:内核世界的陷阱 源码阅读的陷阱 代码调试的陷阱 原理理解的陷阱 ...

  3. Linux内核调试方法【转】

    转自:http://www.cnblogs.com/shineshqw/articles/2359114.html kdb:只能在汇编代码级进行调试: 优点是不需要两台机器进行调试. gdb:在调试模 ...

  4. 开源项目-基于Intel VT技术的Linux内核调试器

    本开源项目将硬件虚拟化技术应用在内核调试器上,使内核调试器成为VMM,将操作系统置于虚拟机中运行,即操作系统成为GuestOS,以这样的一种形式进行调试,最主要的好处就是调试器对操作系统完全透明.如下 ...

  5. Linux内核调试 - 一般人儿我都不告诉他(一)【转】

    转自:http://www.cnblogs.com/armlinux/archive/2011/04/14/2396821.html 悄悄地进入Linux内核调试(一) 本文基址:http://blo ...

  6. 基于IntelVt技术的Linux内核调试器 - 2

    4 基于IntelVt技术的Linux内核调试器- 调试器设计与实现(2):调试核心 4.1反汇编引擎 如果说调试框架是一个调试器的灵魂,那么接口与反汇编引擎就是一个调试器的身体.我们在调试过程中是要 ...

  7. Linux 内核调试器 调试指南

    Linux 内核调试器内幕 KDB 入门指南 Hariprasad Nellitheertha (nharipra@in.ibm.com), 软件工程师, IBM 简介: 调试内核问题时,能够跟踪内核 ...

  8. Linux内核调试的方式以及工具集锦

    Linux内核调试的方式以及工具集锦 CSDN GitHub Linux内核调试的方式以及工具集锦 LDD-LinuxDeviceDrivers/study/debug  本作品采用知识共享署名-非商 ...

  9. Linux内核调试原理和工具介绍--理解静态插装/动态插装、tracepoint、ftrace、kprobe、SystemTap、Perf、eBPF

    可以将linux跟踪系统分成Tracer(跟踪数据来自哪里),数据收集分析(如"ftrace")和跟踪前端(更方便的用户态工具). 1. 数据源(Tracers) printk 是 ...

最新文章

  1. python每隔2s执行一次hello world!
  2. Node.js session 存储的几种方法
  3. BAT 才不关心币价,19年的5大重点在这里!
  4. linux下的tmpfs目录重启后文件全部消失
  5. 51nod 1536不一样的猜数游戏 思路:O(n)素数筛选法。同Codeforces 576A Vasya and Petya‘s Game。
  6. 学习underscore源码整体架构,打造属于自己的函数式编程类库
  7. 阿里腾讯前端一面小结
  8. php中session总结,PHP5中Session总结(一)
  9. 【Uva 11604 编码都有歧义了】
  10. nodejs 批处理执行 app.js
  11. java每轮排序结果,冒泡排序及其优化java
  12. oracle视图定期执行,oracle job 定时执行 存储过程
  13. android-Vibrator的使用
  14. HTML5 data-* 自定义属性 ---转载 原文地址:https://www.cnblogs.com/dolphinX/p/3348458.html...
  15. 计算机信息资源管理岗位,信息资源管理专业的可以报考公务员的哪些职位?
  16. grub4dos linux live,Grub4DOS 正常引导 Ubuntu 16.04 镜像文件
  17. Termux安装node
  18. 【Opencv项目实战】背景替换:动态背景移除与替换(cvzone+MediaPipe)
  19. 斗鱼直播地址抓取——转载
  20. vue-cli项目局域网访问

热门文章

  1. 我的世界最危险的服务器生存系列,《我的世界》极具危险的服务器
  2. Harbor的安装部署(二)
  3. HDFS概述和设计目标
  4. IE6的重定向页面无法跳转解决
  5. win10 查看文件扩展名 - 教程篇
  6. html 页面数据显示溢出bug? - 提问篇
  7. Win10快查、关闭开机自启动软件 - 教程篇
  8. 用python计算列表元素之和_python实现计算列表元素之和
  9. 简洁商城系统后台管理模板
  10. HTML5清爽简洁外贸网站模板