论文部分内容阅读
经过前面对计算机各大硬件的介绍,很多读者朋友来信咨询CPU相关问题,如CPU中运用的指令技术,防毒技术,还有超线程技术等;还有自己用的计算机都是以前买的,是不是需要升级CPU。为了让读者更详细的了解CPU,这期我们将详细介绍下CPU相关技术。
一、多媒体指令集
CPU依靠指令来计算和控制系统,每款CPU在设计时就规定了一系列与其硬件电路相配合的指令系统。指令的强弱也是CPU的重要指标,指令集是提高微处理器效率的最有效工具之一。从现阶段的主流体系结构讲,指令集可分为复杂指令集和精简指令集两部分,而从具体运用看,如Intel的MMX(Multi Media Extended)、SSE、 SSE2(Streaming-Single instruction multiple data-Extensions 2)和AMD的3DNow!等都是CPU的扩展指令集,分别增强了CPU的多媒体、图形图象和Internet等的处理能力。我们通常会把CPU的扩展指令集称为“CPU的指令集”。
1、精简指令集的运用
在最初发明计算机的数十年里,随着计算机功能日趋增大,性能日趋变强,内部元器件也越来越多,指令集日趋复杂,过于冗杂的指令严重的影响了计算机的工作效率。后来经过研究发现,在计算机中,80%程序只用到了20%的指令集,基于这一发现,RISC精简指令集被提了出来,这是计算机系统架构的一次深刻革命。RISC体系结构的基本思路是:抓住CISC指令系统指令种类太多、指令格式不规范、寻址方式太多的缺点,通过减少指令种类、规范指令格式和简化寻址方式,方便处理器内部的并行处理,提高VLSI器件的使用效率,从而大幅度地提高处理器的性能。
RISC指令集有许多特征,其中最重要的有:
指令种类少,指令格式规范:RISC指令集通常只使用一种或少数几种格式。指令长度单一(一般4个字节),并且在字边界上对齐。字段位置、特别是操作码的位置是固定的。
寻址方式简化:几乎所有指令都使用寄存器寻址方式,寻址方式总数一般不超过5个。其他更为复杂的寻址方式,如间接寻址等则由软件利用简单的寻址方式来合成。
大量利用寄存器间操作:RISC指令集中大多数操作都是寄存器到寄存器操作,只以简单的Load和Store操作访问内存。因此,每条指令中访问的内存地址不会超过1个,访问内存的操作不会与算术操作混在一起。
简化处理器结构:使用RISC指令集,可以大大简化处理器的控制器和其他功能单元的设计,不必使用大量专用寄存器,特别是允许以硬件线路来实现指令操作,而不必像CISC处理器那样使用微程序来实现指令操作。因此RISC处理器不必像CISC处理器那样设置微程序控制存储器,就能够快速地直接执行指令。
便于使用VLSI技术:随着LSI和VLSI技术的发展,整个处理器(甚至多个处理器)都可以放在一个芯片上。RISC体系结构可以给设计单芯片处理器带来很多好处,有利于提高性能,简化VLSI芯片的设计和实现。基于VLSI技术,制造RISC处理器要比CISC处理器工作量小得多,成本也低得多。
加强了处理器并行能力:RISC指令集能够非常有效地适合于采用流水线、超流水线和超标量技术,从而实现指令级并行操作,提高处理器的性能。目前常用的处理器内部并行操作技术基本上是基于RISC体系结构发展和走向成熟的。
正由于RISC体系所具有的优势,它在高端系统得到了广泛的应用,而CISC体系则在桌面系统中占据统治地位。
2、CPU的扩展指令集
对于CPU来说,在基本功能方面,它们的差别并不太大,基本的指令集也都差不多,但是许多厂家为了提升某一方面性能,又开发了扩展指令集,扩展指令集定义了新的数据和指令,能够大大提高某方面数据处理能力,但必需要有软件支持。
MMX指令集
MMX(Multi Media eXtension,多媒体扩展指令集)指令集是Intel公司于1996年推出的一项多媒体指令增强技术。MMX指令集中包括有57条多媒体指令,通过这些指令可以一次处理多个数据,在处理结果超过实际处理能力的时候也能进行正常处理,这样在软件的配合下,就可以得到更高的性能。MMX的益处在于,当时存在的操作系统不必为此而做出任何修改便可以轻松地执行MMX程序。但是,问题也比较明显,那就是MMX指令集与x87浮点运算指令不能够同时执行,必须做密集式的交错切换才可以正常执行,这种情况就势必造成整个系统运行质量的下降。
SSE指令集
SSE(Streaming SIMD Extensions,单指令多数据流扩展)指令集是Intel在Pentium III处理器中率先推出的。其实,早在PIII正式推出之前,Intel公司就曾经通过各种渠道公布过所谓的KNI(Katmai New Instruction)指令集,这个指令集也就是SSE指令集的前身,并一度被很多传媒称之为MMX指令集的下一个版本,即MMX2指令集。究其背景,原来"KNI"指令集是Intel公司最早为其下一代芯片命名的指令集名称,而所谓的"MMX2"则完全是硬件评论家们和媒体凭感觉和印象对"KNI"的 评价,Intel公司从未正式发布过关于MMX2的消息。
而最终推出的SSE指令集也就是所谓胜出的"互联网SSE"指令集。SSE指令集包括了70条指令,其中包含提高3D图形运算效率的50条SIMD(单指令多数据技术)浮点运算指令、12条MMX 整数运算增强指令、8条优化内存中连续数据块传输指令。理论上这些指令对目前流行的图像处理、浮点运算、3D运算、视频处理、音频处理等诸多多媒体应用起到全面强化的作用。SSE指令与3DNow!指令彼此互不兼容,但SSE包含了3DNow!技术的绝大部分功能,只是实现的方法不同。SSE兼容MMX指令,它可以通过SIMD和单时钟周期并行处理多个浮点数据来有效地提高浮点运算速度。
SSE2指令集
SSE2(Streaming SIMD Extensions 2,Intel官方称为SIMD 流技术扩展 2或数据流单指令多数据扩展指令集 2)指令集是Intel公司在SSE指令集的基础上发展起来的。相比于SSE,SSE2使用了144个新增指令,扩展了MMX技术和SSE技术,这些指令提高了广大应用程序的运行性能。随MMX技术引进的SIMD整数指令从64位扩展到了128位,使SIMD整数类型操作的有效执行率成倍提高。双倍精度浮点SIMD指令允许以SIMD格式同时执行两个浮点操作,提供双倍精度操作支持有助于加速内容创建、财务、工程和科学应用。除SSE2指令之外,最初的SSE指令也得到增强,通过支持多种数据类型(例如,双字和四字)的算术运算,支持灵活并且动态范围更广的计算功能。SSE2指令可让软件开发员极其灵活的实施算法,并在运行诸如MPEG-2、MP3、3D图形等之类的软件时增强性能。Intel是从Willamette核心的Pentium 4开始支持SSE2指令集的,而AMD则是从K8架构的SledgeHammer核心的Opteron开始才支持SSE2指令集的。
SSE3指令集
SSE3(Streaming SIMD Extensions 3,Intel官方称为SIMD 流技术扩展 3或数据流单指令多数据扩展指令集 3)指令集是Intel公司在SSE2指令集的基础上发展起来的。相比于SSE2,SSE3在SSE2的基础上又增加了13个额外的SIMD指令。SSE3中13个新指令的主要目的是改进线程同步和特定应用程序领域,例如媒体和游戏。这些新增指令强化了处理器在浮点转换至整数、复杂算法、视频编码、SIMD浮点寄存器操作以及线程同步等五个方面的表现,最终达到提升多媒体和游戏性能的目的。Intel是从Prescott核心的Pentium 4开始支持SSE3指令集的,而AMD则是从2005年下半年Troy核心的Opteron开始才支持SSE3的。但是需要注意的是,AMD所支持的SSE3与Intel的SSE3并不完全相同,主要是删除了针对Intel超线程技术优化的部分指令。
3D Now!指令集
由AMD公司提出的3DNow!指令集应该说出现在SSE指令集之前,并被AMD广泛应用于其K6-2 、K6-3以及Athlon(K7)处理器上。3DNow!指令集技术其实就是21条机器码的扩展指令集。
与Intel公司的MMX技术侧重于整数运算有所不同,3DNow!指令集主要针对三维建模、坐标变换 和效果渲染等三维应用场合,在软件的配合下,可以大幅度提高3D处理性能。后来在Athlon上开发了Enhanced 3DNow!。这些AMD标准的SIMD指令和Intel的SSE具有相同效能。因为受到Intel在商业上以及Pentium III成功的影响,软件在支持SSE上比起3DNow!更为普遍。Enhanced 3DNow!AMD公司继续增加至52个指令,包含了一些SSE码,因而在针对SSE做最佳化的软件中能获得更好的效能。
目前最新的Intel CPU可以支持SSE、SSE2、SSE3指令集。早期的AMD CPU仅支持3DNow!指令集,随着Intel的逐步授权,从Venice核心的Athlon 64开始,AMD的CPU不仅进一步发展了3DNow!指令集,并且可以支持Inel的SSE、SSE2、SSE3指令集。不过目前业界接受比较广泛的还是Intel的SSE系列指令集,AMD的3DNow!指令集应用比较少。
二、防病毒技术
CPU内嵌的防病毒技术是一种硬件防病毒技术,与操作系统相配合,可以防范大部分针对缓冲区溢出(buffer overrun)漏洞的攻击(大部分是病毒)。Intel的防病毒技术是EDB(Excute Disable Bit),AMD的防病毒技术是EVP(Ehanced Virus Protection),但不管叫什么,它们的原理都是大同小异的。严格来说,目前各个CPU厂商在CPU内部集成的防病毒技术不能称之为“硬件防毒”。首先,无论是Intel的EDB还是AMD的EVP,它们都是采用硬软结合的方式工作的,都必须搭配相关的操作系统和软件才能实现;其次,EDB和EVP都是为了防止因为内存缓冲区溢出而导致系统或应用软件崩溃的,而这内存缓冲区溢出有可能是恶意代码(病毒)所为,也有可能是应用程序设计的缺陷所致(无意识的),因此我们将其称之为“防缓冲区溢出攻击”更为恰当些。
在计算机内部,等待处理的数据一般都被放在内存的某个临时空间里,这个临时存放空间被称为缓冲区(Buffer),缓冲区的长度事先已经被程序或者操作系统定义好了。缓冲区溢出(buffer overrun)是指当计算机程序向缓冲区内填充的数据位数超过了缓冲区本身的容量。溢出的数据覆盖在合法数据上。理想情况是,程序检查数据长度并且不允许输入超过缓冲区长度的字符串。但是绝大多数程序都会假设数据长度总是与所分配的存储空间相匹配,这就为缓冲区溢出埋下隐患。操作系统所使用的缓冲区又被称为堆栈,在各个操作进程之间,指令被临时存储在堆栈当中,堆栈也会出现缓冲区溢出。当一个超长的数据进入到缓冲区时,超出部分就会被写入其他缓冲区,其他缓冲区存放的可能是数据、下一条指令的指针,或者是其他程序的输出内容,这些内容都被覆盖或者破坏掉。可见一小部分数据或者一套指令的溢出就可能导致一个程序或者操作系统崩溃。而更坏的结果是,如果相关数据里包含了恶意代码,那么溢出的恶意代码就会改写应用程序返回的指令,使其指向包含恶意代码的地址,使其被CPU编译而执行,而这可能发生“内存缓冲区溢出攻击”,名噪一时的“冲击波”、“震荡波”等蠕虫病毒就是采用这种手段来攻击电脑的。
缓冲区溢出是由编程错误引起的。如果缓冲区被写满,而程序没有去检查缓冲区边界,也没有停止接收数据,这时缓冲区溢出就会发生。缓冲区边界检查被认为是不会有收益的管理支出,计算机资源不够或者内存不足是编程者不编写缓冲区边界检查语句的理由,然而技术的飞速发展已经使这一理由失去了存在的基础,但是多数用户日常主要应用的程序中大多数其实仍然是十年甚至二十年前的程序代码,并没有检查缓冲区边界的功能。
缓冲区溢出是病毒编写者和特洛伊木马编写者偏爱使用的一种攻击方法。攻击者或者病毒善于在系统当中发现容易产生缓冲区溢出之处,运行特别程序,获得优先级,指示计算机破坏文件,改变数据,泄露敏感信息,产生后门访问点,感染或者攻击其他计算机。
对于缓冲区溢出攻击,防毒杀毒软件虽然也可以处理,但也只能是亡羊补牢,而操作系统和应用软件的漏洞又是难以预测的,随时可能被利用,引来缓冲区溢出攻击。在这种情况下,预防缓冲区溢出攻击应该从硬件层次着手,开始成为许多IT厂商的共识,于是大家俗称的CPU硬件防病毒功能应运而生了。
缓冲区溢出攻击最基本的实现途径是向正常情况下不包含可执行代码的内存区域插入可执行的代码,并欺骗CPU执行这些代码。而如果我们在这些内存页面的数据区域设置某些标志(No eXecute或eXcute Disable),当CPU读取数据时检测到该内存页面有这些标志时就拒绝执行该区域的可执行指令,从而可防止恶意代码被执行,这就是CPU的防缓冲区溢出攻击实现的原理。
而对于开启了EDB或EVP功能的计算机来说,一般也就可实现数据和代码的分离,而在内存某个页面将被设置为只做数据页,而任何企图在其中执行代码的行为都将被CPU所拒绝。当然,开启EDB、EVP功能的CPU是无法独立完成标注不可执行代码内存页面以及进行相关检测防治工作的,它还需要相关操作系统和应用程序的配合。
目前,Windows XP SP2、Windows Server 2003 SP1及64bit的Windows操作系统都提供了对EDB、EVP技术的支持。如果你使用的操作系统是Windows XP SP2,那么启用其中的DEP(Data Execution Protection,数据执行保护)功能即可为你的电脑提供比较全面的防缓冲区溢出攻击功能。DEP是可以独立运行的,并也可帮助防御某些类型的恶意代码攻击,但要充分利用DEP可以提供的保护功能,就需要CPU的配合了。DEP可单独或和兼容的CPU一起将内存的某些页面位置标注为不可执行,如果某个程序尝试从被保护的位置运行代码,将会被CPU拒绝同时DEP会关闭程序并通知用户,从而在一定程度上保障用户电脑的安全。
CPU内嵌的防病毒技术以及操作系统的防病毒技术因此在目前来说可能还存在着一些兼容性的问题,例如因应用程序设计的缺陷或驱动程序而导致的误报(特别是一些比较老的驱动程序);另外,对于有些程序来说,是采用实时生成代码方式来执行动态代码的,而生成的代码就有可能位于标记为不可执行的内存区域,这就有可能导致DEP将其检测为非法应用程序而将其关闭。而这些都还有赖于硬件和软件厂商的相互配合解决,当然,这些都是需要的时间。因此,DEP、EDB、EVP等技术都还在向前发展。
三、超线程技术
CPU生产商为了提高CPU的性能,通常做法是提高CPU的时钟频率和增加缓存容量。不过目前CPU的频率越来越快,如果再通过提升CPU频率和增加缓存的方法来提高性能,往往会受到制造工艺上的限制以及成本过高的制约。
尽管提高CPU的时钟频率和增加缓存容量后的确可以改善性能,但这样的CPU性能提高在技术上存在较大的难度。实际上在应用中基于很多原因,CPU的执行单元都没有被充分使用。如果CPU不能正常读取数据(总线/内存的瓶颈),其执行单元利用率会明显下降。另外就是目前大多数执行线程缺乏ILP(Instruction-Level Parallelism,多种指令同时执行)支持。这些都造成了目前CPU的性能没有得到全部的发挥。因此,Intel则采用另一个思路去提高CPU的性能,让CPU可以同时执行多重线程,就能够让CPU发挥更大效率,即所谓“超线程(Hyper-Threading,简称“HT”)”技术。超线程技术就是利用特殊的硬件指令,把两个逻辑内核模拟成两个物理芯片,让单个处理器都能使用线程级并行计算,进而兼容多线程操作系统和软件,减少了CPU的闲置时间,提高的CPU的运行效率。
采用超线程及时可在同一时间里,应用程序可以使用芯片的不同部分。虽然单线程芯片每秒钟能够处理成千上万条指令,但是在任一时刻只能够对一条指令进行操作。而超线程技术可以使芯片同时进行多线程处理,使芯片性能得到提升。
超线程技术是在一颗CPU同时执行多个程序而共同分享一颗CPU内的资源,理论上要像两颗CPU一样在同一时间执行两个线程,P4处理器需要多加入一个Logical CPU Pointer(逻辑处理单元)。因此新一代的P4 HT的die的面积比以往的P4增大了5%。而其余部分如ALU(整数运算单元)、FPU(浮点运算单元)、L2 Cache(二级缓存)则保持不变,这些部分是被分享的。
虽然采用超线程技术能同时执行两个线程,但它并不象两个真正的CPU那样,每各CPU都具有独立的资源。当两个线程都同时需要某一个资源时,其中一个要暂时停止,并让出资源,直到这些资源闲置后才能继续。因此超线程的性能并不等于两颗CPU的性能。
英特尔P4超线程有两个运行模式,Single Task Mode(单任务模式)及Multi Task Mode(多任务模式),当程序不支持Multi-Processing(多处理器作业)时,系统会停止其中一个逻辑CPU的运行,把资源集中于单个逻辑CPU中,让单线程程序不会因其中一个逻辑CPU闲置而减低性能,但由于被停止运行的逻辑CPU还是会等待工作,占用一定的资源,因此Hyper-Threading CPU运行Single Task Mode程序模式时,有可能达不到不带超线程功能的CPU性能,但性能差距不会太大。也就是说,当运行单线程运用软件时,超线程技术甚至会降低系统性能,尤其在多线程操作系统运行单线程软件时容易出现此问题。
需要注意的是,含有超线程技术的CPU需要芯片组、软件支持,才能比较理想的发挥该项技术的优势。目前支持超线程技术的芯片组包括如:英特尔i845GE、PE及矽统iSR658 RDRAM、SiS645DX、SiS651可直接支持超线程;英特尔i845E、i850E通过升级BIOS后可支持;威盛P4X400、P4X400A可支持,但未获得正式授权。操作系统如:Microsoft Windows XP、Microsoft Windows 2003,Linux kernel 2.4.x以后的版本也支持超线程技术。
以上我们对读者来信的部分问题做了解答,下期我们将陆续解答读者朋友的其他问题。
一、多媒体指令集
CPU依靠指令来计算和控制系统,每款CPU在设计时就规定了一系列与其硬件电路相配合的指令系统。指令的强弱也是CPU的重要指标,指令集是提高微处理器效率的最有效工具之一。从现阶段的主流体系结构讲,指令集可分为复杂指令集和精简指令集两部分,而从具体运用看,如Intel的MMX(Multi Media Extended)、SSE、 SSE2(Streaming-Single instruction multiple data-Extensions 2)和AMD的3DNow!等都是CPU的扩展指令集,分别增强了CPU的多媒体、图形图象和Internet等的处理能力。我们通常会把CPU的扩展指令集称为“CPU的指令集”。
1、精简指令集的运用
在最初发明计算机的数十年里,随着计算机功能日趋增大,性能日趋变强,内部元器件也越来越多,指令集日趋复杂,过于冗杂的指令严重的影响了计算机的工作效率。后来经过研究发现,在计算机中,80%程序只用到了20%的指令集,基于这一发现,RISC精简指令集被提了出来,这是计算机系统架构的一次深刻革命。RISC体系结构的基本思路是:抓住CISC指令系统指令种类太多、指令格式不规范、寻址方式太多的缺点,通过减少指令种类、规范指令格式和简化寻址方式,方便处理器内部的并行处理,提高VLSI器件的使用效率,从而大幅度地提高处理器的性能。
RISC指令集有许多特征,其中最重要的有:
指令种类少,指令格式规范:RISC指令集通常只使用一种或少数几种格式。指令长度单一(一般4个字节),并且在字边界上对齐。字段位置、特别是操作码的位置是固定的。
寻址方式简化:几乎所有指令都使用寄存器寻址方式,寻址方式总数一般不超过5个。其他更为复杂的寻址方式,如间接寻址等则由软件利用简单的寻址方式来合成。
大量利用寄存器间操作:RISC指令集中大多数操作都是寄存器到寄存器操作,只以简单的Load和Store操作访问内存。因此,每条指令中访问的内存地址不会超过1个,访问内存的操作不会与算术操作混在一起。
简化处理器结构:使用RISC指令集,可以大大简化处理器的控制器和其他功能单元的设计,不必使用大量专用寄存器,特别是允许以硬件线路来实现指令操作,而不必像CISC处理器那样使用微程序来实现指令操作。因此RISC处理器不必像CISC处理器那样设置微程序控制存储器,就能够快速地直接执行指令。
便于使用VLSI技术:随着LSI和VLSI技术的发展,整个处理器(甚至多个处理器)都可以放在一个芯片上。RISC体系结构可以给设计单芯片处理器带来很多好处,有利于提高性能,简化VLSI芯片的设计和实现。基于VLSI技术,制造RISC处理器要比CISC处理器工作量小得多,成本也低得多。
加强了处理器并行能力:RISC指令集能够非常有效地适合于采用流水线、超流水线和超标量技术,从而实现指令级并行操作,提高处理器的性能。目前常用的处理器内部并行操作技术基本上是基于RISC体系结构发展和走向成熟的。
正由于RISC体系所具有的优势,它在高端系统得到了广泛的应用,而CISC体系则在桌面系统中占据统治地位。
2、CPU的扩展指令集
对于CPU来说,在基本功能方面,它们的差别并不太大,基本的指令集也都差不多,但是许多厂家为了提升某一方面性能,又开发了扩展指令集,扩展指令集定义了新的数据和指令,能够大大提高某方面数据处理能力,但必需要有软件支持。
MMX指令集
MMX(Multi Media eXtension,多媒体扩展指令集)指令集是Intel公司于1996年推出的一项多媒体指令增强技术。MMX指令集中包括有57条多媒体指令,通过这些指令可以一次处理多个数据,在处理结果超过实际处理能力的时候也能进行正常处理,这样在软件的配合下,就可以得到更高的性能。MMX的益处在于,当时存在的操作系统不必为此而做出任何修改便可以轻松地执行MMX程序。但是,问题也比较明显,那就是MMX指令集与x87浮点运算指令不能够同时执行,必须做密集式的交错切换才可以正常执行,这种情况就势必造成整个系统运行质量的下降。
SSE指令集
SSE(Streaming SIMD Extensions,单指令多数据流扩展)指令集是Intel在Pentium III处理器中率先推出的。其实,早在PIII正式推出之前,Intel公司就曾经通过各种渠道公布过所谓的KNI(Katmai New Instruction)指令集,这个指令集也就是SSE指令集的前身,并一度被很多传媒称之为MMX指令集的下一个版本,即MMX2指令集。究其背景,原来"KNI"指令集是Intel公司最早为其下一代芯片命名的指令集名称,而所谓的"MMX2"则完全是硬件评论家们和媒体凭感觉和印象对"KNI"的 评价,Intel公司从未正式发布过关于MMX2的消息。
而最终推出的SSE指令集也就是所谓胜出的"互联网SSE"指令集。SSE指令集包括了70条指令,其中包含提高3D图形运算效率的50条SIMD(单指令多数据技术)浮点运算指令、12条MMX 整数运算增强指令、8条优化内存中连续数据块传输指令。理论上这些指令对目前流行的图像处理、浮点运算、3D运算、视频处理、音频处理等诸多多媒体应用起到全面强化的作用。SSE指令与3DNow!指令彼此互不兼容,但SSE包含了3DNow!技术的绝大部分功能,只是实现的方法不同。SSE兼容MMX指令,它可以通过SIMD和单时钟周期并行处理多个浮点数据来有效地提高浮点运算速度。
SSE2指令集
SSE2(Streaming SIMD Extensions 2,Intel官方称为SIMD 流技术扩展 2或数据流单指令多数据扩展指令集 2)指令集是Intel公司在SSE指令集的基础上发展起来的。相比于SSE,SSE2使用了144个新增指令,扩展了MMX技术和SSE技术,这些指令提高了广大应用程序的运行性能。随MMX技术引进的SIMD整数指令从64位扩展到了128位,使SIMD整数类型操作的有效执行率成倍提高。双倍精度浮点SIMD指令允许以SIMD格式同时执行两个浮点操作,提供双倍精度操作支持有助于加速内容创建、财务、工程和科学应用。除SSE2指令之外,最初的SSE指令也得到增强,通过支持多种数据类型(例如,双字和四字)的算术运算,支持灵活并且动态范围更广的计算功能。SSE2指令可让软件开发员极其灵活的实施算法,并在运行诸如MPEG-2、MP3、3D图形等之类的软件时增强性能。Intel是从Willamette核心的Pentium 4开始支持SSE2指令集的,而AMD则是从K8架构的SledgeHammer核心的Opteron开始才支持SSE2指令集的。
SSE3指令集
SSE3(Streaming SIMD Extensions 3,Intel官方称为SIMD 流技术扩展 3或数据流单指令多数据扩展指令集 3)指令集是Intel公司在SSE2指令集的基础上发展起来的。相比于SSE2,SSE3在SSE2的基础上又增加了13个额外的SIMD指令。SSE3中13个新指令的主要目的是改进线程同步和特定应用程序领域,例如媒体和游戏。这些新增指令强化了处理器在浮点转换至整数、复杂算法、视频编码、SIMD浮点寄存器操作以及线程同步等五个方面的表现,最终达到提升多媒体和游戏性能的目的。Intel是从Prescott核心的Pentium 4开始支持SSE3指令集的,而AMD则是从2005年下半年Troy核心的Opteron开始才支持SSE3的。但是需要注意的是,AMD所支持的SSE3与Intel的SSE3并不完全相同,主要是删除了针对Intel超线程技术优化的部分指令。
3D Now!指令集
由AMD公司提出的3DNow!指令集应该说出现在SSE指令集之前,并被AMD广泛应用于其K6-2 、K6-3以及Athlon(K7)处理器上。3DNow!指令集技术其实就是21条机器码的扩展指令集。
与Intel公司的MMX技术侧重于整数运算有所不同,3DNow!指令集主要针对三维建模、坐标变换 和效果渲染等三维应用场合,在软件的配合下,可以大幅度提高3D处理性能。后来在Athlon上开发了Enhanced 3DNow!。这些AMD标准的SIMD指令和Intel的SSE具有相同效能。因为受到Intel在商业上以及Pentium III成功的影响,软件在支持SSE上比起3DNow!更为普遍。Enhanced 3DNow!AMD公司继续增加至52个指令,包含了一些SSE码,因而在针对SSE做最佳化的软件中能获得更好的效能。
目前最新的Intel CPU可以支持SSE、SSE2、SSE3指令集。早期的AMD CPU仅支持3DNow!指令集,随着Intel的逐步授权,从Venice核心的Athlon 64开始,AMD的CPU不仅进一步发展了3DNow!指令集,并且可以支持Inel的SSE、SSE2、SSE3指令集。不过目前业界接受比较广泛的还是Intel的SSE系列指令集,AMD的3DNow!指令集应用比较少。
二、防病毒技术
CPU内嵌的防病毒技术是一种硬件防病毒技术,与操作系统相配合,可以防范大部分针对缓冲区溢出(buffer overrun)漏洞的攻击(大部分是病毒)。Intel的防病毒技术是EDB(Excute Disable Bit),AMD的防病毒技术是EVP(Ehanced Virus Protection),但不管叫什么,它们的原理都是大同小异的。严格来说,目前各个CPU厂商在CPU内部集成的防病毒技术不能称之为“硬件防毒”。首先,无论是Intel的EDB还是AMD的EVP,它们都是采用硬软结合的方式工作的,都必须搭配相关的操作系统和软件才能实现;其次,EDB和EVP都是为了防止因为内存缓冲区溢出而导致系统或应用软件崩溃的,而这内存缓冲区溢出有可能是恶意代码(病毒)所为,也有可能是应用程序设计的缺陷所致(无意识的),因此我们将其称之为“防缓冲区溢出攻击”更为恰当些。
在计算机内部,等待处理的数据一般都被放在内存的某个临时空间里,这个临时存放空间被称为缓冲区(Buffer),缓冲区的长度事先已经被程序或者操作系统定义好了。缓冲区溢出(buffer overrun)是指当计算机程序向缓冲区内填充的数据位数超过了缓冲区本身的容量。溢出的数据覆盖在合法数据上。理想情况是,程序检查数据长度并且不允许输入超过缓冲区长度的字符串。但是绝大多数程序都会假设数据长度总是与所分配的存储空间相匹配,这就为缓冲区溢出埋下隐患。操作系统所使用的缓冲区又被称为堆栈,在各个操作进程之间,指令被临时存储在堆栈当中,堆栈也会出现缓冲区溢出。当一个超长的数据进入到缓冲区时,超出部分就会被写入其他缓冲区,其他缓冲区存放的可能是数据、下一条指令的指针,或者是其他程序的输出内容,这些内容都被覆盖或者破坏掉。可见一小部分数据或者一套指令的溢出就可能导致一个程序或者操作系统崩溃。而更坏的结果是,如果相关数据里包含了恶意代码,那么溢出的恶意代码就会改写应用程序返回的指令,使其指向包含恶意代码的地址,使其被CPU编译而执行,而这可能发生“内存缓冲区溢出攻击”,名噪一时的“冲击波”、“震荡波”等蠕虫病毒就是采用这种手段来攻击电脑的。
缓冲区溢出是由编程错误引起的。如果缓冲区被写满,而程序没有去检查缓冲区边界,也没有停止接收数据,这时缓冲区溢出就会发生。缓冲区边界检查被认为是不会有收益的管理支出,计算机资源不够或者内存不足是编程者不编写缓冲区边界检查语句的理由,然而技术的飞速发展已经使这一理由失去了存在的基础,但是多数用户日常主要应用的程序中大多数其实仍然是十年甚至二十年前的程序代码,并没有检查缓冲区边界的功能。
缓冲区溢出是病毒编写者和特洛伊木马编写者偏爱使用的一种攻击方法。攻击者或者病毒善于在系统当中发现容易产生缓冲区溢出之处,运行特别程序,获得优先级,指示计算机破坏文件,改变数据,泄露敏感信息,产生后门访问点,感染或者攻击其他计算机。
对于缓冲区溢出攻击,防毒杀毒软件虽然也可以处理,但也只能是亡羊补牢,而操作系统和应用软件的漏洞又是难以预测的,随时可能被利用,引来缓冲区溢出攻击。在这种情况下,预防缓冲区溢出攻击应该从硬件层次着手,开始成为许多IT厂商的共识,于是大家俗称的CPU硬件防病毒功能应运而生了。
缓冲区溢出攻击最基本的实现途径是向正常情况下不包含可执行代码的内存区域插入可执行的代码,并欺骗CPU执行这些代码。而如果我们在这些内存页面的数据区域设置某些标志(No eXecute或eXcute Disable),当CPU读取数据时检测到该内存页面有这些标志时就拒绝执行该区域的可执行指令,从而可防止恶意代码被执行,这就是CPU的防缓冲区溢出攻击实现的原理。
而对于开启了EDB或EVP功能的计算机来说,一般也就可实现数据和代码的分离,而在内存某个页面将被设置为只做数据页,而任何企图在其中执行代码的行为都将被CPU所拒绝。当然,开启EDB、EVP功能的CPU是无法独立完成标注不可执行代码内存页面以及进行相关检测防治工作的,它还需要相关操作系统和应用程序的配合。
目前,Windows XP SP2、Windows Server 2003 SP1及64bit的Windows操作系统都提供了对EDB、EVP技术的支持。如果你使用的操作系统是Windows XP SP2,那么启用其中的DEP(Data Execution Protection,数据执行保护)功能即可为你的电脑提供比较全面的防缓冲区溢出攻击功能。DEP是可以独立运行的,并也可帮助防御某些类型的恶意代码攻击,但要充分利用DEP可以提供的保护功能,就需要CPU的配合了。DEP可单独或和兼容的CPU一起将内存的某些页面位置标注为不可执行,如果某个程序尝试从被保护的位置运行代码,将会被CPU拒绝同时DEP会关闭程序并通知用户,从而在一定程度上保障用户电脑的安全。
CPU内嵌的防病毒技术以及操作系统的防病毒技术因此在目前来说可能还存在着一些兼容性的问题,例如因应用程序设计的缺陷或驱动程序而导致的误报(特别是一些比较老的驱动程序);另外,对于有些程序来说,是采用实时生成代码方式来执行动态代码的,而生成的代码就有可能位于标记为不可执行的内存区域,这就有可能导致DEP将其检测为非法应用程序而将其关闭。而这些都还有赖于硬件和软件厂商的相互配合解决,当然,这些都是需要的时间。因此,DEP、EDB、EVP等技术都还在向前发展。
三、超线程技术
CPU生产商为了提高CPU的性能,通常做法是提高CPU的时钟频率和增加缓存容量。不过目前CPU的频率越来越快,如果再通过提升CPU频率和增加缓存的方法来提高性能,往往会受到制造工艺上的限制以及成本过高的制约。
尽管提高CPU的时钟频率和增加缓存容量后的确可以改善性能,但这样的CPU性能提高在技术上存在较大的难度。实际上在应用中基于很多原因,CPU的执行单元都没有被充分使用。如果CPU不能正常读取数据(总线/内存的瓶颈),其执行单元利用率会明显下降。另外就是目前大多数执行线程缺乏ILP(Instruction-Level Parallelism,多种指令同时执行)支持。这些都造成了目前CPU的性能没有得到全部的发挥。因此,Intel则采用另一个思路去提高CPU的性能,让CPU可以同时执行多重线程,就能够让CPU发挥更大效率,即所谓“超线程(Hyper-Threading,简称“HT”)”技术。超线程技术就是利用特殊的硬件指令,把两个逻辑内核模拟成两个物理芯片,让单个处理器都能使用线程级并行计算,进而兼容多线程操作系统和软件,减少了CPU的闲置时间,提高的CPU的运行效率。
采用超线程及时可在同一时间里,应用程序可以使用芯片的不同部分。虽然单线程芯片每秒钟能够处理成千上万条指令,但是在任一时刻只能够对一条指令进行操作。而超线程技术可以使芯片同时进行多线程处理,使芯片性能得到提升。
超线程技术是在一颗CPU同时执行多个程序而共同分享一颗CPU内的资源,理论上要像两颗CPU一样在同一时间执行两个线程,P4处理器需要多加入一个Logical CPU Pointer(逻辑处理单元)。因此新一代的P4 HT的die的面积比以往的P4增大了5%。而其余部分如ALU(整数运算单元)、FPU(浮点运算单元)、L2 Cache(二级缓存)则保持不变,这些部分是被分享的。
虽然采用超线程技术能同时执行两个线程,但它并不象两个真正的CPU那样,每各CPU都具有独立的资源。当两个线程都同时需要某一个资源时,其中一个要暂时停止,并让出资源,直到这些资源闲置后才能继续。因此超线程的性能并不等于两颗CPU的性能。
英特尔P4超线程有两个运行模式,Single Task Mode(单任务模式)及Multi Task Mode(多任务模式),当程序不支持Multi-Processing(多处理器作业)时,系统会停止其中一个逻辑CPU的运行,把资源集中于单个逻辑CPU中,让单线程程序不会因其中一个逻辑CPU闲置而减低性能,但由于被停止运行的逻辑CPU还是会等待工作,占用一定的资源,因此Hyper-Threading CPU运行Single Task Mode程序模式时,有可能达不到不带超线程功能的CPU性能,但性能差距不会太大。也就是说,当运行单线程运用软件时,超线程技术甚至会降低系统性能,尤其在多线程操作系统运行单线程软件时容易出现此问题。
需要注意的是,含有超线程技术的CPU需要芯片组、软件支持,才能比较理想的发挥该项技术的优势。目前支持超线程技术的芯片组包括如:英特尔i845GE、PE及矽统iSR658 RDRAM、SiS645DX、SiS651可直接支持超线程;英特尔i845E、i850E通过升级BIOS后可支持;威盛P4X400、P4X400A可支持,但未获得正式授权。操作系统如:Microsoft Windows XP、Microsoft Windows 2003,Linux kernel 2.4.x以后的版本也支持超线程技术。
以上我们对读者来信的部分问题做了解答,下期我们将陆续解答读者朋友的其他问题。