在通用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位可执行文件)。软件与系统的关系如下图所示:

在linux中查看可执行文件是32位还是64位的方法:执行shell命令“file /usr/bin/xxx", 如果是32位程序,显示为"ELF 32 bit ......";如果是64位,则显示为:"ELF 64 bit......"
另外,PC上,软件能否运行,只需看系统是否支持即可,可以不会用理会CPU的架构。

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位官方内核进行对比测试。

 
 
分类: linux内核

linux中的"32位"与"64位"的更多相关文章

  1. Shell脚本中,如何判断Linux系统是32位还是64位?

    一行就能搞定,输出32或者64 可以用“和. 参考代码如下: ldconfig if [ $(getconf WORD_BIT) = '32' ] && [ $(getconf LON ...

  2. linux内核学习之三:linux中的"32位"与"64位"

    在通用PC领域,不论是windows还是linux界,我们都会经常听到"32位"与"64位"的说法,类似的还有"x86"与"x86 ...

  3. 如何查看 Linux是32位还是64位?

    方法一:执行命令 file /sbin/init [root@localhost jianbao]# file /sbin/init /sbin/init: ELF 32-bit LSB shared ...

  4. 查看Linux是32位还是64位的方法

    发布:JB01   来源:脚本学堂     [大 中 小] 本文介绍下,快速查看linux系统是32位还是64位的方法,有需要的朋友参考下吧. 本节内容:查看linux操作系统的位数 一,方法A:un ...

  5. Linux系统查看系统是32位还是64位方法总结

    这篇博客是总结.归纳查看Linux系统是32位还是64位的一些方法,很多内容来自网上网友的博客.本篇只是整理.梳理这方面的知识,方便自己忘记的时候随时查看. 方法1:getconf LONG_BIT ...

  6. 查看Linux是32位还是64位

    最直接简洁的办法: 在linux终端输入getconf LONG_BIT命令 如果是32位机器,则结果为32 [root@localhost ~]# getconf LONG_BIT 32 如果是64 ...

  7. 查看linux机器是32位还是64位的方法

    file /sbin/init 或者 file /bin/ls/sbin/init: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dyna ...

  8. Linux系统查看系统是32位还是64位方法总结(转)

    总结.归纳查看Linux系统是32位还是64位的一些方法,很多内容来自网上网友的博客.本篇只是整理.梳理这方面的知识,方便自己忘记的时候随时查看. 方法1:getconf LONG_BIT 查看 如下 ...

  9. 查看linux库文件32位还是64位

    查看linux库文件32位还是64位 分类: linux2014-09-25 09:46 238人阅读 评论(0) 收藏 举报 objdump -a  *.a objdump -a  *.so

随机推荐

  1. SAE+Java+jetty

    SAE的java执行环境jetty如servlet该容器,和开放几乎完全访问.有效支持各种jar包.但对于jdk的要件的版本号是非常严格格,这里的版本号是jdk1.6 SAE利用上传war该方式配置j ...

  2. ACM竞赛之输入输出

    http://acm.njupt.edu.cn/acmhome/problemdetail.do?id=1083&method=showdetail 比赛描述 字符串的输入输出处理. 输入 第 ...

  3. jquery datatables api (转)

    学习可参考:http://www.guoxk.com/node/jquery-datatables http://yuemeiqing2008-163-com.iteye.com/blog/20069 ...

  4. linux_ubuntu12.04 安装 svn

    sudo apt-get install subversion sudo mkdir /home/svn sudo svnadmin create /home/svn/repository cd /h ...

  5. Swift学习笔记(一)搭配环境以及代码运行成功

    原文:Swift学习笔记(一)搭配环境以及代码运行成功 1.Swift是啥? 百度去!度娘告诉你它是苹果最新推出的编程语言,比c,c++,objc要高效简单.能够开发ios,mac相关的app哦!是苹 ...

  6. Android NDK的C++11标准支持

    C++11于Android NDK它已被支持,本文介绍了如何NDK添加C++11支持标准. 在开源项目Cocos2d-x于,他已经加入C++11支持标准. 1.改动Application.mk文件,加 ...

  7. code forces 148D Bag of mice (概率DP)

    time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...

  8. Oracle在rownum使用结果集排序

    Oracle在rownum使用结果集排序    对于 Oracle 的 rownum 问题,非常多资料都说不支持>,>=,=,between...and,仅仅能用以上符号(<.< ...

  9. 项目笔记---CSharp图片处理

    原文:项目笔记---CSharp图片处理 项目笔记---CSharp图片处理 最近由于项目上需要对图片进行二值化处理,就学习了相关的图片处理上的知识,从开始的二值化的意义到动态阀值检测二值化等等,并用 ...

  10. Linux生成动态库系统

    Linux生成动态库系统 一个.说明 Linux下动态库文件的扩展名为 ".so"(Shared Object). 依照约定,全部动态库文件名称的形式是libname.so(可能在 ...