为什么Linux和Windows下的程序不能互通?

在大致了解过一个程序是怎么被CPU执行之后,我就在思考一个问题,既然我们用高级语言写的程序最终都是机器码,而机器码又只和CPU的架构有关,所以按照这个道理,同一台电脑下的不同的系统中的程序应该是可以互通的呀!然而事实却不是这样的,如果真是这样,那Linux再也不会让我劝退了,我也就不会被迫把自己的电脑装回windows了。既然事实与我们所想不一致,那一定在高级语言转换为机器码的过程中遗漏了什么细节。询问ChatGPT(狗头)之后,问题得到了解答。我们先将CPU执行高级语言的过程给稍微细节化,高级语言通过编译,汇编,链接,装载这几个步骤之后,CPU就可以执行这个程序了。我们知道编译的过程是将高级语言转换为汇编语言(不是全部高级语言都有这个过程),汇编的过程就是将汇编语言转换为目标文件(对应CPU指令集架构的目标文件)

这三个过程,因为CPU指令集的限制,所以无论在过程中文件怎么变化,到目标文件的时候,按照理论来说Windows和Linux生成的目标文件应该都是一样的(注意是理论上)。那么可能出问题的地方就只能是后面的两步,链接和装载。先说链接,链接的目的是为了让不同文件中的程序可以被互相调用,可是如果链接的文件是Linux专属或者Windows专属的呢?那么这个程序想要跨平台运行就肯定不可能了。现在我们来谈论装载过程,装载过程是将我们的可执行文件装载到内存中,而这个过程需要装载器,问题就出在装载器上,其实在linux中,目标文件和可执行文件(链接过程之后形成的文件)用到的文件格式都是ELF,而Windows用的文件格式却是PE,所以装载器在Linux和Windows中的实现是不一样的,Linux的装载器只需要解析ELF格式的文件就可以了,而Windows的装载器只需要解析PE的格式就可以了。也正是因为可执行文件的格式不对,装载器就无法正确的将可执行文件装载到内存中,可以这样类比,比如明明是一张图片,而你却用记事本打开,得到的结果只能是乱码。既然得到的是乱码,CPU怎么可能正确的执行程序呢?所以我们又可以解释一个现象了,比如Windows中的WSL了,思考一下为什么WSL可以执行linux的命令,不就是WSL实现了ELF的装载器以及一些Linux下专有的链接库吗?如果熟悉Linux的朋友,就一定听说过Wine,他也是通过实现一个PE的装载器,来达到在Linux中,运行Windows的程序。

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
pandaer
作者分享
你是否也只把 MySQL 当作一个“只会存取数据”的黑盒?前端发请求,你查数据库,看似简单,但当查询变慢、死锁频发时,你是否因为不懂内部原理而无从下手? 本文不讲晦涩的源码,而是像拆解玩具一样,带你钻进 MySQL 内部:从连接器到存储引擎,看清一条 SQL 到底经历了什么;从 Redo Log 到两阶段提交,搞懂数据是如何被安全写入的。别再只做“CRUD”工程师了,今天带你真正看透 MySQL 的本质! 原文如下:https://mp.weixin.qq.com/s/f6loMKH25VWPfkJYl2yAxg
5
  不知道你有没有想过,计算机是如何从一个想法不断演进到今天的呢?   在起初有这样一个想法,“计算”这件事能不能用机器来实现,让机器来帮我们干活呢?这个想法诞生之后,就不断的有人还在开始尝试实现这个想法,其中图灵提出了自己的一个实现思路,也就是现在大名鼎鼎的「图灵机」,但是图灵机仍然无法落地,因为它有一个「无限长纸带」的假设。于是后人在图灵机这个理想的模型上继续演进,其中冯洛伊曼提出的计算机体系结构成为了主流。   在冯洛伊曼体系结构中,计算机所有的一切都由01组成,无论是文本,图片,声音,还是指令;有5大基础组件,运算器,控制器,存储器,输入输出。后人基于冯洛伊曼提出的计算机体系结构,结合数学和物理相关的知识,就制造出了那些我们耳熟能详的计算机硬件,比如CPU,内存,硬盘,各种外设。基于这些计算机硬件我们就可以组装出一台可以运行的计算机了。值得一提的是,在制造计算机硬件的过程中,数学与物理电学相关的部分,衍生出了一个新的学科「数字逻辑」。   到此,一个可运行的计算机就被制造出来了。
5
  MySQL数据页笔记 这种底层数据结构的设计,基本上都有两部分组成,一部分是真实的数据,一部分是描述这些数据的信息,也叫做元信息。   数据页的组成分为这么几个部分   1. file header 校验和 页号 前一条页号 下一条页号   2. page header 下一条记录 删除标识   3. 最大最小记录   4. record data   5. free space   6. page directory slot 二分查找   7. file tail 校验和 与file header一起用作刷盘时数据的完整性校验。
2
  精力拥有四大来源,这四大来源组成了精力金字塔,从底往上分别是体能,情绪,专注,目标意义感。   体能是基础,体能好,尤其是心肺能力好的人,更加不容易疲劳。所以有规律的运动很重要。   情绪,消极的情绪会不断消耗自己的精力,相信你一定深有感受,遇到消极情绪,需要及时走出来,我的做法就是不纠结,不去想。所以保持一个正面的,积极的心情也很重要   专注,指的是专注的思维,是我们常说的专注力,人脑天生对有难度复杂的事情有抗拒感,而且我们一段时间就只能做一件事情   目标意义感,就是要有清晰的目标,明确的计划。
3
  精力是什么? 如果把人比做手机,那么精力就是「电池」,精力决定了你一天可以做多少事情,效率又有多高。精力充沛的人效率高,做事又好又快,而精力低的人不仅效率低,而且完成的事情的质量也不高。所以让我们做一个高精力的人吧!   那么怎样才算是高精力的人?我将精力划分为4个等级,「不堪重负」「积极应对」「全力以赴」「游刃有余」   1. 不堪重负:不仅自己有挫败感,而且还终日疲惫不堪   2. 积极应对:白天的工作可以认真完成,但是一下班,就想睡觉,甚至连娱乐都不想   3. 全力以赴:白天可以认真工作,下班后至少不会只想躺在床上   4. 游刃有余:白天不仅可以认真工作,下班后也可以积极享受生活,或者充电学习   精力除了有这4个等级之外,精力在一天也是波动的,某个时间段精力高,某个时间段精力低。一个可以落地的方法是**在精力高的时候做有难度高专注的事情,做重要的事情**,那如何判断自己的那个时间段精力高呢?自测,将一天分为几个时间段   1. 醒来后两个小时   2. 8~11点   3. 11~13点   4. 13点~15点   5. 15点~18点   6. 18点~20点   7. 20点~23点   在你认为精力最好的时间段打10分,然后再给其他时间段基于此打分,得到一个曲线图。然后在这个曲线图的高点做重要的事情,低点做一些不费脑子的事情。
5
下载 APP