Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何在内核模块内使用sysfs?_Linux_Linux Kernel_Kernel Module - Fatal编程技术网

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 */