3

在用户空间中,我可以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 错误,用户空间程序可能会在那时挂起)

4

3 回答 3

3

只是没有办法正确实施它。如果您无论如何都想做,并且也了解它是 Bad Idea (tm) 的原因,请参阅这篇文章

于 2010-12-10T08:48:11.433 回答
2

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

看看这篇文章,它告诉“为什么从内核写入文件是不好的”

于 2010-12-10T05:39:46.587 回答
0

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

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

话虽如此,这似乎是个坏主意,例如,您将如何处理多个块设备?

于 2010-12-11T13:30:22.870 回答