5

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

我知道从内核空间使用系统调用是一种不好的品味,并且syscallN()宏在大多数平台上都被破坏了。任何在内核空间中替换getuid, geteuid, mknod, chown, unlink,系统调用的合理方法都值得赞赏。sched_yield

4

1 回答 1

4

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

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

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

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

和系统调用在mknodat; 他们最终分别叫和。也许您可以复制该代码或从那里弄清楚它是如何完成的。unlinkfs/namei.cvfs_mknod()vfs_unlink()

于 2010-01-15T15:53:29.300 回答