【问题标题】:How is userspace able to write to sysfs用户空间如何能够写入 sysfs
【发布时间】:2013-08-01 18:54:23
【问题描述】:

最近我正在查看 kobjects 和 sysfs 的内核。

我知道/理解以下内容..

  • 所有内核对象使用地址> 0x80000000
  • kobjects 应该也不例外
  • sysfs 只不过是 kobjects 的层次结构(可能包括 ksets 和其他 k* 的东西......不确定)

鉴于这些信息,我不确定我是否完全理解运行 echo ondemand >/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor 时会发生什么

我可以看到 cpufreq 模块有一个名为 store_scaling_governor 的函数,它处理对这个“文件”的写入。但是用户模式如何通过这个简单的回显进入内核模式?

【问题讨论】:

    标签: linux-kernel sysfs


    【解决方案1】:

    当你执行命令echo ondemand >/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor时,你的shell调用write系统调用,然后内核将它调度给相应的处理程序。

    cpufreq 将struct kobj_type ktype_cpufreq 设置为sysfs_ops。然后cpufreq注册到cpufreq_add_dev_interface()。之后,内核可以在write syscall 上获取相应的处理程序来执行。

    【讨论】:

    • 准确地说,你的 shell 在 /sys/devices/system/cpu/cpufreq/scaling_governor 上调用 open() 系统调用,然后分叉一个子进程,将文件描述符移动到 stdout (1),然后执行“echo”程序,该程序调用 write() 系统调用将“ondemand\n”写入标准输出(传递给驱动程序代码)。
    【解决方案2】:

    我可以告诉你一个我用来从 sysfs 访问内核空间变量的实现(shell 提示符中的用户空间)。基本上,在 sys 文件系统中暴露给用户空间的每组变量都显示为一个单独的文件在 /sys/ 下。现在,当您在 shell 提示符(用户空间)中发出 echo value > /sys/file-path 时。当您这样做时,将在 .store 方法中的内核空间中调用相应的方法。另外,当您发出cat /sys/file-path 被调用的相应方法是内核中的 .show。您可以在此处查看更多信息:http://lwn.net/Articles/31220/

    【讨论】:

      猜你喜欢
      • 2011-02-06
      • 2012-02-02
      • 2014-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多