【问题标题】:How does a syscall knows where the wrapper function put its parameters in?系统调用如何知道包装函数将其参数放在哪里?
【发布时间】:2011-01-30 13:22:07
【问题描述】:

我正在尝试在 Linux (RedHat Enterprise 8) 中实现系统调用,但我对它的工作方式有点困惑。据我了解,我在用户模式下实现了一个包装器,它将系统调用号放在 eax 中,并将参数放在 ebx、ecx、edx 等中,然后调用 int 0x80 来调用适当的系统调用。我的问题是,由于系统调用像普通 C 函数一样编写,它如何知道哪些寄存器包含哪些参数?它是一种惯例,还是有一种机制,如果有,它在哪里以及如何做到这一点?

编辑:这是一个家庭作业。我知道有系统调用宏可以为我做这些事情。

【问题讨论】:

  • 那么你为什么不阅读宏来看看它们在做什么呢?
  • 我做到了,但我无法从中弄清楚任何事情。这不完全是标准的汇编代码。

标签: linux system-calls


【解决方案1】:

来自Linux Journal 文章,第 2 页底部

由于系统调用接口是专门注册参数的,一个系统调用最多可以使用六个参数。 %eax 是系统调用号; %ebx、%ecx、%edx、%esi、%edi 和 %ebp 是用作 param0-5 的六个通用寄存器;并且 %esp 不能使用,因为它在进入 ring 0(即内核模式)时被内核覆盖。

您的 c 代码可能看起来像是在进行系统调用,但实际上它调用了 libc 中的函数。该函数确保所有参数都在正确的寄存器中,然后执行中断。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-07
    • 2019-11-13
    • 1970-01-01
    • 1970-01-01
    • 2014-01-22
    • 2020-02-23
    • 2013-05-08
    • 2012-12-07
    相关资源
    最近更新 更多