2013-02-04 34 views
2

请耐心回答,因为我对所有这些都是陌生的,并希望让我的基本知识100%正确。我是机械工程师,所以不要苛刻。我正在学习一些非常基本的低级别的东西,并有兴趣了解与编译器后端相关的概念。 C/C++编译器输出可能是专门为计算机体系结构定制的机器代码。这也意味着如果两者都运行在相同的硬件上,例如i7处理器,它们应该与Windows和Linux相同。但是二进制格式还有另外一层不同之处。也就是说,我们在Windows上使用ELF(Executable and Linkable Format),在Windows上使用PE/COFF(Portable Executable)。因此,我觉得,Linux和Windows上的编译器具有不同的工作后端,并以ELF或PE/COFF格式发送二进制文件。在ReactOS上运行ELF二进制文件

ReactOS是Windows的克隆版本,与Windows的兼容程度与二进制兼容。

从理论上讲,在ReactOS中有一个LOADER可以理解ELF并正确加载它吗?

我知道我们需要一层将Linux API映射到ReactOS API的软件。如果存在这样的映射层,我的问题是否有意义?

回答

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(yep,$ 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这样的东西存在。

+0

只是对Cygwin和Wine的澄清...使用Cygwin您需要重新编译并链接到它们的运行时库,Wine可以加载并运行未更改的Windows二进制文件。 – fortran

+1

是的,谢谢,几年过去了,我忘了事情 – ern0

相关问题