|
发表于 2011-11-30 08:00:53
|
显示全部楼层
Post by easior lars;2156230
想冒昧地问一下amd64与x86之间区别,
是不是指CPU的架构不一样呢?
- 用C、C++、Pascal、Objective-C、Cobol等语言写出的源代码,CPU当然是不认识的(晤,否则CPU真是不世出的语言专家,天下少说有几百种编程语言,它居然都认识...)。gcc、VS和其他编译器的作用就是将这些源代码转换成机器语言。
- 一套CPU所认识的机器语言叫做指令集。依据CPU所做的工作,指令集通常含有加减乘除等算数运算指令,与或非、异或、同或、移位等逻辑运算指令,移动数据的移动指令和输入输出指令等。
- x86是目前最常用的指令集,是基于1978年的Intel 8086的指令集的事实上的标准。(原先的8086指令集是16位的,而现在所指的x86是Intel 80386所扩充的32位指令集。)
- 解释一下,指令集的位数指的是该指令集在单个整数运算指令中所允许的最大的数值长度。32位指令集就是说,在这样的指令集中,一条指令最多只能让两个32位整数(32个二进制位,就是这样的一个数: 0100010001001001110101110101010 ,最大可以表示的整数是2 ^ 32 - 1 = 4,294,967,295,大约43亿)相加,或者两个32位整数相减,等等。
- 尽管32位的x86指令集已经通行了很多年,但逐渐地32位指令集的限制显露了出来。整数的上限43亿看起来是个很大的数字,但如果要用32位的整数表达比尔盖茨的家产总数,就难以做到了。多媒体运算,压缩算法等都可能运用64位整数和运算来提高速度。当然,32位指令集通过移位等复杂手段也可以进行64位或者更高位数的运算,不过效率却要大打折扣。另外,一个更致命的缺陷是,如果给内存中每个字节赋予一个地址的话,32位整数最多只能表示4GB内存中的地址。(Linux内核以牺牲效率为代价,确实有一个在32位系统中寻址超过4GB的内存的选项)
- 于是AMD和Intel先后推出了基于原x86指令集的新64位指令集,AMD64和Intel 64。在Gentoo中,两者被统称为amd64。这些新指令集的特点是直接支持64位整数运算,以及提供对64位寄存器的访问支持。
- 简单地说,寄存器是CPU中几个用来暂存数据的单元,相当于一个超微缩版的内存。CPU可以直接访问寄存器,不需要像内存一样借助总线访问,因此速度远在内存之上。当然,造价也远在内存之上。
- AMD64和Intel 64都只是x86的扩展,也就是说,它们向下兼容x86指令集,这就是64位CPU可以运行32位系统的缘由。但是,所有支持64位指令集的CPU都拥有64位的寄存器,而纯32位指令集的CPU只有32位的寄存器,而如果在支持64位指令集的CPU上使用32位的系统和软件,64位寄存器的高位就可能被弃置不用(或许某些CPU型号会使用寄存器换名技术利用,但速度终究要打折扣)。
- 另外,64位整数运算指令对系统和软件有相当显著的速度加成。
- amd64相比于x86几乎没有缺陷,除了multilib(在64位系统中运行32位程序,例如闭源的skype、acroread等)可能会有一些小问题。
- 大多数2007-2008年之后的CPU都支持amd64,可以执行以下命令查看您的CPU是否支持:试试用amd64的LiveCD启动看看,是更保险的检查方法。
|
|