Linux中的32位与64位

在通用pc领域,不论是windows还是linux界,我们都会经常听到32位与64位的说法,类似的还有x86与x86_64,i386与amd64,这两组概念之间有着怎样的联系和区别呢?
实际上这两组概念涉及了三个层次:硬件,系统和软件。
1、硬件
早期的intel处理器,如i386,486,586,奔腾系列的cpu架构,都是32位的(32位的寄存器,32位的虚拟地址空间),统称为x86架构。
随着技术的发展,32位cpu已经无法满足需求,intel与amd采用不同的方法开发64位架构的cpu,intel使用与x86完全不同的ia64架构,由于与原来的x86完全不兼容,因此在pc领域没有得到应用,只在服务器领域有一些使用。
而amd开发的架构称为amd64(将寄存器扩充为64位,支持64位虚拟地址),能够完全兼容x86指令集,不用任何修改就能运行老的操作系统和应用软件,在pc界得到广泛的应用,现在市场上几乎所有的pc用途的cpu都是支持amd64指令集的了。
当然intel也很快开发出支持该指令集的cpu,不过intel将其称为x64架构,而不是用amd64这个名字。而在linux中则称为x86_64,即x86架构的64位扩展。
有关x86_64的详细描述可翻阅《深入理解计算机系统》一书。
在linux中查看cpu是否64位的方法:如果/proc/cpuinfo内的flags字段中含有lm,则表示使用的是64位cpu(运行“grep 'lm' /proc/cpuinfo”命令,输出不为空)。
2、系统
系统同样可分为32位与64位。在x86_64架构的cpu出现之前,pc的操作系统都是用32位,例如windows 2000,xp,当时的unix,linux等。
在x86_64架构出现后,系统也就有了两个版本:32位和64位,两者的主要区别在于与硬件体系结构相关的操作中。
由于x86_64架构完全兼容x86架构,因此,32位的系统完全可以在x86_64位上运行,只不过它只使用了x86部分,没有完全发挥硬件的功能而已。
而64位系统专门针对64位的扩展功能而开发的,就是为了最大限度地发挥硬件的能力,它无法在x86架构的cpu上运行。
另外,不论是windows还是linux,驱动程序都需要加载到内核空间中,因此它的类型(32位或64位)需要跟系统完全相同。
系统与cpu的关系如下图所示:
查看linux系统是32位还是64位的方法:执行shell命令“arch”,显示为x86_64表示当前系统为64位,显示为i386,i486等表示系统是32位的。
3、软件
在系统上运行的应用软件同样有32位和64位之分,老的应用软件运行在32位cpu及32位系统中,属于32位软件。
出现了64位系统之后,也出现了专门运行在64位系统,能够最大限度使用64位系统的扩展功能的原生64位程序。
对于c程序来说,64位程序相比32位程序最大的区别就是int,long以及指针数据类型的长度都是64位的,可以使用64位的虚拟地址空间。
实际远不止这些,编绎器在将64位c程序翻译成汇编语言或者机器语言时,会尽量使用64位处理器的寄存器,尽量避免访问内存,例如把函数的参数,及局部变量优先放在寄存器,而不是在用户栈中。
另外在64位系统中,为了兼容数量众多的老的应用程序,系统都会增加一个虚拟层,用来翻译x86指令,这样32位程序也可以在64位系统中运行(windows和linux都支持)。
同样在64位系统中,使用64位编绎器一般也可以选择编译成32位程序(gcc使用-m32编译成32位可执行文件)。
另外在pc上,软件能否运行,只需看系统是否支持即可,可以不用理会cpu的架构。软件与系统的关系如下图所示:
linux中查看可执行文件是32位还是64位的方法:执行shell命令“file /usr/bin/xxx, 如果是32位程序,显示为elf 32-bit ...;如果是64位,则显示为:elf 64-bit...。
4、linux发行版与内核
在linux发行版中,一般会针对不同的架构发布不同的安装光盘,以debian为例,可用于pc的就有i386和amd64这两个版本。
根据上面的描述,这两个版本的系统都可以安装在使用64位的cpu的机器上,而使用32位cpu的机器上则只能安装i386版本的系统。
在debian amd64光盘中带的内核及软件包全都是64位版本的,而debian i386光盘中则有32位和64位的内核,以及32位的软件,可能是考虑到有些用户想用64位内核来运行32位程序吧。
内核源代码是没有32位,64位之分的,在编译内核时可以用arch参数手工指定编译成哪一个架构。例如:make arch=i386 menuconfig,make arch=i386用于配置,编译32位内核;
而make arch=x86_64 menuconfig,make arch=x86_64则用于配置,编译64位内核。
但是,在debian amd64光盘安装的系统里编译的32位内核是无法引导的,因为系统安装的所有软件包都是原生64位程序,无法在32位内核上运行,典型的错误是提示引导时找不到能运行的init程序;
而使用debian i386光盘安装的系统中编译的64位内核却可以使用,只是需要在配置内核时加上ia32 emulation支持(menuconfig的:executable file formats/emulations-->ia32 emulation)。
基于这样的原因,我原来用搭建的debian amd64光盘安装的系统(http://www.cnblogs.com/xiongyuanxiong/p/3523306.html),现在也改成用debian i386光盘来安装了,这样就能同时编译新的32位和64位官方内核进行对比测试。


医疗AI派对才刚刚开始 未来市场非常巨大
用于汽车领域全新HFS-802MATEnet
荣耀20青春版内置4000mAh大电池带来了全方位的体验提升
华为mate10确定10月16日上市,价格很良心,网友:还买什么iphone8
防爆露点分析仪的特点及参数
Linux中的32位与64位
如何一招提高物联网器件电池能效比
小度护耳降噪耳机Plus搭载NDT TWS压感触控解决方案
雷曼超高清大屏保障电网安全稳定运行
光耦初级加三极管有什么作用?
iPhone12无线充电器哪个品牌好,iPhone无线充电器评测
双通收购战局:OPPO和vivo反对,小米静观其变
分布式行波测量技术:电网故障定位的里程突破,让你告别电力困扰!
聚焦完整、高效的连接器产品,万连科技授权世强硬创全线代理
新零售将会取代互联网的位置吗
全球首款采用VIO定位技术的Mark无人机
基于嵌入式PIC32单片机的目标检测与跟踪系统
德国央行表示,欧盟没有支持加密货币的计划
微软Win10 KB4541335补丁部分用户无法安装
笔记本电脑开关电源电路图讲解