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

时间:2012-12-07 11:16:50

标签: c architecture operating-system system-calls

我保证代码将用C语言编写。

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

我是否正确地说,唯一的体系结构依赖部分是编译器和系统调用一旦在其他体系结构上编译将运行良好?

2 个答案:

答案 0 :(得分:2)

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

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

参考windows Windows memory allocation questions

中如何实现malloc

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

如果您仅使用独立的机器架构,则移植时不会太担心。

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

答案 1 :(得分:0)

甚至不考虑调用本身,调用约定在硬件架构中有很大差异。例如:

  • 旧版x86:int
  • Intel Newer x86 / 64:sysenter / sysexit
  • AMD x86 / 64:syscall / sysret
  • ARM:swi 0x420000

显然,这些都不是真正兼容的。因此,虽然大多数x86组件可以在旧的x86,较新的Intel x86 / 64和AMD x86 / 64上运行,但系统调用是不同的。即使您使用像Linux VDSO这样的抽象,它仍然非常依赖于体系结构,即VDSO的位置。

对于普通函数调用,它与调用约定有很大关系,由于堆栈和寄存器的不同,调用约定因架构而异。

换句话说,几乎没有汇编代码永远跨架构。