Linux kernel 如何从内核空间调用Linux系统调用?

Linux kernel 如何从内核空间调用Linux系统调用?,linux-kernel,system-calls,Linux Kernel,System Calls,我正在移植为Linux2.4编写的linux内核模块,以便与Linux2.6一起使用。 代码中使用了一些通过syscallN()宏声明并包装在set_fs()调用中的系统调用。 在没有宏的Linux 2.6中,我如何仍然使用sycalls 我知道从内核空间使用系统调用是一种不好的习惯,而且在大多数平台上,syscallN()。任何在内核空间替换getuid、geteuid、mknod、chown、unlink、sched\u-yield系统调用的合理方法都是值得赞赏的。current->uid和

我正在移植为Linux2.4编写的linux内核模块,以便与Linux2.6一起使用。 代码中使用了一些通过
syscallN()
宏声明并包装在
set_fs()
调用中的系统调用。 在没有宏的Linux 2.6中,我如何仍然使用sycalls


我知道从内核空间使用系统调用是一种不好的习惯,而且在大多数平台上,
syscallN()。任何在内核空间替换
getuid
geteuid
mknod
chown
unlink
sched\u-yield
系统调用的合理方法都是值得赞赏的。

current->uid
current->euid
可以替代前两种方法

schedule()
应该适用于最后一个

文件系统操作看起来更复杂:您可以尝试查看是否导出了
sys\u chown()
sys\u mknod()
sys\u unlink()
(可供任何模块使用)。如果有效,那就太好了。有一些。否则,您必须深入挖掘:

fs/open.c
中定义了
chown
系统调用。乍一看,我不明白为什么不能将代码复制到自己的“kernel_chown”函数中并尝试一下


mknodat
unlink
系统调用位于
fs/namei.c
;他们最终分别调用了
vfs\u mknod()
vfs\u unlink()
。也许您可以复制该代码或从中找出它是如何完成的。

current->uid和current->euid在2.6中不再可用。它出现在早期的2.6内核中,但看起来它在2.6.27中被替换为
current\u uid()
宏。请参见
include/linux/cred.h