如何在内核模块中使用sysfs?

时间:2010-12-10 04:30:37

标签: linux linux-kernel kernel-module

在用户空间我只能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调度程序,用户空间程序可以在那时挂起)

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

如果要为内核模块配置某些内容,可以在使用insmod命令插入内核模块的包装脚本中执行此操作。

并查看this文章,其中告诉“为什么从内核写入文件不好”

答案 2 :(得分:0)

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

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

虽然说这看起来像个坏主意,但你会如何处理多个块设备呢?