内核级函数原型和用户级函数原型的差异

时间:2011-11-09 16:56:19

标签: gcc linux-kernel kernel

我在linux内核的sched_setschedule()函数中做了一些修改。我成功地重新编译并构建它。现在,当我尝试在我的C程序中使用sched_setschedule()(使用gcc)时,我注意到gcc选择的头文件与我修改为编译内核的头文件完全不同。

在这种情况下

gcc正在从/usr/include/sched.h

中获取sched.h文件

其中func原型定义如下

extern int sched_setparam(__ pid_t __pid,__ constst struct sched_pa​​ram * __ param)      __THROW;

虽然内核版本有 我正在使用2.6.35.23内核

/usr/src/linux-headers-2.6.35-23

extern int sched_setscheduler(struct task_struct *,int,struct sched_pa​​ram *);

这两个标头如何相互关联或相互映射?换句话说,如何将内核函数原型中的更改级联回gcc库(头文件)

1 个答案:

答案 0 :(得分:3)

内核函数不喜欢直接使用用户空间代码。相反,有一个厚层通过系统调用接口。这是由glibc完成的。 /usr/include中的标头属于glibc标头。您似乎正在尝试扩展官方调度程序接口,但是这也需要您修改和/或扩展glibc本身,我猜这不是您的初衷。此外,如果您想要将此内核模块提供给其他任何人,则另一个人还需要替换他的glibc版本,其中包括运行时二进制文件和/或编译器时间头。

您可以编写自己的sched_setparam系统调用版本,而不依赖于sched.h,请参阅man 2 syscall

另一种方法是在不修改现有接口的情况下扩展内核,而是创建新接口。有一些资源可以添加新的/proc/sys文件,并将它们包装在新的独立库中。