如何在Linux中更改可加载内核模块(LKM)中的调度程序策略?
我已经在Linux中编写了一个LKM。如何在Linux中更改可加载内核模块(LKM)中的调度程序策略?,linux,system-calls,scheduling,kernel-module,ioctl,Linux,System Calls,Scheduling,Kernel Module,Ioctl,我已经在Linux中编写了一个LKM。ioctl函数,my_ioctl由用户级程序foo.c调用。我想更改foo.c的调度策略。因此,我在我的my_ioctl函数中执行以下操作: 我已将syscall更改为sys\u mycallstruct sched_attr也在上述Linux内核文档链接中定义。但是,我无法通过此更改调度策略。它抛出了一个错误,比如无法从内核空间更改调度策略。 我不明白为什么会这样。存在一个实用程序,它从用户空间对进程执行相同的操作;那么,为什么LKM不可能做到这一点?还是
ioctl
函数,my_ioctl
由用户级程序foo.c
调用。我想更改foo.c
的调度策略。因此,我在我的my_ioctl
函数中执行以下操作:
我已将syscall
更改为sys\u mycall
struct sched_attr
也在上述Linux内核文档链接中定义。但是,我无法通过此更改调度策略。它抛出了一个错误,比如无法从内核空间更改调度策略。
我不明白为什么会这样。存在一个实用程序,它从用户空间对进程执行相同的操作;那么,为什么LKM不可能做到这一点?还是我遗漏了什么?你能在文件顶部显示你的“include”语句是什么样子吗?我试图重现你的错误,但我的LKM无法识别sched#u SetAttr,它无法识别。您必须编写自己的(内核)库,在其中必须进行特定于内核的系统调用,如我提到的sys\u mycall
。我的#include
有我自己的头文件,它定义了sched_setattr
,正如我在主要帖子中所示。我很好奇,如果你只想更改用户级程序的调度参数,为什么你需要进入内核空间呢?您可以在用户空间中构造所需的sched_attr结构,然后调用系统调用sched_setattr。如果为PID传递0,它会更改调用线程上的参数。这是真的。它可以从用户空间完成。然而,我们可能需要有一个中央控制,因为这与可能影响其他进程的调度有关。在我看来,这就是内核空间管理更好的原因。
struct sched_attr attr;
int ret;
unsigned int flags = 0;
attr.size = sizeof(attr);
attr.sched_flags = 0;
attr.sched_nice = 0;
attr.sched_priority = 0;
/* This creates a 10ms/30ms reservation */
attr.sched_policy = SCHED_DEADLINE;
attr.sched_runtime = 10 * 1000 * 1000;
attr.sched_period = attr.sched_deadline = 30 * 1000 * 1000;
ret = sched_setattr(current->pid, &attr, flags);
if (ret < 0) {
perror("sched_setattr");
exit(-1);
}
int sched_setattr(pid_t pid,
const struct sched_attr *attr,
unsigned int flags) {
return syscall(__NR_sched_setattr, pid, attr, flags);
}