1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| 讲讲CPUID及其相关知识 1. 首先介绍一下什么是CPUID CPUID指令是IntelIA32架构下获得CPU信息的汇编指令,可以得到CPU类型,型号,制造商信息,商标信息,序列号,缓存等一系列CPU相关的东西. 2. 怎样使用CPUID指令 2.1 怎样查看自己的CPU是否运行在缺陷状态.(代码如下,2.2---2.6代码类似) 对硬件熟悉的朋友应该知道Debug32这个软件.将其拷到启动盘中.然后在启动盘的引导下进入DOS并运行Debug32. 输入-a回车然后输入代码: MOV EAX,1 //使用EAX作为输入参数 CPUID // 读CPUID,让CPU查看微码的版本,并把微码版本送到MSR 8b中. INT 3 //设置编译断点 输入最后一条指令后回车,再输入-g ,回车,系统自动编译.然后输入-r32,回车,系统将显示出各寄存器的内容.完整的代码如下: MOV ECX,008Bh XOR EAX,EAX XOR EDX,EDX WRMSR // 向MSR 8bH写0,清除MSR中的信息
MOV EAX,01H CPUID MOV ECX,008BH RDMSR //读出当前CPU微码版本
执行上面代码后,用r32+回车查看,如果EDX值为0,则表示CPU微码没有加载,你的CPU运行在缺陷的状态,如果不为0,则显示的是当前的微码版本号. 大家都知道,世界上任何事情都不是十全十美的,哪怕是世界顶尖公司Intel设计制造出来的CPU,它也是不可能完全没有任何缺陷,因此当他的CPU发生缺陷的时候, Intel会编写一个对应的程序来解决这个Bug,这个程序就叫做微码(Microcode),实际上它就是一个补丁(Patch).然后由各个制造电脑的厂商将这个微码包在系统BIOS代码中,从而达到解决CPU某些缺陷的目的.
注:简单介绍一下什么是MSR? MSR英文全称是Model Specific Registers,是CPU中的一些特殊寄存器,CPU的很多重要的参数都保存在这些寄存器中.如System Bus Clock, FSB等等.
2.2 怎样获得CPU的制造商信息(Vender ID String). 把EAX=0作为输入参数,将可以得到CPU的制造商信息. CPUID指令执行以后,会返回一个12字符的制造商信息,前四个字符的ASC码按低位到高位放在EBX,中间四个放在EDX,最后四个字符放在ECX。比如说,对于Intel的CPU,会返回一个“GenuineIntel”的字符串,返回值的存储格式为 31 23 15 07 00 EBX| u (75)| n (6E)| e (65)| G (47) EDX| I (49)| e (65)| n (6E)| i (69) ECX| l (6C)| e (65)| t (74)| n (6E) 2.3 怎样获得CPU商标信息(Brand String) 在我的电脑上点击右键,选择属性,可以在窗口的下面看到一条CPU的信息,这就是CPU的商标字符串。CPU的商标字符串也是通过CPUID得到的。由于商标的字符串很长(48个字符),所以不能在一次CPUID指令执行时全部得到,所以Intel把它分成了3个操作,EAX的输入参数分别是0x80000002,0x80000003,0x80000004,每次返回的16个字符,按照从低位到高位的顺序依次放在EAX, EBX, ECX, EDX。因此,可以用循环的方式,每次执行完以后保存结果,然后执行下一次CPUID。(具体每一个Bit代表什么,要到Intel相关网站上查看)
2.4 怎样检测CPU的特性(CPU Feature) CPU的特性可以通过CPUID获得,参数是EAX = 1,返回值放在EDX和ECX,通过验证EDX或者ECX的某一个bit,可以获得CPU的一个特性是否被支持。比如说,EDX的bit 32代表是否支持MMX,EDX的bit 28代表是否支持Hyper-Threading,ECX的bit 7代表是否支持Speedstep。(具体每一个Bit代表什么,要到Intel相关网站上查看)
2.5 怎样获得CPU的缓存(Cache) 缓存,就是CACHE,已经成为判断CPU性能的一项大指标。缓存信息包括:第几级缓存(level),缓存大小(size),通道数(way),吞吐量(line size)。因此可以使用一个结构体来存储缓存信息。 缓存信息可以通过EAX= 2的CPUID来得到(得到的不光有cache信息,还有其他的一些信息),返回值在EAX(高24位), EBX, ECX和EDX,总共15个BYTE的信息,每个BYTE的值不同,代表的意义也不同. (具体每一个Bit代表什么,要到Intel相关网站上查看)
2.6 怎样获得CPU的序列号 序列号无处不在,CPU的序列号用一个96bit的串表示,格式是连续的6个WORD值:XXXX-XXXX-XXXX-XXX-XXXX-XXXX。WORD是16个bit长的数据.获得序列号需要两个步骤,首先用EAX = 1做参数,返回的EAX中存储序列号的高两个WORD。用EAX= 3做参数,返回ECX和EDX按从低位到高位的顺序存储前4个WORD。(具体每一个Bit代表什么,要到Intel相关网站上查看) 3. 怎样修改MSR中的值 当你有了相关经验后,也可以查看并修改MSR中某些Bit的值以达到你想要的目的.不过一般的人不要轻易去修改你的CPU中寄存器的信息.一旦失误,后果可能不堪设想.我只把怎样去修改MSR寄存器的代码写在下面(注:只能修改属性为可写的寄存器,有些只读寄存器是不能修改的) MOV ECX, Index // Index为某个MSR寄存器的地址 XOR EDX, EDX //EDX清0 MOV EAX,DATA1 //DATA1为你要修改写入的值的高16位 MOV EDX,DATA2 //DATA2为你要修改写入的值的低16位 WRMSR |