大家好,近期我发的文章都比较底层,过些天再发Linux基础方面的内容,多谢大伙儿的支持,回到正题。

您看,linux和windows都是运行在x86体系架构cpu上的操作系统,也就是指令的机器码都是一样的,为什么linux系统下的应用程序不能在windows系统下运行呢?其实,windows下的程序也无法直接在linux下运行,也许您在想,这不是废话吗。对于这个问题,很多同学都会马上给出答案:格式不同!其实。。。。答对啦,哈哈,确实是格式不同,不过这只是一方面,还有另一方面,系统API不同,API即Application Programming Interface,应用程序编程接口。

先说说格式,格式也可称为协议,协议是指:在某个固定的位置有固定意义的数据。比如偏移量为A字节、连续大小为B字节的空间中,存放的是数据C,像mysql协议、http协议都是类似这样的组织形式。一般特定于某个应用程序的文件只能被那个应用程序打开,原因是只有那个程序懂这个文件,如何懂呢?应用程序在生成文件时,一般都会在文件的开始部分写一段固定格式的数据,也就是元信息,这段数据称为文件头,故文件头是某个应用程序为自己埋下的伏笔,应用程序需要从文件头中获取文件的信息以方便它解析该文件。比如视频播放软件可通过读取视频文件的文件头来提前了解视频的信息,以选择合适的播放模式。这种应用程序和被解析文件的关系同样适用于操作系统和可执行程序,可执行程序是被操作系统识别并加载的。

Linux下的可执行程序格式是elf,也就是 “Executable and Linking Format。平时咱们用readelf命令可以查看elf文件头,里面有节(section)信息,段(segment)信息,程序入口(entry_point),哪个段由哪些节组成等等信息。而windows下的可执行程序是PE格式(portableexecutable,可移植的可执行文件),因为我没了解过,所以具体文件头咱们就不关注了,有兴趣的同学自行查看。说到这您也懂了,如果文件可以被多种应用程序解析的话,这个文件的格式必须被多种应用程序接受,即所有的应用程序都要认得这种格式的文件,比如一个视频文件可以被多种播放器播放原因正是如此。linux程序不能在windows下运行,说白了就是人家windows不认linux文件的格式。如果windows肯支持elf文件格式,那么linux程序在windows下运行也是可能的,但是…,还没完,还有另外一个硬伤,这就是操作系统API不同。

操作系统是通过API为应用程序提供功能支持的,一般是通过软中断指令int,再加上一个中断向量号来实现,这也称为系统调用。Linux是通过int 0x80来实现系统调用的,而windows是通过int 0x2e来实现的,也就是说,两个操作系统下的应用程序获得操作系统功能的方式不同,同样一句机器指令int 0x80,在linux下就是进入内核以获得操作系统的功能支持,结果是符合预期的,而在windows下却是另一翻景象,获得的结果也许是灾难性的。所以,双方的应用程序显然是不能在对方的系统中运行。

除以上原因外,这还和编译器、标准库有关,不再列举。

先到这。

举报/反馈

在Linux中某些程序无法运行,为何linux下的程序不能在windows下运行,不是“废话”那么简单...相关推荐

  1. Linux下dislocate命令用法,在 Linux 中遨游手册页的海洋 | Linux 中国

    原标题:在 Linux 中遨游手册页的海洋 | Linux 中国 Linux 系统上的手册页可以做的不仅仅是提供特定命令的信息.它们可以帮助你发现你没有意识到的命令. https://linux.cn ...

  2. linux中打开pdf文件_在Linux中减少PDF文件大小

    linux中打开pdf文件 In our Linux system, If we have a large PDF file, we may want to reduce it's size. We ...

  3. linux vi 移动光标,linux中vi命令的光标移动操作linux网页制作 -电脑资料

    分享一篇关于linux中vi命令的光标移动操作的文章,有需要的朋友可以参考一下, 全屏幕文本编辑器中, 光标的移动操作无疑是最经常使用的操作了.用户只有熟练地使用移动光标的这些命令,才能迅速准确地到达 ...

  4. Linux下的dirent.h在windows下的替换

    一.问题背景 dirent.h是一个用于操作文件系统目录的接口文件,里面有目录相关的读取函数.但dirent.h是linux系统下的文件,在windows下不能直接应用,因为windows下的MSVC ...

  5. linux中使用yum安装主程序包,linux使用yum对程序包管理相关知识

    yum客户端: 配置文件: /etc/yum.conf:为所有仓库提供公共配置 /etc/yum.repos.d/*.repo:为仓库的指向提供配置 仓库的定义: [repositoryID] nam ...

  6. linux中bash的功能主要有,Linux系统中的Bash功能的介绍

    今天小编要跟大家分享的文章是关于Linux系统中的Bash功能的介绍.一个完整计算机的体系结构包括:硬件与软件,而软件又分为系统软件与应用软件,负责对硬件仅需管理与操作的是系统软件的内核部分,用户是无 ...

  7. 在linux中查看端口信息,怎样在 Linux 上查看某个端口的相关信息?

    C#用扩展方法进行自动生成添加删除对象转换的功能 public static class ExtendedModel { #region 实体类的增删改查 #region 添加 public stat ...

  8. linux中网页播放音乐,Linux_在Linux系统下播放网页中的背景音乐技巧,在Linux中的firefox浏览许多网页 - phpStudy...

    在Linux系统下播放网页中的背景音乐技巧 在Linux中的firefox浏览许多网页时,很多使用了基于WMP的背景音乐播放器,如部份baidu空间.但firefox默认不支持播放. 在LINUX的源 ...

  9. linux中s权限大小写的区别,Linux中的权限

    1.文件与目录权限 1)UID与GID ØUID UID是一个数值,是Linux系统中唯一的用户标识,用于区别不同的用户.在系统内部管理进程和文件保护时使用UID字段.在Linux系统中,注册名和UI ...

  10. linux中exit和fatal区别,关于Linux系统命令中exit与exit的区别

    关于Linux系统命令中exit与exit的区别 注:exit()就是退出,传入的参数是程序退出时的状态码,0表示正常退出,其他表示非正常退出,一般都用-1或者1,标准C里有EXIT_SUCCESS和 ...

最新文章

  1. Matlab与线性代数 -- 均匀分布的随机矩阵
  2. variant 字符串数组_VB数组部分核心知识总结
  3. request获得请求参数
  4. jquery获取下拉框的值并传递给后端处理
  5. 如何处理object family XXX is not intended for installed base category issue
  6. DDD战略设计相关核心概念的理解
  7. matlab如何将相近的数据,matlab新手,求帮助!主要是如何将数据和公式导入
  8. 中考在即,杂乱的书房
  9. 1022: [SHOI2008]小约翰的游戏John - BZOJ
  10. 卷积神经网络参数说明
  11. 手把手教你做一个2048 上
  12. 【微信防封域名】【微信不死域名】【微信域名白名单】
  13. [每日一氵] Python 写程序专用 log 分享
  14. 如何在Word项目符号列表中将图片用作项目符号
  15. jmeter无法启动,jmeter启动后找不到java环境问题
  16. 微信小游戏 腾讯课堂《白鹭教育 - 成语大挑战小游戏开发》学习笔记
  17. HC32L136/HC32L176开发之硬件IIC驱动AT24C64
  18. Android踩坑之 couldnt find libClingSDK.so
  19. 《多媒体在初中数学中的运用研究》课题工作报告
  20. k8s教程(Volume篇)-PVC详解

热门文章

  1. android dumpsys 分析,Android开发调试性能分析工具:dumpsys
  2. 基于FPGA的UART接口协议设计
  3. 无人驾驶方面牛人和实验室
  4. RocketMQ专栏
  5. Linux Redis 重启数据丢失解决方案,Linux重启后Redis数据丢失解决方
  6. sed 正则表达式【MAC地址】GLPI转换华为交换机MAC格式
  7. MPAndroidChart——饼图
  8. 连贯的学习黑树(插入节点)
  9. 企业中两个重要而又容易被忽视的角色,互联网营销
  10. JS和C#访问遇到QueryInterface调用出错