《x86_x64体系结构探索》读书笔记 —— 第四章

《x86_x64体系结构探索》读书笔记 —— 第四章

识别处理器–CPUID

测试是否支持CPUID

eflags bit21:能修改成功,则支持CPUID
CPUID表达
在这里插入图片描述

a. 查询
从cpuid获得信息必须先提供相应的leaf(功能号main leaf),功能号
main leaf:查询DPUID的01号功能,即CPUID的01 leaf;main leaf输入到EAX中
sub leaf: 对于一些复杂的功能,需要复制的子叶,sub leaf输入到ECX中
mov eax, 0Bh //功能号0B
mov ecx, 0 //子叶0
cpuid //查询COUID的0B号功能,子叶为0
b. 返回
cpuid的返回,当使用cpuid进行cpu功能查询时,查询到的信息存放在eax、ebx、ecx、edx中

test1:测试是否支持CPUID

在这里插入图片描述

基本信息与扩展信息

不同的处理器,CPUID支持的leaf数量是不同的,在使用某个leaf查询之前,必查询段处理器是否支持该leaf
a. 基本最大功能号
使用CPUID的00H leaf来查询,最大的基本功能号放回在EAX中;
使用CPUID的80000000H leaf来查询,最大的扩展功能号放回在EAX中;
功能号0,也返回处理器厂商名,Intel机器上
ebx–Genu,ecx–ntel,edx–iniI,

test 2:获取最大的功能号

在这里插入图片描述

注:如果早eax中输入的功能号查过了最大的功能号,那么将返回基本最大功能号

test 3:当eax提供的值超过了最大功能号之后返回的结果是什么?

在这里插入图片描述

总结:
当eax的值大于或等于最大功能号时,返回的是最大功能号的信息
当eax的值小于或等于最大功能号时,若处理器支持该功能号,则返回该功能号的信息

处理器型号 (01H leaf)

CPUID.01H:EAX可以返回处理器的family、model、stepping
EAX[7:4] model
EAX[11:8] family
EAX[19:16] 扩展model
EAX[27:20] 扩展family Pentium4之后支持扩展family
Displayfamily计算方法
if (family == 0FH) { //Pentium4
Displayfamily = ExtendedFamily + Family;
}else{
Displayfamily = Family;
}
Displaymodel计算方法
if (family == 06H || family == 0FH) { //Pentium4 and P6
Displaymodel = Displaymodel << 4 + model;
}else{
Displaymodel = model;
}

test 4调用lib16.asm中的get_Displayfamily()和get_Displaymodel()来获取到Displayfamily和Displaymodel

在这里插入图片描述

最大的物理地址和线性地址 (80000008H leaf)

CPUID.80000008H leaf中,可以获得处理器支持的最大物理地址和线性地址
实验2中80000008中返回的是eax是0x00003028
低byte是物理地址宽度,28h就是40位
高byte是线性地址,CPU支持long mode就是30h,否则就是20h,表示long mode下最高支持48位的线性地址,线性地址的高16位被用作sign位,在32位机器上这个值就是20h(32位)。
最大物理地址 MAXPHYADDR
80000008K leaf返回的EAX[7:0]就是MAXPHYADDR
处理器不支持80000008H时
CPUID.01H:EDX[6] = 1(PAE=1),支持最高36位物理地址
PAE = 0(不支持PAE),MAXPHYADDR是32位

处理器扩展状态信息 (0DH leaf)

0DH leaf是活的处理器对processor extended state(处理器扩展状态)的支持,对于AVX指令的编程是非常重要的
mov eax, 0Dh //0DH main leaf
mov ecx, 0 //sub leaf 0
cpuid //获得0DH的main leaf功能
0DH main leaf的功能,会在eax和edx寄存器中返回processor extended state的enable/disable位图
返回的edx和eax组成了一个64位的processor extended state功能表,高32位在edx,低32位在eax,每一位对应一个扩展状态功能的enable位
processor extended state会影响到XCR0(extended control register)的值
当state值的某位为0时,XCR0的相应位为保留位(此为不能被XSAVE指令设置)
目前的X86处理器只用到了低3位(bit0~2):
bit0 对应X87 FPU状态
bit1 对应SSE状态,
bit2 对应YMM状态(AVX指令)
a. processor extended state子叶
b. processor extended state子叶所需内存size
0DH leaf,ebx和ecx会返回一个内存size
ebx返回的是在XCR0里设置了开启某个位去迟迟处理器状态所需要的内存size
//此处有图
XCR0和CPUID(EAX=0D和,ECX=0h)返回的64位processor extended state的结构是一样的。
XCR0可以设置SSE状态问enabe/disable
XCR0和processor extended state的关系
XCR0是一个功能开关,用来开启或关闭某些state的保存
processor extended state决定处理器保存那些state信息的能力
OS通过XSETBV指令对XCR0进行相应的设置,如果某些位被disable掉,这时候,XCR0和processor extended state的值会不一致;
因此,ebx寄存器返回的是这个XCR0设置的保存状态所需要的内存size
ecx寄存器返回的是CPU所支持的所有状态(即,在main leaf里返回的eax位图),保存这些转台需要的内存size
因此ebx和ecx不一定相等
例:
如果CPUID(eax=0Dh,ecx=0h)返回的eax继勋奇为07H值,说明支持AVX,这时候可以使用0Dh的2号子叶来查看。
c. processor extended state的保存 XSAVE
processor extended state通过使用XSAVE指令来保存处理器的状态。
对于processor extended state中状态的保存,取决于Xsave指令提供的64位MASK码和XCR0上面相应为的enable,
如果XCR0.YMM=0,表明不保存YMM状态,那么state中YMM的区域不被更新
同样的,在edx:eax这个64位的MASK码中,如果YMM state mask位为0,YMM区域也不会被更新;
必须XCR0和MASK值同时置一,相应的区域才会被更新
上面的例子,由于不支持AVX指令,eax返回0x03,表示支持X87 FPU和SSE状态,
ebx和ecx的返回值是0x240,512+64=576(0x240),X87 FPU需要512字节,还要加上一个header部分,
这个header的首64bit(8byte)是一个XSTATE_BV结构,当XSAVE保存状态时,用来记录部分状态被保存了,若保存了SSE状态,就set bit1,否则就clear bit1,否则就clear bit1.
d. processor extended state的恢复 XSTORE
//此处有图
使用XSTORE指令可以从内存的state映像中恢复原来保存的state信息
header结构64字节,首8字节是一个64位的MASK值,用来记录state映像中那些区域被更新过,相应的位为1,表示相应的位被更新过
XSTATE_BV的位在执行XSAVE指令保存state时被CPU设置。执行XSTORE指令时,CPU会根据 XSTATE_BV被置起来的位,做相应的恢复。

处理器的特性

EAX=01H
CPUID返回,eax存放处理器的family、model、stepping,ebx[15:8]返回CLFLUSH line size,这个值乘以8就是cache line的size,
ebx[23:16]返回逻辑处理器最大可寻址的数目

test 5 在这里插入图片描述

处理器的cache与TLB信息

1)CPUID.EAX=02H,获取CPU的cache与TLB信息
返回值
eax:
byte0:表示需要执行几次CPUID.EAX=02H,才能获得完整的信息,byt0是FF,表示不返回cache和TLB的信息,需要通过CPUID.EAX=04H来查询;
MSB标志位,0指示有效,1指示无效
ebx:
2)CPUID.EAX=04H,获取CPU的cache与TLB信息,从ECX中输入子叶,开始查询
ecx=0h 子叶,
返回值:
EAX[4:0]:cache类型,1:data cache;2:instruction cache;3:unidied cache,0表示终止,已经没有子叶可以枚举了。其他值保留
EAX[7:5]:返回cache的level
EAX[31:26]:处理器的core数,需要加上1
EBX[11:00]:cache line size
EBX[21:12]:physical line aprtition
EBX[31:22]:cache的way数
ECX:32位的cache set数

test 6:使用CPUID.EAX=02H查看cache以及TLB的信息

在这里插入图片描述

long mode

extended 功能号80000001H
EDX[29]:long mode标志位
EDX[11]:SYSCALL/SYSRET指令支持标志位
EDX[26]:1G-page支持位

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值