在用户空间我只能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调度程序,用户空间程序可以在那时挂起)
答案 0 :(得分:3)
没有办法正确实施它。无论如何你想要这样做,还有 了解它是一个坏主意(tm)的原因,请参阅此article
答案 1 :(得分:2)
如果要为内核模块配置某些内容,可以在使用insmod
命令插入内核模块的包装脚本中执行此操作。
并查看this文章,其中告诉“为什么从内核写入文件不好”
答案 2 :(得分:0)
错误的错误。 sysfs
是到用户空间的接口,您不应该在内核中使用它。
如果您的模块想要更改块调度程序,那么您应该弄清楚如何在内核中执行此操作,即。当用户写入/sys/block/sda/queue/scheduler
运行某些内核代码时,您应该直接调用该代码。
虽然说这看起来像个坏主意,但你会如何处理多个块设备呢?