这个宏我们在内核里面使用非常频繁,这个宏的作用可以抛出sys设备节点给用户使用。用户可以读写sys/class下面的文件节点,以达到控制内核驱动的功效。

比如,像这样的设备节点

weiqifa:/sys/class/zigbee/onoff $ ls
gpio_en power subsystem uevent
weiqifa:/sys/class/zigbee/onoff $

使用方法

static ssize_t gpio_store_en(struct device *dev,struct device_attribute *attr,const char *buf, size_t count)
{struct gpio_dev_data *dev_data = dev_get_drvdata(dev);unsigned long value = 0;int ret;/*将echo进来的buf转换成整型*/ret = kstrtoul(buf, 16, &value);if (ret < 0) {printk( "%s:kstrtoul failed, ret=%d\n", __func__, ret);return ret;}printk("%s: en value : %d\n", __func__, (int)value);if (value) {gpio_direction_output(dev_data->en_pin, dev_data->en_val);dev_data->gpio_val = 1;} else {gpio_direction_output(dev_data->en_pin, !dev_data->en_val);dev_data->gpio_val = 0;}return count;
}static  char mybuf[10]="123";/*cat命令时,将会调用该函数*/
static ssize_t gpio_show_en(struct device *dev,struct device_attribute *attr, char *buf)
{struct gpio_dev_data *dev_data = dev_get_drvdata(dev);snprintf(mybuf,sizeof(mybuf),"%d",dev_data->gpio_val);return sprintf(buf, "%s\n", mybuf);
}static DEVICE_ATTR(gpio_en,0664,gpio_show_en, gpio_store_en);...dev_class = class_create(THIS_MODULE, class_name);
ctl_dev = device_create(dev_class, NULL, 0, NULL, "onoff");
if (IS_ERR(ctl_dev)) {dev_err(ctl_dev, "Failed to create device\n");ret = PTR_ERR(ctl_dev);goto err_create_dev;
}err = device_create_file(ctl_dev, &dev_attr_gpio_en);
if (err){printk("driver_create_file = %d\n", err);
}

DEVICE_ATTR 0777 引发的血案

如果你想给一个节点设置 0777 或者写操作,那你编译的时候,会出现下面的编译错误

/home/weiqifa/mt8167s-9.0-sdk/kernel-4.4/include/linux/kernel.h:840:3: note: in expansion of macro 'BUILD_BUG_ON_ZERO'BUILD_BUG_ON_ZERO((perms) & 2) +     \^
/home/weiqifa/mt8167s-9.0-sdk/kernel-4.4/include/linux/sysfs.h:102:12: note: in expansion of macro 'VERIFY_OCTAL_PERMISSIONS'.mode = VERIFY_OCTAL_PERMISSIONS(_mode) },  \^
/home/weiqifa/mt8167s-9.0-sdk/kernel-4.4/include/linux/device.h:573:45: note: in expansion of macro '__ATTR'struct device_attribute dev_attr_##_name = __ATTR(_name, _mode, _show, _store)^
/home/weiqifa/mt8167s-9.0-sdk/kernel-4.4/drivers/misc/gpio_control.c:62:8: note: in expansion of macro 'DEVICE_ATTR'static DEVICE_ATTR(gpio_en,0777,gpio_show_en, gpio_store_en);

这个错误的原因主要是出现在

VERIFY_OCTAL_PERMISSIONS

这个宏上面

这个宏定义在

include/linux/

下面

/* Permissions on a sysfs file: you didn't miss the 0 prefix did you? */
#define VERIFY_OCTAL_PERMISSIONS(perms)      \(BUILD_BUG_ON_ZERO((perms) < 0) +     \BUILD_BUG_ON_ZERO((perms) > 0777) +     \/* USER_READABLE >= GROUP_READABLE >= OTHER_READABLE */  \BUILD_BUG_ON_ZERO((((perms) >> 6) & 4) < (((perms) >> 3) & 4)) + \BUILD_BUG_ON_ZERO((((perms) >> 3) & 4) < ((perms) & 4)) +  \/* USER_WRITABLE >= GROUP_WRITABLE */     \BUILD_BUG_ON_ZERO((((perms) >> 6) & 2) < (((perms) >> 3) & 2)) + \/* OTHER_WRITABLE?  Generally considered a bad idea. */  \BUILD_BUG_ON_ZERO((perms) & 2) +     \(perms))
#endif

BUILD_BUG_ON_ZERO 的作用

这个宏的作用是,如果里面传进来的值是 「true」编译的时候就会出错。

写个代码举个例子

#include <stdio.h>
#include <stdbool.h>
//#define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)]))
/* Force a compilation error if condition is true */
#define BUILD_BUG_ON(condition) ((void)BUILD_BUG_ON_ZERO(condition))
/* Force a compilation error if condition is true, but also produce aresult (of value 0 and type size_t), so the expression can be usede.g. in a structure initializer (or where-ever else comma expressionsaren't permitted). */
#define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); }))
#define BUILD_BUG_ON_NULL(e) ((void *)sizeof(struct { int:-!!(e); }))
int main()
{BUILD_BUG_ON(1!=0);bool zero = false;printf("%d\n", !!zero);printf("%d\n", !zero);return 0;
}


输出


VERIFY_OCTAL_PERMISSIONS 的作用?

所以在回到这个宏,这个宏的作用就是限制我们在内核里面设置DEVICE_ATTR的权限,如果你要是设置 0777,那肯定就会给你提示编译错误。

0777 对应的是 8进制


整个流程

整个流程是如上图,代码是在mode部分那里做了限制。

怎么让DEVICE_ATTR 0777 生效?

既然我们知道是

VERIFY_OCTAL_PERMISSIONS 这个宏限制的,那就直接把这个宏修改就好了。

当然了,这样使用是不符合要求的,如果这样,很容易被裁员的哦,毕竟用户可能随便写一段代码就可能让你的系统不正常。

看烧录看效果

  推荐阅读:

专辑|Linux文章汇总

专辑|程序人生

专辑|C语言

嵌入式Linux

微信扫描二维码,关注我的公众号

DEVICE_ATTR设置0777引发血案相关推荐

  1. linux “<“ 会引发血案

    背景:你是否也是为了方便,而在history中寻找它呢,然后紧急执行了它--(正乃是常在河边走,那能不湿鞋呢) 引发血案的是它: mysql -uroot -p *** < /tmp/11.sq ...

  2. [转] 校园职场』 [公告]兰州城市学院学生因自习室“抢座位”引发血案,造成7人伤亡(转载)

    [转] 校园职场』 [公告]兰州城市学院学生因自习室"抢座位"引发血案,造成7人伤亡(转载) 其中4人抢救无效死亡,3人正在住院治疗. 10日上午记者获悉,兰州城市学院(校本部)学 ...

  3. get/close not same thread Druid 连接池一个设置没设置对引发的血案

    我就郁闷了,1000W+数据审核每次总是到一半就出这么个错,仔细找找原来是一个配置项的小问题,removeAbandonedTimeout 这个代表你从连接池取出一个连接多少秒之后你还没还回来,那就强 ...

  4. 屏保壁纸引发血案,三星手机瞬间变砖

    作者 | 马超 责编 | 伍杏玲 头图 | CSDN下载自东方IC 出品 | CSDN(ID:CSDNnews) 因为一张壁纸引发手机变砖的情况再次出现.近日,据俄罗斯卫星通讯社报道,网名为" ...

  5. HttpClient 设置不当引发的一次雪崩!

    作者 | zxcodestudy 来源 | https://blog.csdn.net/qq_16681169/article/details/94592472 一. 事件背景 我最近运维了一个网上的 ...

  6. HttpClient 连接池设置不当引发的一次雪崩

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | zxcodestudy 来源 | http:/ ...

  7. Cookie Domain设置错误引发的单点登录死循环问题

    问题现象 在业务系统B登录之后,打开B系统的一个内嵌iframe页面page1,page1需要访问业务系统A/create接口,屏幕出现一片白色,跟踪chrome network发现请求截图如下: 可 ...

  8. 一个馒头引发血案,服务在“峰终定律”中的最大变数是什么

    这是小胖的第140篇文章. 也是小胖2020年100文章的第15篇. 「创业难, 守业更难.」 本文2920字,阅读大概需要5分钟. 作者:小胖 编辑:小胖 最近的购物体验好坏参半,所以不妨来讲一讲用 ...

  9. postgresql数据库uuid重复引发血案

    问题背景 .定时任务调用存储过程.将数据插入临时表时.出现了uuid重复的报错. 报错信息 [SQL]select DB_DATA.PR_SELECT() [Err] ERROR: duplicate ...

最新文章

  1. tomcat5.5.9+sql2000数据库连接池配置
  2. 基于Matlab的多层BP神经网络在非线性函数拟合中的应用
  3. Googlequot;员工quot;曝内幕:Google员工的17个秘密
  4. Asp.Net Core 第02局:Program
  5. 关于fragment backstate的运用
  6. 【算法竞赛学习】数字中国创新大赛智慧海洋建设-Task2数据分析
  7. JAVA后端面试100 QA之第一篇
  8. nanshan 钥匙在您那儿的
  9. web安全检查_如何利用现代Web检查器的功能
  10. 推荐95个极富创意的单页网站设计实例欣赏
  11. 特斯拉再回应自燃事件:正在权威部门主导下进行调查 暂未有初步结论
  12. 最小错误率贝叶斯决策的基本思想_机器学习笔记—模式识别与智能计算(四)基于概率统计的贝叶斯分类器设计(贝叶斯决策)...
  13. 安装ahci驱动sata
  14. Opencv-获取两点之间距离
  15. html英文字母大小,26个英文字母大小写的规范书写
  16. 微信小程序支付功能的实现
  17. 阿里云如何提供接口 生成api?
  18. 前后端分离时ajax发送请求时后端能接送,但是前端的response为空时
  19. “天气之子”:GIS预测降雨
  20. [ros robot] --- 机器人系统仿真

热门文章

  1. 用fputc()函数以字符串形式写入字符到磁盘文件
  2. iphone-common-codes-ccteam源代码 CCNSArray.h
  3. 3.5.2 冒泡排序类
  4. Windows XP系统的“恢复”办法
  5. mysql update实质,UPDATE注射(mysql+php)的两个模式
  6. Docker 精通之 Dockerfile
  7. python | 查看pip支持的文件名和版本
  8. scrapy框架_Python学习之Scrapy框架
  9. [Quatsch]Quantum Or Optics
  10. 前端面试之前要准备的那些事