【问题标题】:How do I call Linux syscall from kernel space?如何从内核空间调用 Linux 系统调用?
【发布时间】:2010-01-15 09:25:13
【问题描述】:

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

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

【问题讨论】:

    标签: linux-kernel system-calls


    【解决方案1】:

    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()。也许您可以复制该代码或从那里弄清楚它是如何完成的。

    【讨论】:

    • current->uid 和 current->euid 在 2.6 中不再可用。
    • 它存在于早期的 2.6 内核中,但看起来它在 2.6.27 中被 current_uid() 宏所取代。见include/linux/cred.h
    猜你喜欢
    • 2018-11-29
    • 1970-01-01
    • 2011-12-15
    • 1970-01-01
    • 2010-09-20
    • 2013-11-01
    • 1970-01-01
    • 2012-11-18
    • 1970-01-01
    相关资源
    最近更新 更多