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

Bas*_*evs 5 system-calls linux-kernel

我正在移植为Linux 2.4编写的linux内核模块,以便与Linux 2.6一起使用.在代码中使用了一些通过syscallN()宏声明并包含在set_fs()调用中的系统调用.如何在Linux 2.6中仍然使用那些不存在这些宏的sycall?

我知道从内核空间使用系统调用是很糟糕的,并且syscallN()在大多数平台上都会破坏宏.任何合理的方式来代替getuid,geteuid,mknod,chown,unlink,sched_yield在内核空间系统调用表示赞赏.

Eri*_*nen 4

current->uid并且current->euid可以替代前两者。

schedule()应该为最后一个工作。

文件系统操作看起来更复杂:您可以尝试查看sys_chown()sys_mknod()sys_unlink()是否被导出(可供任何模块使用)。如果它们有效,那就太好了。这里有一些有用的提示。否则,你必须更深入地挖掘:

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

mknodat系统unlink调用位于fs/namei.c; 他们最终分别跟注vfs_mknod()vfs_unlink()。也许您可以复制该代码或从那里弄清楚它是如何完成的。

  • 它存在于早期的 2.6 内核中,但看起来在 2.6.27 中被 `current_uid()` 宏替换。请参阅“include/linux/cred.h”。 (3认同)