linux内核学习之三: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位官方内核进行对比测试。
linux内核学习之三:linux中的"32位"与"64位"的更多相关文章
- linux内核学习之三 跟踪分析内核的启动过程
一 前期准备工作 1 搭建环境 1.1下载内核源代码并编译内核 创建目录,并进入该目录: 下载源码: 解压缩,并进入该目录:xz -d linux-3.18.6.tar.xz tar ...
- linux中的"32位"与"64位"
linux内核学习之三:linux中的"32位"与"64位" 在通用PC领域,不论是windows还是linux界,我们都会经常听到"32位" ...
- 24小时学通Linux内核之有关Linux文件系统实现的问题
有时间睡懒觉了,却还是五点多醒了,不过一直躺倒九点多才算起来,昨晚一直在弄飞凌的嵌入式开发板,有些问题没解决,自己电脑系统的问题,虽然Win10发布了,,但我还是好喜欢XP呀,好想回家用用家里的XP来 ...
- Linux内核分析——Linux内核学习总结
马悦+原创作品转载请注明出处+<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 Linux内核学习总结 一 ...
- Linux内核学习总结(final)
Linux内核学习总结 符钰婧 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ...
- 20135316王剑桥Linux内核学习笔记
王剑桥Linux内核学习笔记 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 计算机是如何工作的 个人理 ...
- Linux 内核学习的经典书籍及途径
from:http://www.zhihu.com/question/19606660 知乎 Linux 内核学习的经典书籍及途径?修改 修改 写补充说明 举报 添加评论 分享 • 邀请回答 ...
- 关于Linux内核学习的误区以及相关书籍介绍
http://www.hzlitai.com.cn/article/ARM9-article/system/1605.html 写给Linux内核新手-关于Linux内核学习的误区 先说句正经的:其实 ...
- linux内核学习之二:编译内核
在linux内核学习系列的第一课中讲述了搭建学习环境的过程(http://www.cnblogs.com/xiongyuanxiong/p/3523306.html),环境搭好后,马上就进入到下一环节 ...
随机推荐
- 转:Qt项目中遇到的一些小问题汇总
链接:http://blog.csdn.net/yangyunfeizj/article/details/7082001 作者:GoatYangYang 公司让负责qt界面开发,但是接触qt又不 ...
- 浅谈JavaScript浮点数及其运算
原文:浅谈JavaScript浮点数及其运算 JavaScript 只有一种数字类型 Number,而且在Javascript中所有的数字都是以IEEE-754标准格式表示的.浮点数的精度问题 ...
- perl dbi 测试 mysql wait_timeout
The number of seconds the server waits for activity on a noninteractive connection before closing it ...
- cursor: pin S
declare v_sql varchar2(200); begin loop v_sql :='select seq1.nextval from dual'; execute immediate v ...
- 一道面试题与Java位操作 和 BitSet 库的使用
前一段时间在网上看到这样一道面试题: 有个老的手机短信程序,由于当时的手机CPU,内存都很烂.所以这个短信程序只能记住256条短信,多了就删了. 每个短信有个唯一的ID,在0到255之间.当然用户可能 ...
- NOI2010 航空管制
http://www.lydsy.com/JudgeOnline/problem.php?id=2535 贪心. 对于第1个问,我们先建立拓扑图,对于如果a必须在b前起飞,那么连有向边b->a, ...
- bzoj2244[SDOI2011]拦截导弹
http://www.lydsy.com/JudgeOnline/problem.php?id=2244 第$i$个导弹看成一个三元组$(i,h_i,v_i)$ 其实就是最长上升子序列的问题. 我们分 ...
- C++中使用stringstream进行类型转换操作
stringstream包括istringstream和ostringstream,提供读写string的功能,使用时需包含stream文件.4个操作:1. stringstream strm; 创建 ...
- python游戏编程——跟13岁儿童学编程
python爬虫基本告一段落,琢磨搞点其他的,正好在网上看到一个帖子,一个外国13岁小朋友用python写的下棋程序,内容详细,也有意思,拿来练手. 13岁啊.. 我这年纪还在敲 dir啥的吧 想到原 ...
- lua中的坑
在工作中使用lua也有一年了,代码也写了不少,踩过不少坑,这里记录一下. table.sort table.sort是lua自带的排序函数,数据量小时,也还是不错的.不过要注意你传入的compare函 ...