AMD 64 (1)

我一直告诫周围的朋友,买电脑千万别赶潮流迷信什么双核、64位。但是其实,我自己对这些新的CPU技术也不怎么熟悉。嗯,那么,就专心学学吧。

——————————————————————————————————————

AMD64的新特性:

一、寄存器扩展
1、增加了8个通用寄存器(以前已有8个)
2、所有通用寄存器(16个)都是64位的
3、8个128位的XMM寄存器
4、使用一个指令前缀,访问那些扩展寄存器

二、长模式
1、64位的虚拟地址空间
2、64位的指令指针 (RIP)
3、Instruction-pointer-relative寻址模式
4、平坦的地址空间

其指令集中的指令主要分为以下4类:
1、通用指令。指mov、add这些,通用的计算指令
2、128位多媒体指令。 (SSE系列,不过说实在的,amd的CPU对sse的支持显著的要比广告中的差)
3、64位多媒体指令。即MMX 和3DNow!
4、x87浮点指令。貌似是为一些老的应用程序专备的。现在还有人用吗?

三、模式
AMD64比较复杂,提供了好几类运行模式。
首先,总体上而言,分为长模式和遗留模式。64位的操作系统下的程序运行在长模式下,32位的操作系统及应用程序可以不经改动的运行在遗留模式下。

大体来说,长模式分为64位模式和兼容模式。
64位的应用程序在64位的操作系统下以64位模式运行。而以32位方式编译的应用程序在64位的操作系统下以兼容模式运行。
而遗留模式又可分为以下三种子模式:
1、保护模式。 支持16位和32位的程序的内存分段、可选的分页、以及权限检查机制。在保护模式下运行的程序最大可以寻址4G的内存。
2、虚拟8086模式。 虚拟的8086模式可以让16位的实模式程序以保护模式的方式运行,并为其提供最大1M的寻址空间。
3、实模式。不支持分页,不支持权限检查。最大1M的地址空间。

四、内存管理
在内存管理方面,传统的x86是采用基址+段偏移的方式进行寻址。在过去来说,这是一个很大的进步啊。386以前,那时候还不存在逻辑地址一说。所有的程序和系统本身一起共享同样的地址空间,共享所有的物理内存。在引入分段机制及地址转换单元后,相同的代码,被载入不同的内存地址运行的时候,需要改变的仅仅是段的基址,大大的提高了代码重用率和软件在不同环境下的适应性。但是呢,分段式内存管理的一个缺点就是易于产生内存碎片,而且这种机制也就在x86系列CPU上比较普遍。于是现代操作系统都采用了分页的方式作为其主要的内存管理机制。(现代操作系统的内存管理部分,最核心的就是paging和swapping,即分页和对换)嗯,扯远了。话说因为分段已经很少用了,于是,在64位模式中,就采用了所谓的平坦地址空间。由操作系统在软件层面完成分段机制,将地址空间分为数据段、堆栈段、代码段等。

各个段的起始地址存储在段寄存器中。段寄存器有:CS、ES、SS、DS、FS、GS。其中兼容模式和遗留模式下,所有的段寄存器都是起效的。而在64位模式下,只有CS、FS、GS是有效的,FS和GS是可被软件用于存放段的基址做一些地址计算操作。DS、 ES、SS在64位模式下则被统一认为是0而忽略。

由于CPU已经扩充到64位,所以物理内存的地址空间容量是由CPU的总线接口的位数而决定的。内存的实际容量当然不一定是2的64次方那么大啦。从物理地址到线性地址(逻辑地址)的转换是由软件及硬件的分页、分段机制联合完成的。嗯!这是一门复杂而高深的学问,感兴趣的去翻操作系统书吧。简单来说,AMD64削弱(几乎是去除)了硬件上的分段机制,并对x86的分页机制做了略微的增强。在兼容模式下,一个指针,要先和段的起始地址进行一次计算得到一个32位线性地址,这个地址被放在一个高32位全为0的寄存器中,然后进行分页,得到实际的物理地址。而64位模式下,就是一次分页,就完成从线性地址到物理地址的转换。而遗留模式和兼容模式类似,不同的是计算过程中所有的地址都是以32位的方式存放。

此博客中的热门博文

少写代码,多读别人写的代码

在windows下使用llvm+clang

tensorflow distributed runtime初窥