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