前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >面试官:说说32位和64位

面试官:说说32位和64位

作者头像
喵叔
发布2021-12-27 08:41:28
发布2021-12-27 08:41:28
8600
举报
文章被收录于专栏:喵叔's 专栏喵叔's 专栏

在软件的世界里,有32位软件和64位软件,那么你是否想过32位和64位软件有什么区别吗?下面我就带领大家来看看32位和64位的区别。

第一个64位操作系统

首要的区别是32位和64位CPU的指令集合、操作数位数、寄存器名称和个数都不相同。例如mov eax,1指令,在32位CPU上对应的机器指令是0x1201;而在64位机器上就变成了0x123401。程序对于CPU而言,只是一系列顺序的在内存中的01代码。因为操作系统是直接运行在硬件上的,因此32位CPU只能运行32位操作系统。 这样的设计并没有什么问题,英特尔的64位架构的处理器就是这样设计的。但这里隐藏了一个问题,当我们需要升级硬件来提速,那么购买了新CPU后必须把部分运行在上面的操作系统或软件换掉。这个问题就是软硬件不兼容带,没有几个客户会去购买这种没法兼容原有软件环境的CPU。因此intel和amd都推出了兼容32位软件环境的CPU。所以现在主流CPU都是64位处理器,可以在上面运行32位和64位操作系统和软件。 一般来说编译器是一个应用软已,64位电脑上的64位编译器编译出来的也就是64的软件。那么第一个64位操作系统是如何来的呢?首先操作系统大部分是用C语言编写的,编写完后经过编译器编译成可执行文件,那么这里就有一个问题:第一个64位操作系统是用64位编译器编译的,那么这个64位编译器是运行在64位操作系统上的,那么这个64位操作系统从哪来的?因此一定存在一个或一种编译器,本身是32位的,但能将程序编译成64位可执行文件。也只有在这种情况下编译器本身位数和编译出来程序的位数才不一致,也才能编译出第一个64位操作系统。

操作系统位数和软件位数关系

在讨论这个问题前,我们需要先明白软件是如何运行的?首先会寻找需要引入的内容(头文件),然后编译成目标文件(二进制文件),但是呢目标文件是没法运行的,因为里面有一定有未知符号没有解析。目标文件经过链接,就形成了可执行文件。为什么经过链接就可以形成可执行文件了呢?这是因为操作系统提供了编译好的动态链接库,因此我们只经过链接后就能云行了。这个过程有两个非常重要的地方,动态链接库和系统API。 32位操作系统上是没有64位库文件的,因此如果应用程序源代码中引用了64位动态库中才有的函数,那么链接的时候就会出问题。我们很多程序会用到库函数,库函数的实现是依赖于系统API。例如在windows上程序大多数是以exe形式发布,exe文件本身是带有位数的。再比如在linux上大部分软件包rpm是编译好的,它们本身就是具有“位数”,但是如果是源码,那么应用程序还没有“位数”这一概念,你用多少位的编译器去编译它,它就是多少位的应用程序。注意:我们这里讨论多少位的程序,都是针对已经编译到目标文件以后的状态。 看完前面的内容,请各位思考一下这两个问题:

  • 64位的系统上是否能运行32位应用程序;
  • 32位系统上是否能运行64位应用程序。

如果你的答案和下面的一致,就说明你理解了本篇文章:

  • 对于操作系统来说64位系统上有32位库和其他信息,因此基本上兼容32位程序;
  • 32位操作系统一般是没有64位库。也没有相关系统api。因此一般情况下32位系统没法运行64位应用程序。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/12/24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 第一个64位操作系统
  • 操作系统位数和软件位数关系
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档