C 不同硬件架构的系统调用?

C 不同硬件架构的系统调用?,c,architecture,operating-system,system-calls,C,Architecture,Operating System,System Calls,我假设代码将用C语言编写 我研究了编译器是否遵循代码(词法分析、语法分析等),并将代码转换为汇编代码,然后汇编程序将代码组装成机器代码,最后在硬件上执行。 因此,我怀疑为系统调用编写的代码是否可移植,也就是说,如果我将在某些硬件上编译相同的代码,该代码会运行吗 我说的唯一依赖于体系结构的部分是编译器,并且在其他体系结构上编译后的系统调用可以正常运行,这对吗 系统调用取决于操作系统和体系结构。大多数情况下,如果架构或操作系统不同,则应重新编译程序 例如,用于malloc()的sbrk和brk系统调

我假设代码将用C语言编写

我研究了编译器是否遵循代码(词法分析、语法分析等),并将代码转换为汇编代码,然后汇编程序将代码组装成机器代码,最后在硬件上执行。 因此,我怀疑为系统调用编写的代码是否可移植,也就是说,如果我将在某些硬件上编译相同的代码,该代码会运行吗


我说的唯一依赖于体系结构的部分是编译器,并且在其他体系结构上编译后的系统调用可以正常运行,这对吗

系统调用取决于操作系统和体系结构。大多数情况下,如果架构或操作系统不同,则应重新编译程序

例如,用于malloc()的
sbrk
brk
系统调用,即windows中不可用的动态内存分配

请参阅如何在windows中实现malloc

有两种类型的系统调用可用,即“独立于机器体系结构”和“依赖于机器体系结构”

如果您只使用独立于机器体系结构的,那么在移植方面就不会有太多担心

来回答您的问题:
所以这取决于您使用的系统调用。但是必须重新编译。

即使不考虑调用本身,调用约定在不同的硬件体系结构中也有很大差异。例如:

  • 旧版x86:
    int
  • 英特尔更新版x86/64:
    sysenter
    /
    sysexit
  • AMD x86/64:
    syscall
    /
    sysret
  • ARM:
    swi 0x420000
显然,这些都不是真正兼容的。因此,虽然大多数x86汇编可以在旧的x86、新的Intel x86/64和AMD x86/64上运行,但系统调用是不同的。即使您使用像LinuxVDSO这样的抽象,VDSO的位置仍然非常依赖于体系结构

对于正常的函数调用,它更多地涉及调用约定,由于堆栈和寄存器的差异,这些约定在不同的体系结构中有所不同


换句话说,几乎没有汇编代码是跨体系结构的。

谢谢你的回答。但正如您所说,有两种类型的系统调用:独立和依赖。如果我调用的是独立于体系结构的调用,那么为什么我需要重新编译?无论是否使用相同的系统调用,代码都必须重新编译,因为不同的体系结构有不同的指令sets@szx我同意你的观点,每个架构都有不同的指令集。那么这是否意味着编译器将生成依赖于体系结构的代码,或者是汇编程序生成特定于机器的代码的工作?
malloc()
不是系统调用
malloc()
只是C库中的一个标准化函数,这是完全不同的事情,是独立于平台的。@Blachshma请解除我的禁令。。我还需要一次机会!