【问题标题】:using sysfs show() and store() functions使用 sysfs show() 和 store() 函数
【发布时间】:2021-04-07 17:50:09
【问题描述】:

我有 2 个关于使用这些功能的问题。我不完全理解here写的文档:

sysfs 分配一个大小为 (PAGE_SIZE) 的缓冲区并将其传递给 方法。 Sysfs 每次读取都会调用该方法一次,或者 写。这会在方法上强制执行以下行为 实现:

  • 在 read(2) 时,show() 方法应该填满整个缓冲区。 回想一下,一个属性应该只导出一个值,或者一个 类似值的数组,所以这不应该那么昂贵。

    这允许用户空间进行部分读取和前向搜索 随意翻遍整个文件。如果用户空间回溯到 零或执行偏移量为 '0' 的 pread(2),show() 方法将 再次调用,重新配置,以填充缓冲区。

  • 在 write(2) 时,sysfs 期望整个缓冲区在 先写。然后 Sysfs 将整个缓冲区传递给 store() 方法。 在商店的数据之后添加一个终止的空值。这使得 sysfs_streq() 等函数可以安全使用。

    在写入 sysfs 文件时,用户空间进程应该首先读取 整个文件,修改它希望更改的值,然后写入 整个缓冲回来。

首先,当我使用read/write 读取/写入 sysfs 属性文件时,我是否保证我读取到的缓冲区/store 函数中的缓冲区将包含我想要读取的所有字节函数,而不是分块调用?

另外,空字符是如何添加的?也就是假设我写了n个字节,会不会在函数参数中写入的字节数为n,而null char会放在n+1处?

谢谢

【问题讨论】:

    标签: linux linux-kernel linux-device-driver sysfs


    【解决方案1】:

    第一个问题的答案是的 - 不支持部分写入,缓冲区总是在一次 show 方法调用中填充。

    第二个问题的答案也是肯定的。请参阅 sysfs 使用的实现 kernfs_fop_write() - 它将分配最多 PAGE_SIZE+1 个字节,以便有足够的空间容纳 \0。

    【讨论】:

    • 实际上是 PAGE_SIZE 或 2*PAGE_SIZE(所以空终止符在这种情况下占据整页)。
    【解决方案2】:

    它分配PAGE_SIZE,如果>= PAGE_SIZE被写入,它会用'\0'截断为PAGE_SIZE并记录一个错误。如果写了> PAGE_SIZE,你可能损坏了内核内存。

    为了保护,您应该使用sysfs_emitsysfs_emit_at 写入缓冲区。请参阅documentation

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-18
      相关资源
      最近更新 更多