C 不同硬件架构的系统调用?
我假设代码将用C语言编写 我研究了编译器是否遵循代码(词法分析、语法分析等),并将代码转换为汇编代码,然后汇编程序将代码组装成机器代码,最后在硬件上执行。 因此,我怀疑为系统调用编写的代码是否可移植,也就是说,如果我将在某些硬件上编译相同的代码,该代码会运行吗C 不同硬件架构的系统调用?,c,architecture,operating-system,system-calls,C,Architecture,Operating System,System Calls,我假设代码将用C语言编写 我研究了编译器是否遵循代码(词法分析、语法分析等),并将代码转换为汇编代码,然后汇编程序将代码组装成机器代码,最后在硬件上执行。 因此,我怀疑为系统调用编写的代码是否可移植,也就是说,如果我将在某些硬件上编译相同的代码,该代码会运行吗 我说的唯一依赖于体系结构的部分是编译器,并且在其他体系结构上编译后的系统调用可以正常运行,这对吗 系统调用取决于操作系统和体系结构。大多数情况下,如果架构或操作系统不同,则应重新编译程序 例如,用于malloc()的sbrk和brk系统调
我说的唯一依赖于体系结构的部分是编译器,并且在其他体系结构上编译后的系统调用可以正常运行,这对吗 系统调用取决于操作系统和体系结构。大多数情况下,如果架构或操作系统不同,则应重新编译程序 例如,用于malloc()的
sbrk
和brk
系统调用,即windows中不可用的动态内存分配
请参阅如何在windows中实现malloc
有两种类型的系统调用可用,即“独立于机器体系结构”和“依赖于机器体系结构”
如果您只使用独立于机器体系结构的,那么在移植方面就不会有太多担心
来回答您的问题:
所以这取决于您使用的系统调用。但是必须重新编译。即使不考虑调用本身,调用约定在不同的硬件体系结构中也有很大差异。例如:
- 旧版x86:
int
- 英特尔更新版x86/64:
/sysenter
sysexit
- AMD x86/64:
/syscall
sysret
- ARM:
swi 0x420000
换句话说,几乎没有汇编代码是跨体系结构的。谢谢你的回答。但正如您所说,有两种类型的系统调用:独立和依赖。如果我调用的是独立于体系结构的调用,那么为什么我需要重新编译?无论是否使用相同的系统调用,代码都必须重新编译,因为不同的体系结构有不同的指令sets@szx我同意你的观点,每个架构都有不同的指令集。那么这是否意味着编译器将生成依赖于体系结构的代码,或者是汇编程序生成特定于机器的代码的工作?
malloc()
不是系统调用malloc()
只是C库中的一个标准化函数,这是完全不同的事情,是独立于平台的。@Blachshma请解除我的禁令。。我还需要一次机会!