指令集
架构特色
在"x86-64"出现以前,
英特尔与
惠普(Hewlett Packard)联合设计出"
IA-64"架构,惟这款
64位架构并不与x86兼容,且市场反应较冷淡,同时受制于多个专利权,使其他厂商不能模仿。与
x86兼容的AMD64架构便应运而生,其主要特点如名称所述,既有支持64位通用
暂存器、64位整数及逻辑运算,以及64位
虚拟地址。设计人员也为架构作出不少改进,部份重大改变如下:
新增暂存器
地址阔度加长
“禁止运行”比特 (NX-bit): AMD64其中一个特色是拥有“禁止运行”(No-Execute, NX)的比特,可以防止
蠕虫病毒以
缓冲器满溢的方式来进行攻击(也称:缓存
溢出攻击,Buffer Overflow)。
市场分析
AMD64代表AMD放弃了跟随Intel标准的一贯作风,选择了像把16位的
Intel 8086扩充成32位的80386般,去把
x86架构扩充成
64位版本,且兼容原有标准。
AMD64架构在
IA-32上新增了64位
暂存器,并兼容早期的16位和32位软件,可使现有以x86为对象的
编译器容易转为AMD64版本。除此之外,NX bit也是引人注目的特色之一。
不少人认为,像
DEC Alpha般的64位RISC芯片,最终会取代现有过时及多变的x86架构。但事实上,为x86系统而设的应用软件实在太庞大,成为Alpha不能取代x86的主要原因,AMD64能有效地把
x86架构移至
64位的环境,并且能兼容原有的x86应用程序。
应用
概要
Intel 64计划的历史可谓相当长及复杂,其原因主要是因为Intel自身的内政问题。该计划开始时,其代号为Yamhill,不过Intel一直对外宣称其计划不存在,至2004年初才改口承认,并把代号改为CT(Clackamas Technology)。在宣布CT计划的数个星期内,Intel为计划给予多个新名称。在2004年春季的IDF开发者论坛后,Intel将之命名为“IA-32E”,意即
IA-32的延伸,在数星期后才改称为EM64T。
Intel曾长时间把该计划保持机密,其原因有以下两点。第一,Intel不想给客户混淆信息,把未来Itanium
IA-64处理器的展望与
x86混为一谈,但在Intel眼见使用AMD64的Opteron及Athlon 64取得成功,便需要对竞争者的威胁作出迎击。而第二个原因,是Intel为了自身的面子,定不会承认使用了对手
AMD的技术,因此Intel把该技术以EM64T这个名字来推出,虽然核心与AMD64几乎相同,犹如一对孪生兄弟,但如果Intel使用了AMD64这名字,等于在帮对手做广告宣传。在以往Intel的营销中,Intel总把AMD的产品贬为自家技术的仿制品,不过这回AMD率先开发民用
64位技术,Intel需要反过来吸纳AMD的技术,使Intel在研发x86处理器技术的领导地位受到重挫,因此Intel在造势方面便需要使用更多的人力物力。Intel主席Craig Barrett之后也承认在保密方面,这个机密算是保得最差的。
在Intel 64(EM64T)的文件中,对于其
指令集的起源只字不提,因此有媒体便为它起了“iAMD64”这个别名,讽刺Intel在迎击AMD的民用64位技术上,使用了AMD的技术,直接把AMD64吸纳过来,并以新名重新包装使用。后来Intel索性将此技术正式命名为Intel 64。
架构特色
Intel 64可使
处理器直接访问超过4GB的
存储器,容许运行更大的应用程序。而
x86-64架构也加入了额外的
暂存器及其他改良在
指令集上。通过
64位的
存储器地址上限,其理论存储器大小上限达16,000,000TB(16EB),不过在初期的应用上并未能支持完整的64位地址。
Intel在之前已在
Itanium处理器上使用了自家的64位
IA-64技术,虽然说Intel 64也是64位,但两者并不兼容,即IA-64的软件不能直接在Intel 64上运行。Intel 64所用的x86-64是IA-32指令集的延伸,而IA-64则是另一款独立的架构,没有任何IA-32的影子。虽然IA-64可通过模拟来运行IA-32的指令,但指令在运行前需经转换,才能在IA-64上运行,导致其速度变慢。由于
x86-64是从IA-32派生而来,因此运行IA-32与
64位程式的表现也显得绰绰有余。
首颗使用Intel 64技术的处理器属于
Xeon型号,支持双处理器,其核心名称为Nocona。由于Xeon是直接建基于桌面型的
Pentium 4上,因此Pentium 4也可使用Intel 64,如使用
超线程(Hyper-Threading)般。不过Intel 64在初期的Prescott版本尚未激活,其原因大概是当时其尚未完善。在使用Prescott核心E0更新版本的Pentium 4处理器已可使用Intel 64,被称为Pentium 4 F。再者,E0更新版本加入了“禁止运行”比特,称为XD bit(eXecute Disable),相当于AMD64的NX bit。
虚拟地址
尽管虚拟地址有
64位的宽度,但当前的实现机制(以及任何已知处在计划阶段的芯片)并不允许整个16EB的虚拟地址空间都被使用。大多数的操作系统和应用程序在可见的未来都用不到如此巨大的地址空间(比如,Windows在AMD64上的实现仅应用了16TB,即44位的宽度),所以实现如此巨大的地址宽度只会增加系统的复杂度和地址转换的成本,带不来任何好处。AMD因此决定,在对这一架构的首次实现中,只有虚拟地址的最低48位才会在地址转换(
页表查询)时被使用。但是,任何虚拟地址的48位至63位必须与47位一致(按照符号位扩展的方式),否则处理器将会报告一个异常。符合这一规则的地址被称作“规范寻址(Canonical Addressing)”。规范地址形式将从0至00007FFF`FFFFFFFF,以及从FFFF8000`00000000至FFFFFFFF`FFFFFFFF总计256TB的地址范围作为可以使用的虚拟地址空间。
这种“古怪”的规则为日后扩展到真正的64
位寻址保留了一个重要的特性:很多的操作系统(包括但不限于Windows NT系列)将
地址空间的高半部分(被称作
内核空间)留给自己,将低半部分(
用户空间)留给应用程序代码、用户态栈、堆和其他数据区。这种“传统地址”的设计保证了每一个符合AMD64的实现都拥有两个内存片段:低半段从00000000`00000000开始,随着更多的
虚拟地址比特变得可用而“向上生长”;高半部分被“悬挂”在地址空间的顶部而“向下生长”。同样,将未被使用的地址比特内容固定下来防止被操作系统用作标志位、
特权级标号等其他用途,是为了避免当架构扩展至52, 56, 60和
64位的时候出现问题。
64位寻址模式(长模式),是
物理地址扩展(PAE)的超集;因此,内存页大小可以是4KB,2MB,或1GB。但是,与系统在PAE模式下使用的三级标签页表机制不同,长模式下系统使用四级标签页表:PAE的页目录指针表的表项从4个扩展到了512个,而且附加了一个第四级页面映射表(Page-Map Level 4 Table,PML4 Table),包含512个采用48位实现的表项。在提供更大虚拟地址的实现中,这个表既可以进行扩展来提供足够数量的表项(对于
64位实现来说理论值高达33,554,432个)以描述整个地址空间,也可以再被一个更高层映射级所映射,像是PML5。整个48位地址空间的4KB页面完整映射层级将会占据略多于512GB的内存(256TB虚拟地址空间的0.196%)。
运行模式
运行模式
|
操作系统要求
|
已编译程序重新构建
|
默认地址长度(位)
|
默认操作码长度(位)
|
寄存器扩展
|
|
长模式
|
64位模式
|
支持64位
|
需要
|
64
|
32
|
可用
|
64
|
兼容模式
|
不需要
|
32
|
32
|
不可用
|
32
|
16
|
16
|
16
|
传统模式
|
保护模式
|
传统16位或32位
|
不需要
|
32
|
32
|
不可用
|
32
|
16
|
16
|
16
|
虚拟8086模式
|
16
|
16
|
16
|
真实模式
|
传统16位
|
系统支持
以下操作系统均支持长模式(long mode)的
x86-64架构。
DOS
在
DOS环境下可通过DOS Extender(例如DOS4GW)来进入保护模式。
FreeBSD
FreeBSD在5.1正式版曾为
x86-64作试验,至6.0正式版解决了在x86-64运行32位程式出现的一些问题,以及能支持不少驱动程序。
Linux
Linux在2.6版本的内核开始加入长模式,支持
x86-64,能兼容32位程式及模拟32位系统,容许在32位的环境下,把程式编译为
64位版本。
Mac OS X
Mac OS X 10.6
Snow Leopard开始提供
64位内核,并可以在部分处理器上打开64位内核。64位内核只支持64位的内核扩展,反之亦然;但对于普通应用程序,无论32位或64位内核均可以支持两种位宽的应用程序,但32位程序只能使用4GB的内存空间。
Mac OS X使用
通用二进制文件格式将32位和
64位程序和库代码包装在同一文件中,在加载时自动选择最合适的版本。在Mac OS X 10.6中,内核和内核扩展也使用通用二进制格式以同时支持两种构架。
MenuetOS
x86-64版本的
MenuetOS系统于2005年6月推出,虽然原有的32位版本Menuet以GPL授权,但x86-64版本则维持专属,并以
免费软件方式发布,以及提供部分组件的源代码。
NetBSD
x86-64版本的
NetBSD最早于2001年6月19日被提出,至2004年12月9日推出的NetBSD 2.0已能完全支持x86-64。
OpenBSD
Solaris
Windows
业界称谓
由于AMD64和Intel64基本上一致,很多软硬件产品都使用一种不倾向任何一方的词汇来表明它们对两种架构的同时兼容。出于这个目的,AMD对这种CPU架构的原始称呼——“
x86-64”被不时地使用,还有变体“x86_64”。其他公司如微软和
太阳计算机系统公司在营销资料中使用“x64”作为对“x86-64”的缩写。
许多操作系统及产品,尤其那些是在Intel进入这块市场之前就引入“x86-64”支持的,使用“AMD64”或“
amd64”同时指代AMD64和Intel64。
Java Development Kit(JDK):包含x86-64文件的目录命名为“
amd64”。
Mac OS X:终端下的命令arch以及开发人员文档都表明苹果称64位架构为“x86_64”。
Microsoft Windows:称在IA-32处理器上使用64位技术为“x64”,但一些相关目录使用AMD64来标明。例如,Windows x64版安装CD上的系统目录命名为“AMD64”,而32位版本上用“i386”。
Solaris:操作系统的命令isalist将AMD64和Intel64都定义成“amd64”。
应用产品
AMD K8 (AMD64)微处理器架构
AMD Athlon 64 FX
AMD
Sempron(限使用E6
步进以后的Palermo、全数Manila型号和全数Sparta型号)
AMD Zacate
AMD K10微处理器架构的CPU核心
AMD Llano
Celeron D(自"Prescott"起的部分型号)
Intel Core微处理器架构
Xeon ("Woodcrest")
Intel Core 2
Intel Pentium Dual-Core
Intel Core i7
Intel Core i5
Intel Core i3
Intel Atom(部分)
- 转:x64与x86的改变
http://tieba.baidu.com/p/1250470248 x64与x86的改变 硬件要求就是64位的CPU.操作系统也必须是64位的,如果在64位的CPU上安装了32位的操作系统,就算编 ...
- Centos 学习之路:基础(1)
冯·诺伊曼计算机模型: 采用二进制数表示程序和数据: 能存储程序和数据,并能自动控制程序的执行: 具备运算器.控制器.存储器.输入设备和输出设备5个基本部分. CPU:是控制器及运算器 CPU的架构类 ...
- ffmpeg的centos、msys2、msvc编译
msys2 和 centos https://ffmpeg.org/download.html https://ffmpeg.zeranoe.com/builds/ Windows MSYS2准备 1 ...
- 在ubuntu 12.04 x64下编译hadoop2.4
自己编译hadoop:x64 1.安装依赖包 sudo apt-get install g++ autoconf automake libtool cmake zlib1g-dev pkg-confi ...
- x86和x64的区别
整理了下网上的资料,归类了下,大似表述是这样的:IBM/PC兼容机,也就是Intel的i80x86指令架构,就简称了x86.x86并不是指32位环境,而是指80x86架构,这个架构目前有32位,64位 ...
- centos 6.5 x64创建并挂载使用iscsi共享磁盘
前景摘要:NFS或iSCSI,哪个更好?文件 vs 块NFS使用文件级别的实施,服务器或存储阵列托管整个文件系统,客户到文件系统上读写文件,可以在阵列端对主存储数据进行重复数据删除.iSCSI和FC则 ...
- 2013最新版Subversion 1.7.10 for Windows x86 + Apache 2.4.4 x64 安装配置教程+错误解决方案
一 .工作环境 操作系统:Windows Server 2008 R2 SP1 x64 Apache版本:2.4.4 Subversion版本: Setup-Subversion-1.7.10.msi ...
- .NET编译的目标平台(AnyCPU,x86,x64)
转载:http://blog.sina.com.cn/s/blog_78b94aa301014i8r.html 今天有项目的代码收到客户的反馈,要求所有的EXE工程的目标平台全部指定成x86,而所有D ...
- 深入理解Windows X64调试
随着64位操作系统的普及,都开始大力进军x64,X64下的调试机制也发生了改变,与x86相比,添加了许多自己的新特性,之前学习了Windows x64的调试机制,这里本着“拿来主义”的原则与大家分享. ...
- haproxy Mycat集2---KeepAlived
KA 配两台 MASTER,BACKUP节点 安装Keepalived 1.下载安装依赖包 yum install -y wget make gcc openssl-devel popt-devel ...
- Flutter 类似viewDidAppear 的任务处理
前言 在任务之中 ,有些实时任务比较重的需求,需要在类似 iOS viewDidAppear 里面执行数据请求任务,如:上一个页面返回pop 后执行网络请求任务.在flutter中如何实现呢? 目前 ...
- shell 命令 用户管理
1. 查看保存用户相关信息的文件 [ cat /etc/passwd ] [linux : x : 1000 : 1000 : linux,,, : ...
- Dom关于位置和尺寸的api
parentNode 直接父级//和offsetParent不同 inner2.parentNode <!DOCTYPE html> <html id="html&q ...
- JQuery ajax提交表单及表单验证
JQuery ajax提交表单及表单验证 博客分类: jsp/html/javascript/ajax/development Kit 开源项目 注:经过验证,formValidator只适合一个 ...
- hibernate4.3.8的dialect和创建SessionFactory遇到的一些问题
好久不用hibernat,心里记着的还是hibernate3的标准,今天换成hibernate4.3.8后问题层出不穷啊... 首先是hibernate4.3.8中使用mysql方言时,hiberna ...
- 分享安装Apache、MySQL、PHP、LAMP的完整教程
Operation timed out after 30000 milliseconds with 0 out of -1 bytes received请注意,在Linux中输入密码时,不会显示您输入 ...
- make 基础
Make这个词,英语的意思是"制作".Make命令直接用了这个意思,就是要做出某个文件.比如,要做出文件a.txt,就可以执行下面的命令. $ make a.txt 但是,如果你真 ...
- lxhgww的奇思妙想 长链剖分板子
https://vijos.org/d/Bashu_OIers/p/5a79a3e1d3d8a103be7e2b81 求k级祖先,预处理nlogn,查询o1 //#pragma GCC optimiz ...
- (1)mysql数据库操作
1.安装mysql https://dev.mysql.com/downloads/windows/installer/8.0.html 2.mysql启停 运行mysql net s ...