1

我假设代码将用 C 编写。

我研究过编译器编译代码(词法分析,语法分析等)并将我们的代码转换为汇编代码,然后汇编器将代码汇编为机器代码,最终在硬件上执行。所以我怀疑为系统调用编写的代码是否可移植,即如果我将在某些硬件上编译相同的代码,这段代码会运行吗?

我是否正确地说,唯一依赖于架构的部分是编译器,并且一旦在其他架构上编译,系统调用就会运行良好?

4

2 回答 2

2

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

例如sbrkbrk用于 malloc() 的系统调用,即 Windows 中不可用的动态内存分配。

参考 windows内存分配问题中 malloc 是如何实现的

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

如果您只使用独立于机器架构的机器,那么移植就不会太担心了。

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

于 2012-12-07T11:28:41.427 回答
0

甚至不考虑调用本身,调用约定在硬件体系结构之间也有很大差异。例如:

  • 较旧的 x86:int
  • 英特尔较新的 x86/64:sysenter/sysexit
  • AMD x86/64:syscall/sysret
  • 手臂:swi 0x420000

显然,这些都不是真正兼容的。因此,虽然大多数 x86 程序集可以在旧 x86、新 Intel x86/64 和 AMD x86/64 上运行,但系统调用是不同的。即使您使用像 Linux VDSO 这样的抽象,它仍然非常依赖于架构,甚至 VDSO 位于何处。

对于普通的函数调用,它更多地与调用约定有关,由于堆栈和寄存器的差异,调用约定因架构而异。

换句话说,几乎没有汇编代码是架构的。

于 2012-12-07T14:51:04.067 回答