如何在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不可能做到这一点?还是

我已经在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);
}