在通用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。英特尔使用的是与X86完全不同的IA64架构。因为和原来的x86完全不兼容,所以一直没有在PC领域使用,只在服务器领域使用。
AMD开发的架构名为amd64(将寄存器扩展到64位,支持64位虚拟地址),完全兼容x86指令集,无需任何修改即可运行旧的操作系统和应用软件。在PC行业得到了广泛的应用,现在市面上几乎所有PC用的CPU都支持amd64指令集。
当然,英特尔很快就开发了支持这种指令集的CPU,但英特尔称之为x64架构,而不是amd64。在linux中,它被称为x86_64,是x86架构的64位扩展。
x86_64的详细描述请参考《深入理解计算机系统》这本书。
linux中检查CPU是否为64位的方法:如果/proc/cpuinfo中的flags字段包含lm ,这意味着使用了64位CPU(运行命令grep lm /proc/CPU info 并且输出不为空)。
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和CPU的关系如下图所示:
检查linux系统是32位还是64位的方法:执行shell命令arch ,显示为x86_64表示当前系统是64位,i386,i486等。以指示系统是32位的。
3、软件
系统上还运行着32位和64位应用软件。旧的应用软件运行在32位CPU和32位系统上,属于32位软件。
64位系统出现后,也出现了运行在64位系统上,能充分利用其扩展功能的原生64位程序。
对于C程序来说,64位程序和32位程序最大的区别就是int、long、pointer数据类型的长度都是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位程序,将显示为elf32位.'如果是64位,将显示为:ELF 64位.'
4、linux发行版和内核
在linux发行版中,通常为不同的架构发布不同的安装盘。以debian为例,有两个版本可供PC使用:i386和amd64。
根据上面的描述,两个版本的系统都可以安装在64位CPU的机器上,而只有i386版本可以安装在32位CPU的机器上。
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 menu config 还有make ARCH=x86 _ 64 用于配置和编译64位内核。
但是,debian amd64光盘上安装的系统中编译的32位内核可以因为系统中安装的所有软件包都是本机64位程序,不能不能在32位内核上运行。典型的错误是你可以当系统提示您启动时,您找不到可运行的init程序;
不过可以使用debian i386 CD安装的系统中编译的64位内核,但是IA32仿真支持(可执行文件格式/仿真menu config-IA32Emulation )是配置内核时所必需的。
为此我原来安装在debian amd64光盘上的系统(http://www.cnblogs.com/xiongyuanxiong/p/3523306.html)现在安装在debian i386光盘上,这样可以同时编译新的32位和64位官方内核进行对比测试。
标签:系统架构CPU