kernel与用户层接口之sysfs属性接口

本文探讨了Linux内核与用户空间的交互方式,特别关注了sysfs属性接口。相较于字符设备文件和proc接口,sysfs提供了一种更方便的方式来在Shell脚本中直接操作内核参数,解决了ioctl接口的不便利性和大小端、位宽兼容性问题。
  1. 字符设备文件,以这个虚拟设备上的 read/write/ioctl 等接口与用户交互;但 read/write 一般只能做一件事情, ioctl 可以根据 cmd 参数做多个功能,但其缺点是很明显的: ioctl 接口无法直接在 Shell 脚本中使用,为了使用 ioctl 的功能,还必须编写配套的 C语言的虚拟设备操作程序, ioctl 的二进制数据接口也是造成大小端问题 (big endian与little endian)、32位/64位不可移植问题的根源;
  2.  proc 接口,接受用户的 read/write/ioctl 操作;同样的,一个 proc 项通常使用其 read/write/ioctl 接口,它所存在的问题与上面的虚拟字符设备的的问题相似;
  3. sysfs 属性接口

优点: 比起古老的 proc 文件系统,它是基于内核的数据结构,因此组织结构上更加严密。它的设计使内核的信息更易获取,而且更加清晰。

内核空间与用户空间的映射关系如下表所示:


内核空间(internel) 用户空间(externel)
内核对象
(kernel objects)
目录
(directories)
对象属性
(object attributes)
普通文件
(regular files)
对象关系
(object relationshiops)
符号链接
(symbolic links)



1.1  Linux 统一设备模型所添加的高级sys接口:

 
### sysfs 接口的工作原理及其在 Linux 系统中的作用 #### sysfs 的基本概念作用 sysfs 是 Linux 内核提供的一种虚拟文件系统,用于将内核对象(如设备、驱动、总线等)的次结构导出到用户空间,便于用户通过文件系统接口访问和控制内核状态。它通常挂载在 `/sys` 目录下, `/proc` 类似,是一种用于调试和配置系统的接口sysfs 的设计目标是提供一种统一、结构化的方式来表示设备模型信息,并支持用户空间对设备属性的动态访问和修改[^4]。 sysfs 的核心功能包括: - **设备模型的次化展示**:sysfs 将设备模型组织为树状结构,例如 `/sys/devices` 表示物理设备树,`/sys/bus` 展示总线类型,`/sys/class` 展示设备类等。 - **动态属性管理**:每个设备或驱动都可以通过 sysfs 提供一组属性文件,供用户空间读写,实现对硬件状态的控制和监控。 - **调试配置接口**:sysfs 提供了类似 `/sys/kernel`、`/sys/module` 等目录,用于查看内核配置、加载模块等信息。 #### sysfs 的内部结构实现机制 sysfs 的实现主要依赖于 `sysfs` 文件系统的核心组件,其源码分布在多个文件中: - `fs/sysfs/sysfs.h`:定义 sysfs 的内部结构和函数声明。 - `fs/sysfs/mount.c`:处理 sysfs VFS 的交互,包括挂载和初始化。 - `fs/sysfs/inode.c`:管理 sysfs 的 inode 和对象生命周期。 - `fs/sysfs/dir.c`、`fs/sysfs/file.c`:分别处理目录和文件的创建、删除等操作。 - `fs/sysfs/group.c`:提供批量创建属性文件的接口。 - `fs/sysfs/symlink.c`:处理符号链接的创建和删除。 - `fs/sysfs/bin.c`:支持二进制文件的创建和管理。 sysfs 的目录结构由 `kobject` 和 `kset` 构建,每个 `kobject` 对应一个 sysfs 目录。当 `kobject_add` 被调用时,其父节点决定了该目录在 sysfs 中的位置。若父节点为空,则该目录将作为 `/sys` 下的子目录出现[^4]。 #### sysfs 的使用方法接口定义 用户空间可以通过标准文件操作(如 `open`、`read`、`write`)访问 sysfs 中的属性文件。这些属性文件通常由设备驱动在初始化时注册,使用 `DEVICE_ATTR` 宏定义属性及其读写方法。例如: ```c static DEVICE_ATTR(polling, S_IRUGO | S_IWUSR, show_polling, set_polling); ``` 上述代码定义了一个名为 `polling` 的属性文件,具有读写权限,读操作调用 `show_polling`,写操作调用 `set_polling` 函数。驱动程序通常将属性文件组织为 `attribute_group`,并通过 `sysfs_create_group` 创建一组属性文件[^5]。 用户可以通过 shell 命令访问 sysfs 属性: ```bash cat /sys/class/mydevice/polling echo 1 > /sys/class/mydevice/polling ``` 这种方式常用于调试和配置设备驱动,尤其在开发阶段非常有用。虽然 sysfs 提供了丰富的属性接口,但实际驱动控制仍主要依赖 `/dev` 下的设备节点,sysfs 更多用于调试和状态查看[^3]。 #### sysfs 的局限性扩展性 尽管 sysfs 提供了统一的接口来访问内核对象,但其使用仍存在一些局限性: - **缺乏文档支持**:新的 sysfs 属性不断在内核版本中引入,维护一份完整的属性参考手册几乎不可能,因此需要开发者具备阅读内核源码的能力来理解其功能[^1]。 - **属性命名不统一**:不同驱动开发者可能采用不同的命名方式,导致属性文件的命名风格不一致,增加了理解和使用难度。 - **性能限制**:sysfs 的文件操作涉及内核上下文切换,频繁访问可能带来性能开销,因此不适合高频率的数据交互。 尽管如此,sysfs 仍然是 Linux 系统中不可或缺的调试工具,尤其在设备驱动开发、硬件监控和系统配置中发挥着重要作用。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值