3

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

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

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

鉴于此信息,我不确定我是否完全了解跑步时会发生什么echo ondemand >/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

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

4

2 回答 2

6

当您执行 commandecho ondemand >/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor时,您的 shell 会调用write系统调用,然后内核将其分派给相应的处理程序。

cpufreq 设置struct kobj_type ktype_cpufreqsysfs_ops. 然后 cpufreq 将其注册到cpufreq_add_dev_interface(). 之后,内核可以在write系统调用上获取相应的处理程序来执行。

于 2013-07-12T15:44:02.343 回答
0

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

于 2013-08-01T10:48:34.830 回答