#yyds干货盘点# 面试官:说说32位和64位

Posted 喵叔没错

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了#yyds干货盘点# 面试官:说说32位和64位相关的知识,希望对你有一定的参考价值。

在软件的世界里,有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位应用程序。

以上是关于#yyds干货盘点# 面试官:说说32位和64位的主要内容,如果未能解决你的问题,请参考以下文章

#yyds干货盘点#Linux简介

#yyds干货盘点#面试官让我聊聊synchronized

#yyds干货盘点# 大厂面试Java内功深厚?

面试官说又逮到一个不会hashmap的#yyds干货盘点#

#yyds干货盘点#面试官synchronized连环问,学会Monitor之后轻松拿下

#yyds干货盘点# 面试官:你说你精通Redis,你看过持久化的配置吗?