2010-03-22 58 views
3

我想在Linux中实现一个系统调用(RedHat Enterprise 8),我对它的工作方式有点困惑。根据我的理解,我实现了一个用户模式的包装器,它将系统调用号码放入eax和ebx,ecx,edx等参数中,然后调用int 0x80,调用相应的系统调用。我的问题是,由于系统调用像一个常规的C函数一样写,它怎么知道哪些寄存器包含什么参数?这是一种惯例,还是有一种机制,如果是的话,它在哪里以及如何做?系统调用如何知道包装函数在哪里放入其参数?

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

+1

那么,为什么你不阅读宏,看看他们在做什么呢? – 2010-03-22 21:42:52

+0

我做过了,但我无法从中找出任何东西。这不完全是标准的汇编代码。 – EpsilonVector 2010-03-22 21:54:12

回答

4

从第一页2

Linux Journal制品,底部由于系统调用接口专门寄存器参数化,至多六个参数可以用单个系统调用中使用。 %eax是系统调用号码; %ebx,%ecx,%edx,%esi,%edi和%ebp是用作param0-5的六个通用寄存器;并且%esp不能被使用,因为它在进入环0(即内核模式)时被内核覆盖。

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

相关问题