源代码

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