Linux 如何在内核模块内使用sysfs?
在用户空间中,我只能Linux 如何在内核模块内使用sysfs?,linux,linux-kernel,kernel-module,Linux,Linux Kernel,Kernel Module,在用户空间中,我只能回显noop>/sys/block/sda/queue/scheduler 如何在内核模块内执行相同的操作 我期望类似这样的东西(伪代码): 如何正确实施 我的内核模块只是注册SysRQ处理程序,并应在触发SysRQ时配置io调度程序(由于io调度程序错误,用户空间程序可能会在此时挂起)如果要为内核模块配置某些内容,您可以在使用insmod命令插入内核模块的包装器脚本中实现这一点 请看一篇文章,其中告诉我们“为什么从内核编写文件不好”根本没有办法正确实现它。如果你想这么做,而
回显noop>/sys/block/sda/queue/scheduler
如何在内核模块内执行相同的操作
我期望类似这样的东西(伪代码):
如何正确实施
我的内核模块只是注册SysRQ处理程序,并应在触发SysRQ时配置io调度程序(由于io调度程序错误,用户空间程序可能会在此时挂起)如果要为内核模块配置某些内容,您可以在使用
insmod
命令插入内核模块的包装器脚本中实现这一点
请看一篇文章,其中告诉我们“为什么从内核编写文件不好”根本没有办法正确实现它。如果你想这么做,而且
了解这是一个坏主意(tm)的原因,请参见此错误
sysfs
是用户空间的接口,您不应该在内核中使用它
如果您的模块想要更改块调度器,那么您应该了解如何在内核中进行更改,即当用户写入/sys/block/sda/queue/scheduler
某些内核代码运行时,您应该直接调用该代码
话虽如此,但这似乎是个坏主意,例如,您将如何处理多块设备?不。无论您在做什么,这几乎肯定是错误的做法。不,这不是我的内核模块的配置。我的模块想要配置其他东西。本文主要是关于在内核中写入和读取文件的。(我已经尝试实施,但它惊慌失措)。有人告诉我们,sysfs内容由kobjects组成。因此,从内核内部应该可以更好地管理它。是的,正确的方法可能是在设备上迭代,并将调度程序从特殊更改为常规。(事实上,我最终使用了用户空间助手,当系统大部分被卡住时,它似乎不会挂起)。另外,io调度器故意挂起块设备以“降速HDD,直到显式命令后再启动”),如果您想确保userspace helper不会挂起,可以
mlockall()
挂起它,并保持有问题的sysfs文件的句柄打开(这样您就不会挂起跨//code>的遍历)
struct dentry* e = sysfs_get_root();
vfs_path_lookup(e, ????, "block/sda/queue/scheduler", ???);
????;
struct something* q = ????;
????->store(q, "noop", 1);
/* some cleanup */