Linux sysfs_create_group属性组创建与bin_attribute
📅 2026/6/23 15:20:36
👁️ 次浏览
Linux sysfs_create_group属性组创建与bin_attributesysfs_create_group()是驱动程序向sysfs导出属性的标准接口它允许一次注册一组属性而无需逐一调用sysfs_create_file()。其函数原型位于fs/sysfs/group.cint sysfs_create_group(struct kobject *kobj, const struct attribute_group *grp);struct attribute_group的核心定义struct attribute_group {const char *name;umode_t (*is_visible)(struct kobject *, struct attribute *, int);umode_t (*is_bin_visible)(struct kobject *, struct bin_attribute *, int);struct attribute **attrs;struct bin_attribute **bin_attrs;};当grp-name为NULL时属性直接创建在kobj对应的sysfs目录下。当name非空时sysfs_create_group()先创建以name命名的子目录然后将所有属性放入该子目录中。实现上sysfs_create_group()首先计算属性数量然后调用internal_create_group()进行实际创建。关键步骤包含(1) 如果grp-name非空通过sysfs_create_dir_ns()创建子目录。(2) 遍历grp-attrs数组对每个attribute调用sysfs_add_file_mode_ns()创建普通属性文件。(3) 遍历grp-bin_attrs数组对每个bin_attribute调用sysfs_add_bin_file_mode_ns()创建二进制属性文件。属性文件在内核态通过struct attribute描述struct attribute {const char *name;umode_t mode;#ifdef CONFIG_DEBUG_LOCK_ALLOCbool ignore_lockdep:1;struct lock_class_key *key;struct lock_class_key skey;#endif};每个attribute对应一个sysfs文件show/store回调通过struct sysfs_ops从kobject的ktype中获取struct sysfs_ops {ssize_t (*show)(struct kobject *, struct attribute *, char *);ssize_t (*store)(struct kobject *, struct attribute *, const char *, size_t);};当用户空间读取sysfs文件时内核调用sysfs_kf_read()它通过kobj-ktype-sysfs_ops-show()分发到具体实现。bin_attribute提供了对无格式二进制数据的读写能力这在大块数据传输如firmware、寄存器dump场景中远优于基于文本的attributestruct bin_attribute {struct attribute attr;size_t size;void *private;ssize_t (*read)(struct file *, struct kobject *, struct bin_attribute *,char *, loff_t, size_t);ssize_t (*write)(struct file *, struct kobject *, struct bin_attribute *,char *, loff_t, size_t);loff_t (*llseek)(struct file *, struct kobject *, struct bin_attribute *,loff_t, int);};bin_attribute突破了普通attribute单页缓冲区的限制。普通attribute的show()回调最多只能返回PAGE_SIZE字节的数据而bin_attribute的read()回调可以处理任意大小的数据块通过偏移和长度参数支持随机访问。典型的硬件寄存器dump实现static ssize_t regs_read(struct file *filp, struct kobject *kobj,struct bin_attribute *bin_attr,char *buf, loff_t off, size_t count){struct my_device *dev container_of(kobj, struct my_device, kobj);size_t regs_size 0x1000;if (off regs_size)return 0;if (off count regs_size)count regs_size - off;/* 从硬件寄存器空间读取 */memcpy_fromio(buf, dev-regs_base off, count);return count;}static BIN_ATTR(regs, 0400, regs_read, NULL, 0x1000);static struct bin_attribute *my_bin_attrs[] {bin_attr_regs,NULL,};static struct attribute_group my_group {.attrs my_attrs,.bin_attrs my_bin_attrs,};is_visible()和is_bin_visible()回调在属性创建前被调用返回值决定了属性文件的访问权限。返回0表示隐藏该属性。这种机制使得同一属性组可以根据设备能力动态调整可见性static umode_t my_is_visible(struct kobject *kobj, struct attribute *attr, int n){struct my_device *dev container_of(kobj, struct my_device, kobj);if (attr dev_attr_feature_x.attr !dev-has_feature_x)return 0;return attr-mode;}sysfs_update_group()用于在运行时更新属性组的权限和可见性它不会创建或删除属性文件只会修改已有文件的权限位。如果要动态添加属性需使用sysfs_add_group()或重新创建组。sysfs_remove_group()是逆向操作按相反顺序移除属性和子目录。需要注意sysfs_create_group()和sysfs_remove_group()必须配对调用否则会导致sysfs节点残留进而引发后续内核对象注册冲突。在设备驱动模型中devm_device_add_group()提供了资源管理版本当设备被注销时自动移除属性组省去了手动清理的麻烦。
1. 为什么“异步动作”成了 Redux 项目里最常被误解的坎Redux 本身是个纯同步状态机——它只认一个规则:dispatch 一个 plain object action,reducer 算出新 state,UI 重渲染。这就像一台老式机械钟表,齿轮咬合严丝合缝࿰…
📅 2026/6/23 15:20:36
1. 项目概述:为什么读懂 JavaScript 源码必须从 AST 入手 你有没有遇到过这样的场景:接手一个别人写的前端项目,代码里嵌着十几层三元运算、函数式链式调用混着立即执行函数,变量名全是 a、b、c、res、data、temp;或者…
📅 2026/6/23 15:20:36
1. 项目概述:为什么在 Ubuntu 上装 PostgreSQL 不是“点几下就完事”的事PostgreSQL,这个被开发者私下称为“开源数据库里的瑞士军刀”的关系型数据库,它和 Ubuntu 的组合,表面上看就是一条sudo apt install postgresql命令的事。…
📅 2026/6/23 15:20:36
一、haproxy----高可用、负载均衡1.安装安装ntpdate[roothaproxy ~]# yum -y install ntpdate.x86_64安装ntp[roothaproxy ~]# yum -y install ntp同步时间[roothaproxy ~]# ntpdate cn.ntp.org.cn启动ntp服务[roothaproxy ~]# systemctl start ntpd设置开机自启[roothaproxy ~…
📅 2026/6/24 0:02:25
我们一般通过编写或使用自动化脚本来完成各种任务,从而节省时间和提高效率。以下是一些常见的自动化脚本任务:游戏搬砖脚本技术:这种技术涉及使用自动化脚本来执行游戏中的重复任务。例如,在一个交易游戏中,脚本可以自…
📅 2026/6/24 0:02:25
Wan2.1-Fun-V1.1-1.3B-InP Web UI使用教程:无需代码的AI视频创作 【免费下载链接】Wan2.1-Fun-V1.1-1.3B-InP 项目地址: https://ai.gitcode.com/hf_mirrors/PAI/Wan2.1-Fun-V1.1-1.3B-InP
Wan2.1-Fun-V1.1-1.3B-InP是一款强大的AI视频创作工具,…
📅 2026/6/24 0:02:25
终极教程:使用angular-mobile-nav实现流畅的移动页面过渡效果 【免费下载链接】angular-mobile-nav An angular navigation service for mobile applications 项目地址: https://gitcode.com/gh_mirrors/an/angular-mobile-nav
angular-mobile-nav是一款专为…
📅 2026/6/24 0:02:25
TaskJuggler脚本编程入门:用代码实现自动化项目管理 【免费下载链接】TaskJuggler TaskJuggler - Project Management beyond Gantt chart drawing 项目地址: https://gitcode.com/gh_mirrors/ta/TaskJuggler
TaskJuggler是一款强大的开源项目管理工具&#…
📅 2026/6/24 0:02:25
如何通过biliTickerBuy构建B站会员购抢票通知系统 【免费下载链接】biliTickerBuy b站会员购购票辅助工具 项目地址: https://gitcode.com/GitHub_Trending/bi/biliTickerBuy
在B站会员购抢票的激烈竞争中,及时获取抢票状态信息是成功的关键。biliTickerBuy作…
📅 2026/6/23 23:57:25
TaskJuggler脚本编程入门:用代码实现自动化项目管理 【免费下载链接】TaskJuggler TaskJuggler - Project Management beyond Gantt chart drawing 项目地址: https://gitcode.com/gh_mirrors/ta/TaskJuggler
TaskJuggler是一款强大的开源项目管理工具&#…
📅 2026/6/24 0:02:25
终极教程:使用angular-mobile-nav实现流畅的移动页面过渡效果 【免费下载链接】angular-mobile-nav An angular navigation service for mobile applications 项目地址: https://gitcode.com/gh_mirrors/an/angular-mobile-nav
angular-mobile-nav是一款专为…
📅 2026/6/24 0:02:25
Wan2.1-Fun-V1.1-1.3B-InP Web UI使用教程:无需代码的AI视频创作 【免费下载链接】Wan2.1-Fun-V1.1-1.3B-InP 项目地址: https://ai.gitcode.com/hf_mirrors/PAI/Wan2.1-Fun-V1.1-1.3B-InP
Wan2.1-Fun-V1.1-1.3B-InP是一款强大的AI视频创作工具,…
📅 2026/6/24 0:02:25
1. 从手册到实战:SLIDER与SPINBOX控件的深度解析在嵌入式GUI开发里摸爬滚打十几年,我见过太多项目因为界面交互的“小问题”而卡壳。参数调节不跟手、数值输入效率低下,这些看似不起眼的细节,往往是决定产品用户体验成败的关键。e…
📅 2026/6/23 3:33:35
暗黑2重获新生:D2DX如何让经典游戏在现代Windows系统上流畅运行 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx
…
📅 2026/6/23 2:15:55
CompressO终极指南:免费开源的视频图像压缩神器 【免费下载链接】compressO Convert any video/image into a tiny size. 100% free & open-source. Available for Mac, Windows & Linux. 项目地址: https://gitcode.com/gh_mirrors/co/compressO
你…
📅 2026/6/23 3:43:12