【问题标题】:How to implement my own system call without recompiling the Linux kernel?如何在不重新编译Linux内核的情况下实现自己的系统调用?
【发布时间】:2013-06-17 14:22:11
【问题描述】:

我想实现自己的系统调用。 (见下面的链接)

http://www.tldp.org/HOWTO/html_single/Implement-Sys-Call-Linux-2.6-i386/

但是添加新的系统调用需要内核编译。

如何在不重新编译Linux内核的情况下实现自己的系统调用?

【问题讨论】:

    标签: c linux linux-kernel system-calls


    【解决方案1】:

    你不能。

    如果不重新编译内核,你所能做的就是构建和加载内核模块,而内核模块不能添加新的系统调用。

    【讨论】:

    • 这很简短。
    • 好吧,从技术上讲,受空间等限制,使用内核模块,您可以将自己的系统调用修补到现有的系统调用表中。但这很混乱,不可靠,绝对不是一个好主意。
    • 从技术上讲,IOCTL 是一个系统调用。那么,当您可以使用它来包装您的数据并在用户和内核领域进行通信时,您为什么要添加一个新的系统调用?
    • @Ash:对——你当然可以为现有函数调用添加功能,比如ioctl(),但你不能添加全新的系统调用。
    【解决方案2】:

    当然可以。

    简而言之,您需要修补正在运行的内核。

    至少有两种方法可以添加新的系统调用:

    1. 在任何系统调用条目(system_callia32_system_all 等处)扩展现有系统调用表(sys_call_tableia32_sys_call_table)并修补系统调用限制检查指令(通常是 x86 上的 cmp)。 ..)
    2. 复制现有系统调用表,根据需要对其进行扩展,修补系统调用调度指令(通常在 x86 上为 call)以指向表的副本,并在任何系统调用条目处修补系统调用限制检查指令。

    详情请参阅此答案:

    Implementing Linux System Call using LKM

    How do 32-bit applications make system calls on 64-bit Linux?

    :)

    【讨论】:

    • 你描述的方法非常丑陋和不安全——除非你非常小心,否则加载时它很有可能会导致机器崩溃。在任何情况下,我都不会考虑使用在生产系统上执行此操作的模块。
    • 至于方法,它有效,但实现很重要,你是对的。正确的实施需要强大的技能,而这项任务不适合傻瓜:)
    猜你喜欢
    • 2023-03-03
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-27
    • 2013-01-21
    相关资源
    最近更新 更多