【问题标题】:How to use sysfs inside kernel module?如何在内核模块中使用 sysfs?
【发布时间】:2011-05-23 06:48:45
【问题描述】:

在用户空间我可以echo noop > /sys/block/sda/queue/scheduler

如何在内核模块中做同样的事情?

我希望是这样的(伪代码):

struct dentry* e = sysfs_get_root();
vfs_path_lookup(e, ????, "block/sda/queue/scheduler", ???);
????;
struct something* q = ????;
????->store(q, "noop", 1);
/* some cleanup */

如何正确实施?

我的内核模块只注册了 SysRQ 处理程序,并且应该在触发 SysRQ 时配置 io 调度程序(由于 io-scheduler 错误,用户空间程序可能会在那时挂起)

【问题讨论】:

  • 没有。无论你在做什么,这几乎肯定是错误的做法。

标签: linux linux-kernel kernel-module


【解决方案1】:

没有办法正确实现它。如果你还是想这样做,而且 了解它是一个坏主意的原因(tm),请参阅此article

【讨论】:

  • 这篇文章主要是关于在内核中写入和读取文件。 (我已经尝试实现 stackoverflow.com/questions/1184274/… ,但它惊慌失措)。在某处被告知 sysfs 内容由 kobjects 组成。所以它应该在内核内部更易于管理。
【解决方案2】:

如果你想为你的内核模块配置一些东西,你可以在一个包装脚本中进行,该脚本使用insmod 命令插入你的内核模块。

并查看this 文章,其中讲述了“为什么从内核写入文件是不好的”

【讨论】:

  • 不,这不是我的内核模块的配置。我的模块想要配置其他东西。
【解决方案3】:

错错错。 sysfs 是一个到用户空间的接口,你不应该在内核中使用它。

如果您的模块想要更改块调度程序,那么您应该弄清楚如何在内核中执行此操作,即。当用户写入/sys/block/sda/queue/scheduler 时,一些内核代码正在运行,您应该直接调用该代码。

虽然说这似乎是个坏主意,但您将如何处理多个块设备?

【讨论】:

  • 是的,正确的方法可能是迭代设备并将调度程序从特殊更改为通常。 (实际上我最终得到了用户空间助手,当大部分系统卡住时它似乎没有挂起)。附言io 调度程序故意挂起块设备以“使 HDD 减速而不是在明确命令之前启动”)
  • 如果你想确保用户空间助手不会挂起,你可以mlockall() 它,并保持打开有问题的 sysfs 文件的句柄(这样你就不会在遍历时挂起/)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 2018-08-07
  • 2014-04-22
相关资源
最近更新 更多