我正在尝试反转机器的 BIOS 来学习一些东西。我面临的更大问题是,在早期初始化期间,代码大量使用 MSR,而且大多数时候,我发现那些没有记录。
在这个 BIOS 的一个特定点,作为一个例子,我发现了这个功能:
0000F575 sub_F575 proc near
0000F575 60 pusha
0000F576 B8 01 00 00 00 mov eax, 1
0000F57B 0F A2 cpuid
0000F57D C1 C8 04 ror eax, 4
0000F580 66 3D 6F 30 cmp ax, 306Fh ; Haswell
0000F584 74 06 jz short HaswellBroadwellStuffs
0000F586 66 3D 6F 40 cmp ax, 406Fh ; Broadwell
0000F58A 75 0E jnz short NoNeed4IvyBridge
0000F58C
0000F58C HaswellBroadwellStuffs:
0000F58C B9 FC 01 00 00 mov ecx, 1FCh
0000F591 0F 32 rdmsr
0000F593 0D 01 00 20 00 or eax, 200001h
0000F598 0F 30 wrmsr
0000F59A
0000F59A NoNeed4IvyBridge:
0000F59A 61 popa
0000F59B E8 02 06 00 00 call DummyProc_1
0000F5A0 C3 retn
0000F5A0 sub_F575 endp
仔细查看英特尔 64 位和 IA-32 架构软件开发人员手册第 4 卷:特定于模型的寄存器,我没有发现此 BIOS 所针对的Haswell、Broadwell或IvyBridge存在此0x1fc寄存器的证据。相反,对于不同的 Intel 版本,很少有关于此寄存器的文档:
- 对于Goldmont、Nehalem,该寄存器名为MSR_POWER_CTL并且仅记录了第 1 位
- 因为Sandy Bridge仍然被命名为MSR_POWER_CTL,但没有提供更多信息,它只是说参考http://biosbits.org,在那里没有找到任何有用的东西。
- 对于Skylake、Kaby Lake、Coffee Lake和Cannon Lake数据表更加冗长;仍然命名为MSR_POWER_CTL并且出现了位:#1、#20 和 #21 的描述,仍然没有证据表明此函数中使用了位 #0 和 #21。
所以我的问题:如果有人知道我提到的登记册的信息,如果他/她想与我分享,那就太好了;更重要的是,如果有人能指导我找到有关此主题的可靠信息来源,而不是英特尔官方手册,我将不胜感激。