我试图知道exec()系统调用参数存储在哪些寄存器中。
我首先运行了一个执行exec系统调用的简单C程序并获取其对象转储,并发现RDI用于包含要执行的进程的参数,并且syscall指令用于在内核中调用execve 。我是在64位Ubuntu 12.04操作系统中完成的。
然后我在QEMU上运行的Ubuntu 11.10 OS(32位)上运行该程序。但是现在在没有使用0x80的对象转储中,并且参数在EBX中。
我在2个方面感到困惑..为什么int80在1个地方使用而syscall在另一个地方使用,如何选择execve系统调用的寄存器?
答案 0 :(得分:0)
您所看到的是,在向正在运行的操作系统发出服务请求时,不同的芯片架构使用不同的系统调用约定。此类约定是操作系统定义的 ABI (应用程序二进制接口)的一部分 - ABI定义的其他内容包括:
用于将参数传递给函数的寄存器(和/或堆栈布局)
注册一个函数可以用作临时空间,在返回时它必须恢复到以前的值
处理器地址空间内程序的(虚拟)内存布局
请记住,尽管它们通常都受同一物理处理器的支持(出于向后兼容性原因),但英特尔64位(IA64)和32位(IA32)架构仍然是独立的,具有不同(如果重叠)的寄存器,并且与不同的ABIs。正如您所注意到的,这两个ABI在系统调用的参数放置方面以及向内核发出正在进行系统调用的信号方面都有所不同。
目前,操作系统ABI通常由提供特定芯片架构的公司定义(至少作为建议),因此通常在给定架构上运行的所有(或大多数)操作系统提供相同的ABI,但情况并非总是如此 - 并且仍然可以找到在完全相同的硬件上运行的不同操作系统之间所记录的类型的差异。