使用sysfs show()和store()函数

时间:2018-11-21 15:35:52

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

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

  

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

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

         

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

  •   
  • 在write(2)上,sysfs期望整个缓冲区在   首先写。然后,Sysfs将整个缓冲区传递给store()方法。   存储的数据之后会添加一个终止null。这使得   像sysfs_streq()这样的函数可以安全使用。

         

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

  •   

首先,当我使用read/write读取/写入sysfs属性文件时,是否保证我读取的缓冲区/ store函数中的缓冲区将具有我想要的所有字节读取该功能,而不是分几个部分调用它?

此外,如何添加空字符?也就是说,假设我写了n个字节,函数参数中的写字节数是否为n,而空字符将被放置在n + 1?

谢谢

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

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