我正在尝试在 Linux(RedHat Enterprise 8)中实现一个系统调用,但我对它的工作方式有点困惑。据我了解,我在用户模式下实现了一个包装器,它将系统调用号放在 eax 中,并将参数放在 ebx、ecx、edx 等中,然后调用 int 0x80 来调用适当的系统调用。我的问题是,由于系统调用像常规 C 函数一样编写,它如何知道哪些寄存器包含哪些参数?它是一种惯例,还是有一种机制,如果有,它在哪里以及如何做到这一点?
编辑:这是一个家庭作业。我知道有系统调用宏可以为我做这些事情。
我正在尝试在 Linux(RedHat Enterprise 8)中实现一个系统调用,但我对它的工作方式有点困惑。据我了解,我在用户模式下实现了一个包装器,它将系统调用号放在 eax 中,并将参数放在 ebx、ecx、edx 等中,然后调用 int 0x80 来调用适当的系统调用。我的问题是,由于系统调用像常规 C 函数一样编写,它如何知道哪些寄存器包含哪些参数?它是一种惯例,还是有一种机制,如果有,它在哪里以及如何做到这一点?
编辑:这是一个家庭作业。我知道有系统调用宏可以为我做这些事情。
来自Linux Journal文章,第 2 页底部
由于系统调用接口是专门注册参数的,所以一个系统调用最多可以使用六个参数。%eax 是系统调用号;%ebx、%ecx、%edx、%esi、%edi 和 %ebp 是用作 param0-5 的六个通用寄存器;并且 %esp 不能使用,因为它在进入 ring 0(即内核模式)时被内核覆盖。
您的 c 代码可能看起来像是在进行系统调用,但实际上它调用了 libc 中的函数。该函数确保所有参数都在正确的寄存器中,然后执行中断。