我假设代码将用 C 编写。
我研究过编译器编译代码(词法分析,语法分析等)并将我们的代码转换为汇编代码,然后汇编器将代码汇编为机器代码,最终在硬件上执行。所以我怀疑为系统调用编写的代码是否可移植,即如果我将在某些硬件上编译相同的代码,这段代码会运行吗?
我是否正确地说,唯一依赖于架构的部分是编译器,并且一旦在其他架构上编译,系统调用就会运行良好?
我假设代码将用 C 编写。
我研究过编译器编译代码(词法分析,语法分析等)并将我们的代码转换为汇编代码,然后汇编器将代码汇编为机器代码,最终在硬件上执行。所以我怀疑为系统调用编写的代码是否可移植,即如果我将在某些硬件上编译相同的代码,这段代码会运行吗?
我是否正确地说,唯一依赖于架构的部分是编译器,并且一旦在其他架构上编译,系统调用就会运行良好?
系统调用取决于操作系统和架构。大多数情况下,如果体系结构或操作系统不同,则应重新编译您的程序。
例如sbrk
,brk
用于 malloc() 的系统调用,即 Windows 中不可用的动态内存分配。
参考 windows内存分配问题中 malloc 是如何实现的
有两种类型的系统调用,即“机器架构独立”和“机器架构依赖”可用。
如果您只使用独立于机器架构的机器,那么移植就不会太担心了。
来回答你的问题: 所以这取决于你使用的系统调用。但是必须重新编译。
甚至不考虑调用本身,调用约定在硬件体系结构之间也有很大差异。例如:
int
sysenter
/sysexit
syscall
/sysret
swi 0x420000
显然,这些都不是真正兼容的。因此,虽然大多数 x86 程序集可以在旧 x86、新 Intel x86/64 和 AMD x86/64 上运行,但系统调用是不同的。即使您使用像 Linux VDSO 这样的抽象,它仍然非常依赖于架构,甚至 VDSO 位于何处。
对于普通的函数调用,它更多地与调用约定有关,由于堆栈和寄存器的差异,调用约定因架构而异。
换句话说,几乎没有汇编代码是跨架构的。