所有与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的实现定是不同的了,但没人去关心它,编译器会自动帮你连接到合适的库)。
- 浏览: 481491 次
- 性别:
- 来自: 沈阳
最新评论
-
潇洒天涯:
[color=blue][color=cyan] ...
oracle 通过 nvl( )函数sql 查询时为 空值 赋默认值 -
hekai1990:
受教了..
oracle中的varchar2
【转】 为什么Linux下不能运行Windows的程序
- 博客分类:
- os
相关推荐
CodeWeaver公司最近发布了CrossOver Office 2.1版本,这一版本的...能够在Linux下运行这两个程序给专业的网页开发者带来了极大的好处,因为他们以前需要在Windows平台下编写一些能够在Linux服务器中运行的程序。
如果你想在Linux下运行Windows程序,Wine将是你必不可少的工具!WINE(WINdows Emulator)在X和UNIX之上的,Windows 3.x 和 Windows APIs的实现。它是一个Windows兼容层,通俗的讲,就是一个Windows模拟器。这个层即...
也提供了一个程序加载器,该加载器允许不用任何修改Windows 3.1/95/NT的二进制文件,就可以运行在Intel Unix及其衍生版本下.Wine可以工作在绝大多数的UNIX版本下,包括Linux, FreeBSD, 和 Solaris. Wine不需要Microsoft...
linux下与windows下程序运行时间检测
windows下运行linux命令的程序包 将bin.rar压缩包解压到本地磁盘上,然后在用户环境的Path变量中加入程序包的目录即可, 在dos下就可以使用linux命令了
linux下运行windows程序wine
linux下运行windows程序(以fedora14为例讲解) linux运行windows程序 linux运行windows程序 linux运行windows程序
Wine 是一个令人神往而且目标远大的开放源代码项目,它尝试去解决在 Linux 上运行 Windows 可执行文件的复杂问题。尽管 Wine 不是一个新项目,但是,人们对 Linux 桌面的期望以及对 Linux 应用程序的需求日益增加,...
当然,虚拟机wmware也可以实现在linux下运行windows程序,但许要在linux上运行windows系统,浪费硬盘,运行两个系统速度超慢,而且能看到硬盘灯闪烁的厉害,对硬盘损耗极大。这款平台不需运行windows系统,就可以...
虽然大多数linux爱好者都不怎么使用Windows,但是不少人还是习惯了某些Windows...有没有什么办法,能在xterm下直接通过My Windows App.exe来运行这些程序?幸运的是,Linux内核特性binfmt_misc就够帮助你达成这个愿望。
Windows程序在Linux上的运行.pdf
Wine使用者指南,linux下运行windows程序
wine 用于linux上运行windows程序
在 Linux Docker 容器中运行 Windows GUI 应用程序 图片来源: 特征 在 Linux 上 Dockerize Microsoft Windows 应用程序 通过 Web 浏览器中的远程桌面启用 GUI 例子 待补充。 用法 环境变量 USER_PASSWD - 用户...
有时候我们需要通过在linux上远程运行windows系统上的程序。 方法一: 通过python中的 winrm模块,前提条件,先提前设置好winrm服务。如何设置请自行百度,winRM服务是windows server下PowerShell的远程管理服务。...
这是毛德操老师率领下的开源项目,目的是让windows可执行程序直接在linux系统下运行。也就是说,给linux内核打补丁,使其支持windows可执行档。 这个是最新版0.2.4
在Linux操作系统上运行Windows应用程序.pdf
出现中文乱码的话,那一定是运行此程序的窗口的编码格式不一致,只要改为一致就可以了。如果要将dos窗口的编码方式改为UTF8,可参考:http://blog.csdn.net/joeblackzqq/article/details/7010322
在Windows平台和Linux平台运用API实现对一个启动的程序进行计时
Linux拥有丰富各种源代码资源,但是大部分代码在Windows平台情况是无法 正常编译的。Windows平台根本无法直接利用这些源代码资源。如果想要使用完整的代码,就要做移植工作。因为C/C++ Library的不同和其他的一些原因...