当前位置: 首页 > 编程笔记 >

在i386和x86-64上UNIX和Linux系统调用的调用约定是什么

微生曾琪
2023-03-14
本文向大家介绍在i386和x86-64上UNIX和Linux系统调用的调用约定是什么,包括了在i386和x86-64上UNIX和Linux系统调用的调用约定是什么的使用技巧和注意事项,需要的朋友参考一下

系统调用是应用程序和Linux内核之间的基本接口。当Unix / Linux程序执行文件I / O,网络数据传输或调用某个与低级指令直接或间接交互的进程时,就会涉及系统调用。进行这些调用通常涉及使用名为glibc的库,该库包含函数。

例子

以下是一些常用的系统调用及其用途的列表。

序号 系统调用 目的
1 chmod 更改文件的权限
2 chdir 更改工作目录
3 叉子 创建一个子进程
4 取消连结 删除名称以及它所引用的文件

系统程序员编写的程序不会直接进行系统调用,而只会指定要使用的系统调用。这涉及使用依赖于内核的调用约定或内核所在html" target="_blank">系统的硬件体系结构。因此,不同的体系结构具有不同的调用约定。

调用约定是实现级别的设计,用于子例程如何从其调用者接收参数以及如何返回结果。各种实现方式的差异包括放置参数,返回值,返回地址和作用域链接(寄存器,堆栈或内存等)的位置,以及如何在调用方和调用方之间划分准备函数调用和随后还原环境的任务。被呼叫者。

呼叫约定变化

以下是一些场景列表,描述了不同架构之间的调用约定如何变化

  • 哪个注册的被调用函数必须保留给调用者。

  • 在函数调用后如何设置和清理任务在调用者和被调用者之间如何划分。

  • 返回值如何从被调用方传递回调用方-在堆栈上,在寄存器中还是在堆内等。

  • 放置参数,返回值和返回地址的位置

  • 形式参数的实际参数传递的顺序。

比较x86-32和x86-64位

单个CPU体系结构始终具有不止一种可能的调用约定,但业界已同意采用不同生产者的跨体系结构的某种通用方法。32位体系结构具有32个寄存器,而x64将x86的8个通用寄存器扩展为64位。因此,调用约定的实现有所不同。下面是这两种架构之间主要调用约定的比较。

x-86 32位 x-86 64位
用于系统调用的寄存器是-%ebx,%ecx,%edx,%esi,%edi,%ebp 用于系统调用的寄存器是-%rdi,%rsi,%rdx,%r10,%r8和%r9
使用PUSH机制在堆栈上传递参数。如果有六个以上的参数,%ebx必须包含参数列表存储的内存位置 系统调用仅限于六个参数。如果有6个以上INTEGER参数,则将第7个INTEGER参数及更高版本传递给堆栈。
返回值存储在寄存器%eax中。 返回值存储在寄存器%rax中。
在x86-32中,参数在堆栈上传递。最后一个参数首先被压入堆栈,直到所有参数都完成,然后执行调用指令。 首先,将参数划分为类。每个参数的类确定将其传递给被调用函数的方式。
32位int ABI(应用程序二进制接口)可用于64位代码 64位ABI调用不能在32位系统中使用。
 类似资料:
  • 本文向大家介绍Unix和Windows中的系统调用,包括了Unix和Windows中的系统调用的使用技巧和注意事项,需要的朋友参考一下 进程和操作系统之间的接口由系统调用提供。通常,系统调用可用作汇编语言说明。它们也包含在汇编级程序员使用的手册中。 Unix系统调用 Unix中的系统调用用于文件系统控制,过程控制,进程间通信等。只能通过这些系统调用来访问Unix内核。通常,系统调用类似于函数调用,

  • 问题内容: 我正在尝试使用syscall 在Linux中分配一些内存。这是我尝试过的: 事情是按照linux调用约定,我希望返回值在寄存器中(指向已分配内存的指针)。我在gdb中运行了此文件,并在进行了syscall 后注意到以下寄存器内容 在系统调用之前 系统调用后 在这种情况下,我不太了解寄存器中的值。哪个指针可以用作我分配给它的8个字节的开头的指针? 问题答案: 系统调用返回值始终位于中。请

  • 系统调用 我们要想启动一个进程,需要操作系统的调用(system call)。实际上操作系统和普通进程是运行在不同空间上的,操作系统进程运行在内核态(todo: kernel space),开发者运行的进程运行在用户态(todo: user space),这样有效规避了用户程序破坏系统的可能。 如果用户态进程想执行内核态的操作,只能通过系统调用了。Linux提供了超多系统调用函数,我们关注与进程相

  • 我最近看到了以下帖子: 内存分配器的级别不低于malloc。(默认分配器通常直接或间接调用malloc) 分配器只允许您指定不同的分配策略。例如,您可以使用一个分配器,它调用malloc一次来检索一个大内存池,然后对于后续的分配请求,它只返回这个内存池的一小部分。 或者,您可以将其用作钩子,允许您在每次分配或释放内存时执行一些额外的任务。 关于你的第二个问题,malloc是您可以在不失去可移植性的

  • 问题内容: 我正在阅读有关x86和x64之间的汇编差异的信息。 在x86上,系统调用号码放在中,然后执行以生成软件中断。 但是在x64上,系统调用号码放在中,然后执行。 有人告诉我,这比生成软件中断更轻松,更快捷。 为什么在x64上它比x86快,并且我可以使用x在x64上进行系统调用吗? 问题答案: 一般部分 编辑:Linux无关部分已删除 虽然并非完全错误,但缩小问题范围并简化了问题,因为至少存

  • 本文向大家介绍C++系统调用是什么,你用过哪些系统调用相关面试题,主要包含被问及C++系统调用是什么,你用过哪些系统调用时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 1)概念: 在计算机中,系统调用(英语:system call),又称为系统呼叫,指运行在使用者空间的程序向操作系统内核请求需要更高权限运行的服务。系统调用提供了用户程序与操作系统之间的接口(即系统调用是用户程序和内核交互的