`
wangyanlong0107
  • 浏览: 499588 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

【转】 为什么Linux下不能运行Windows的程序

    博客分类:
  • os
 
阅读更多

所有与CPU有关的计算任务(OS也好,你自己的程序也好)最终都要转化为CPU的指令调用. CPU本身有它固有的指令集,CPU也只听命于它指令集范围内的指令. IBM-PC机的CPU指令系统大家在汇编语言课程中应有所接触了. 那么,有一点可以肯定的是,CPU接受指令工作是与OS无关的,不会因为在Windows下工作,跳转指令就 100101(假设),而在Linux下要用011010,这个层面(CPU工作)是远在OS层面以下的(即OS本身也是遵守CPU指令工作的).(btw,操作系统进行CPU调度是操作系统为了实现多任务进行的,不是你的程序指定的,所以与OS调度无关) 那么逻辑上说一条命令请求:计算1 + 1(假设是00101001010111111001),它是与平台无关的,只要是通过某种手段提交给CPU,CPU就应正常运作. 

但实际的情况并没有1+1这么简单: 
int main() { int a = 1 + 1; printf("%d\n",a); } 
这段C代码可以在各个OS平台下正常编译得到相应的可执行文件
Linux:test_l 
windows下test_w.exe 
且都能正常工作. 但test_l和test_w 2个文件如果用工具比较的话,大不相同. why? 

a. 因为一个可执行文件本身并不是仅仅包括对CPU的指令调用请求那么简单.还包括对全程序数据区,共享数据区,代码区的定义,程序中用到的字串需要在文件中存储,还要有对其它库调用信息的存储。因此一个可执行文件需要有一个结构,操作系统来解释这个结构,并按结构的定义分配内存,把代码加载到内存中的代码段,内存MAPPING,加载一些库...之后才是让CPU来执行此代码. 由上述,每个可执行文件都有自已的结构,这个结构也没有在业内形成统一标准(POSIX标准被WINDOWS支持如何?),就产生了不同的文件结构分类:WINDOWS下的COM 、MZ、NE、LE、PE... UNIX下的ELF COFF... 当然,这些不同结构的解释工作就归OS负责了。这一点就可以说明为什么在LINUX产生的ELF结构的可执行文件不可以被WINDOWS执行,也说明为什么GCC有for linux,还有for widnows的。 
b.抛开从技术上讲可不可以让WINDOWS来执行ELF文件,还有一点就足以让一次编译,处处运行的愿望破灭(JAVA就不提它了,它的VM为什么有FOR WINDOWS和LINUX之分?)。因为程序除了自身的计算之外,很多工作是需要让OS来完成的,比如输出printf("%d\n",a); 原则上说你可以通过CMOS中断自已搞定(这也可以实现平台无关了),但一般都是调用操作系统现成的接口,类似的情况很多,在WINDOWS下叫它们API,在UNIX下叫SYSTEM CALL。对相关DLL或SO的调用信息也是写在可执行文件内部的,试问一个指定了要调用linux.so2的某个函数的可执行文件让WINDOWS如何来解决呢? 

至此,剩下的只有感激了,感谢C标准委员会在WINDOWS平台和LINUX平台下使用stdio.h 中的打印函数都用printf(没有printf_for_win32 printf_for_linux64)之分,让开发者可以在一定范围内实现一次编写,到处编译(windows下和LINUX下printf的实现定是不同的了,但没人去关心它,编译器会自动帮你连接到合适的库)。

分享到:
评论

相关推荐

    在Linux操作系统上运行Windows应用程序

    其中,WINE( Wine Is Not an Emulator)是一个广为人知的开源项目,它提供了一个软件层,允许Linux用户直接在不依赖Windows操作系统的情况下运行某些Windows程序。尽管WINE已相当成熟,但并非所有Windows应用都能...

    wine 在Linux下运行Windows程序。

    如果你想在Linux下运行Windows程序,Wine将是你必不可少的工具!WINE(WINdows Emulator)在X和UNIX之上的,Windows 3.x 和 Windows APIs的实现。它是一个Windows兼容层,通俗的讲,就是一个Windows模拟器。这个层即...

    Windows程序在Linux上的运行.pdf

    在Linux操作系统中运行Windows程序是许多用户面临的问题,尤其是那些依赖特定Windows应用的用户。...随着技术的发展,未来可能会有更高效、更兼容的解决方案出现,以满足用户在Linux环境下运行Windows程序的需求。

    linux下与windows下程序运行时间检测

    本篇将详细探讨如何在Linux和Windows环境下进行程序运行时间的检测。 首先,让我们从Linux环境开始。在Linux中,我们可以使用C++的标准库函数`<chrono>`来实现精确的时间测量。`std::chrono::high_resolution_clock...

    wine (linux 下运行windows程序)

    也提供了一个程序加载器,该加载器允许不用任何修改Windows 3.1/95/NT的二进制文件,就可以运行在Intel Unix及其衍生版本下.Wine可以工作在绝大多数的UNIX版本下,包括Linux, FreeBSD, 和 Solaris. Wine不需要Microsoft...

    linux下运行windows程序wine

    Linux 下运行 Windows 程序 Wine Wine 是一个在 Unix/Linux 平台上运行的 Win32 API,允许用户在 Linux 上直接使用 Win32 软件,无需安装 Windows。...* Wine 支持在不同版本的 Windows 程序下运行

    Linux下的程序移植到windows

    "Linux下的程序移植到Windows" Linux下的程序移植到Windows需要修改的地方是非常重要的,因为Linux和Windows是两种不同的操作系统,它们之间存在很多差异。因此,在移植程序时需要注意许多问题,本文将介绍其中的...

    在linux上运行windows程序的平台,非虚拟机

    当然,虚拟机wmware也可以实现在linux下运行windows程序,但许要在linux上运行windows系统,浪费硬盘,运行两个系统速度超慢,而且能看到硬盘灯闪烁的厉害,对硬盘损耗极大。这款平台不需运行windows系统,就可以...

    linux c++工程转windows下c++工程工具

    开发者在使用工具前应确保Linux工程中的所有依赖项都能在Windows环境下找到相应的版本。 总结来说,"linux c++工程转windows下c++工程工具"简化了跨平台开发的流程,利用CMake的灵活性和Visual Studio的强大功能,...

    在Linux中直接运行Windows二进制程序

    虽然大多数linux爱好者都不怎么使用Windows,但是不少人还是习惯了某些Windows...有没有什么办法,能在xterm下直接通过My Windows App.exe来运行这些程序?幸运的是,Linux内核特性binfmt_misc就够帮助你达成这个愿望。

    Linux运行C#简单操作 示例程序

    在Linux系统中运行C#程序可能会让一些开发者感到陌生,因为C#主要与Microsoft的.NET框架和Windows操作系统关联。然而,随着.NET Core的发布,C#已经成为跨平台开发的重要选择,包括在Linux上。本资源提供了在Linux...

    Wine使用者指南,linux下运行windows程序

    ### Wine使用者指南:深入探索Linux下运行Windows程序 #### 概览与目的 Wine,一个开创性的软件,旨在让Linux用户能够在不依赖Windows操作系统的情况下,执行原生的Windows应用程序和游戏。它通过提供Windows API...

    linux下运行windows程序(以fedora14为例讲解)

    ### Linux下运行Windows程序——以Fedora 14为例 #### 概述 在Linux环境中运行Windows程序的需求并不罕见,特别是在需要使用某些专为Windows设计的应用软件时。本篇文章将详细介绍如何在Fedora 14操作系统中利用...

    windows程序移植到linux

    2. **分析依赖库:**Windows程序通常依赖特定的库文件(例如:DLLs),这些库可能在Linux环境下不存在或版本不兼容。 3. **了解API差异:**Windows与Linux之间存在着大量的API差异,例如文件系统接口、网络编程接口...

    在Windows上实现运行Linux程序,附示例代码

    在Windows操作系统上运行Linux程序可能看似不可能,但随着技术的发展,这一需求得到了满足。本文将深入探讨如何在Windows系统中实现这一目标,并提供一个实际的示例代码。 首先,我们需要了解的是,Windows与Linux...

    Wine使用教程,在linux下运行windows程序

    ### Wine使用教程:在Linux下运行Windows程序 #### 一、Wine简介 ...以上就是关于Wine的详细介绍,希望能帮助用户更好地理解和使用这个强大的工具,让在Linux环境下运行Windows程序变得更加便捷高效。

    socket linux c & windows c# windows客户端,服务器程序和linux下客户端,服务器程序。一共四个经典程序并有详细的注释。细细的阅读,一定会有收获。

    总之,这个资源为学习TCP Socket编程提供了宝贵的实践材料,无论是在Linux还是Windows环境下,都能帮助开发者掌握网络通信的核心技术。通过研究这些程序,可以加深对TCP协议和Socket接口的理解,为构建自己的网络...

    Windows程序运行于Linux系统的技术.pdf

    《Windows程序运行于Linux系统的技术》这篇文章探讨了在Linux环境下运行Windows程序的技术挑战与解决方案。在当前的操作系统竞争中,Linux系统尽管在服务器领域取得了显著成就,但在桌面应用领域仍面临困难,主要...

    在Linux操作系统上运行Windows应用程序.pdf

    WINE实际上是一个兼容层,它允许Windows API调用在Linux环境下被解释和执行,从而使得某些Windows程序能在不依赖Windows操作系统的情况下运行。然而,值得注意的是,WINE并不完美,有些应用程序可能无法正常运行或者...

Global site tag (gtag.js) - Google Analytics