Mik*_*e S 4 x86 assembly x86-64 cpuid msr
我正在尝试使用CPUID,但是附加了一些字符串.根据sandpile.org 的CPUID页面,CPUID标准函数0000_0004h及以上仅在MISC_ENABLE.LCMV标志设置为0时才起作用.该标志是模型专用寄存器(MSR)1A0的第22位.显然,这种限制是由于Windows NT中的一个错误(感谢让我更轻松,微软;)).
我可以使用CPUID 0000_0001h(ecx标志,位3)测试LCMV标志的存在.假设它存在,究竟是什么,为什么它对CPUID有这样的影响?MSR 1A0是读/写寄存器还是只读?这样的专用寄存器如何使用汇编代码读/写?
如果寄存器在技术上是读/写,那么在将CPU22指令恢复到原始设置之前,在将CPU22指令的持续时间内将第22位复位为0是否安全?或者如果它设置不正确(即启用),我几乎搞砸了?
最后,sandpile使用了"只有在MISC_ENABLE.LCMV设置为0时才启用此级别.这是由于Windows NT错误." 如果由于这个原因特别禁用了一堆标准级别,那么这是否会反映在CPUID级别0000_000h的eax寄存器(最大支持的标准级别)的输出中?
Phew ......我认为就是这样.
您将需要下载英特尔®64和IA-32架构软件开发人员手册,因为它包含所有请求的信息.
我可以使用CPUID 0000_0001h(ecx标志,位3)测试LCMV标志的存在.假设它存在,究竟是什么,为什么它对CPUID有这样的影响?
标志的全名(参见第3B B-17卷)是"限制CPUID MaxVal"并将其效果表示为"当此位设置为1时,CPUID.00H返回EAX [7:0]中的最大值3" .
MSR 1A0是读/写寄存器还是只读?
根据英特尔手册进行读/写(有一点需要注意,请继续阅读).
这样的专用寄存器如何使用汇编代码读/写?
您阅读使用RDMSR(Vol.2B 4-301)并使用WRMSR(Vol.2B 4-505)编写,但请注意,它们要求您以实模式或特权级别0(也称为内核模式)运行.
如果寄存器在技术上是读/写,那么在将CPU22指令恢复到原始设置之前,在将CPU22指令的持续时间内将第22位复位为0是否安全?或者如果它设置不正确(即启用),我几乎搞砸了?
它应该只设置在有缺陷的操作系统上,你不应该清除它.如果您正在编写自己的内核,请继续并清除它,因为您自己声明它仅适用于NT和类似情况的错误版本.
最后,sandpile使用了"只有在MISC_ENABLE.LCMV设置为0时才启用此级别.这是由于Windows NT错误." 如果由于这个原因特别禁用了一堆标准级别,那么这是否会反映在CPUID级别0000_000h的eax寄存器(最大支持的标准级别)的输出中?
是的,它专门用于强制它在这种情况下返回3(参见上面的描述).