请耐心回答,因为我对这一切都是新手,并且希望我的基础知识100%正确。我是一名机械工程师,所以不要太苛刻。我正在学习一些非常基本的低级东西,并且有兴趣理解与编译器后端相关的概念。 C / C ++编译器输出可能是专门为计算机体系结构定制的机器代码。这也意味着如果它们在相同的硬件上运行,例如i7处理器,它在Windows和Linux中应该是相同的。但二进制格式的形式还有另一层差异。也就是说,我们在Linux上有ELF(Executable and Linkable Format),在Windows上有PE / COFF(Portable Executable)。
因此,我觉得,Linux和Windows上的编译器的后端工作方式不同,并以ELF或PE / COFF格式发出二进制文件。
ReactOS是Windows的克隆版,与Windows具有二进制兼容性。
理论上可以在ReactOS中使用LOADER来理解ELF并正确加载吗?
据我所知,我们需要一层将Linux API映射到ReactOS API的软件。如果存在这样的映射层,我的问题是否有意义?
答案 0 :(得分:2)
装载机是不够的。
操作系统有自己的系统调用接口。我不太了解Linux和Windows二进制API,上次我直接使用系统调用是MS-DOS。
在MS-DOS中,您可以通过将功能代码加载到AH寄存器来调用DOS功能,然后调用INT 21H。寄存器AL通常用作子功能或主要参数。例如。我记得如何退出程序:
MOV AX,4C01H ; funciton AH = $4C (exit), error code is AH = 1
INT 21H
; program gets never here
因此,其他操作系统提供其他时尚界面。例如。 AmigaDOS在绝对地址4(是的,$ 00000004)上有exec.library的地址,库函数可以通过跳转表访问,该跳转表位于库的“基”地址(-4,-8等)的负偏移。可以通过使用open函数从exec.library中询问其他库的指针。
好的,MS-DOS和AmigaDOS在不同的体系结构上运行,但它是操作系统调用可能有所不同的一个很好的例子。软件中断与第一个库提供的库地址。
有时候,差异就是运气。当不同的操作系统调用不干扰时,可以编写包装器,它接收外来操作系统调用,并将它们转换为主机操作系统。如果操作系统API仅仅区别于系统调用的参数顺序,那将是完美的 - 但情况更加困难。更简单的功能可以映射到其他操作系统的风格,但更复杂的功能 - 回调! - 更难。包装器不仅可以模拟功能,还可以模拟操作系统的错误。
无论如何,这种类型有一些好东西。
一个很好的例子是CygWin,它允许您在Win32下运行Linux程序。当我上次使用它时,运行任何命令行的东西都没有问题,即使是线程,网络等。 EDITED:它需要重新编译和libs,如@fortran所说。
对于Linux,WINE是运行Win32应用程序的一项很好的工作。甚至有官方Linux版本的商业软件,它们使用WINE!如果您的程序没有使用最新的Windows API调用,WINE应该可以工作。
由于Linux和BSD都是POSIX兼容的操作系统,因此存在这样的事情,例如BSD的Linux Compatibility Layer就不足为奇了。