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

时间:2010-01-15 09:25:13

标签: linux-kernel system-calls

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

我知道从内核空间使用系统调用很不好,并且syscallN()宏在大多数平台上都被破坏了。我们赞赏在内核空间中替换getuidgeteuidmknodchownunlinksched_yield系统调用的任何合理方法。

1 个答案:

答案 0 :(得分:3)

current->uidcurrent->euid可以替代前两个。

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

文件系统操作看起来更复杂:您可以尝试查看是否导出sys_chown()sys_mknod()sys_unlink()(可供任何模块使用)。如果他们工作,那很好。有一些useful tips here。否则,你必须深入挖掘一下:

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

mknodatunlink系统调用位于fs/namei.c;他们最终分别致电vfs_mknod()vfs_unlink()。也许你可以复制那些代码或弄清楚它是如何完成的。