x86 CPU的MSR暫存器
MSR(Model Specific Register)是x86架構中的概念,指的是在x86架構處理器中,一系列用於控制CPU執行、功能開關、除錯、跟蹤程式執行、監測CPU效能等方面的暫存器。
MSR暫存器的雛形開始於Intel 80386和80486處理器,到Intel Pentium處理器的時候,Intel就正式引入RDMSR和WRMSR兩個指令用於讀和寫MSR暫存器,這個時候MSR就算被正式引入。在引入RDMSR和WRMSR指令的同時,也引入了CPUID指令,該指令用於指明具體的CPU晶片中,哪些功能是可用的,或者這些功能對應的MSR暫存器是否存在,軟體可以通過CPUID指令查詢某些功能是否在當前CPU上是否支援。
每個MSR暫存器都會有一個相應的ID,即MSR Index,或者也叫作MSR暫存器地址,當執行RDMSR或者WRMSR指令的時候,只要提供MSR Index就能讓CPU知道目標MSR暫存器。這些MSR暫存器的編號(MSR Index)、名字及其各個資料區域的定義可以在Intel x86架構手冊”Intel 64 and IA-32 Architectures Software Developer's Manual"的Volume 4中找到。
MSR顧名思義就是Model Specific,即不同的CPU型號或不同的CPU廠商(Intel和AMD都會做x86架構的處理器),它的MSR暫存器可能是不一樣的,它會根據具體的CPU型號的變化而變化,每款新的CPU都有可能引入新的MSR暫存器。事實證明,MSR暫存器的引入用處還是很大的,有一些MSR暫存器甚至是MSR暫存器的部分割槽域將會被固定下來,並且未來的CPU都會支援這些MSR暫存器或者MSR暫存器的部分割槽域,這類MSR暫存器就叫做“Architecture MSRs”,Architecture MSR由於歷史的原因(Pentium處理器是32位的),它的名字都是以"IA32_"為字首的,即使是在目前主流的64位x86處理器中也是這樣命名。對於Intel的x86 CPU和AMD的x86 CPU而言,它們的MSR暫存器可能會有區別,但是可能因為各種原因,或者為了軟體的相容性,它們的部分MSR暫存器是一樣的,如IA32_LSTAR
另外,對於x86 CPU而言,它不僅僅有MSR暫存器,它還包含了特別多的CSR(Control and Status Register)暫存器,這些暫存器主要是給BIOS/UEFI使用,讓其根據具體的主機板結構對CPU的工作模式,內部功能控制,CPU之間的互連等進行配置。CSR暫存器是通過類似PCI配置空間訪問的方式進行訪問的,但是當BIOS/UEFI配置完成後,會將其隱藏起來,所以對於OS而言,它只能訪問到MSR暫存器,它根本不知道CSR暫存器的存在。總的來說,MSR暫存器對於BIOS/UEFI和OS都是可見的,而CSR暫存器只對BIOS/UEFI可見,對於OS來說是不可見的。
歡迎關注同名微信公眾號“河馬虛擬化”第一時間獲取最新文章。