Intel處理器MSR學習

原文鏈接:http://blog.csdn.net/subfate/article/details/50741885

Intel IA32軟件開發者手冊第3卷第35章中介紹了MSR。但是,該章節並沒有十分詳細地描述,基本上就給出一個地址並作簡單說明。而網絡上能搜索到文章,也是點到即止。本文結合IA32開發手冊,以及coreboot代碼,概要地整理一下這方面的知識,用實例來展示MSR用途。

一、概念

MSR是“Model Specific Registers” (直譯爲”模型特定寄存器“)的縮寫。正如其名它和處理器的Model密切相關,不同的Model,哪怕只相差一個迭代版本,MSR也會有不同。需要用CPUID指令讀取DisplayFamily和DisplayModel,從而得知該處理器(包括不同的系列或模型(model))能使用的MSR範圍。有些MSR一旦確定就不會再改變,這類MSR被稱爲”ARCHITECTURAL MSRS“,手冊使用前綴”IA32_“表示,如寄存器地址爲0x17的名稱爲IA32_PLATFORM_ID,表示處理器平臺類型,下文將以此作爲實例演示msr用法。

二、操作方法

MSR是一組64 位寄存器,分別通過rdmsr和wrmsr 指令進行讀和寫操作。使用rdmsr讀取到的64比特數據分別放到edx和eax (分別爲高低32比特)。而使用wrmsr寫時,高低32比特數據分別放到edx和eax中,另外寄存器偏移存於ecx中。在coreboot代碼中,使用rdmsr()和wrmsr函數分別進行msr的讀、寫操作。具體實現如下:

typedef struct msr_struct
{
unsigned lo;
unsigned hi;
} msr_t;

static inline __attribute__((always_inline)) msr_t rdmsr(unsigned index)
{
msr_t result;
__asm__ __volatile__ (
"rdmsr"
: "=a" (result.lo), "=d" (result.hi)
: "c" (index)
);
return result;
}

static inline __attribute__((always_inline)) void wrmsr(unsigned index, msr_t msr)
{
__asm__ __volatile__ (
"wrmsr"
: /* No outputs */
: "c" (index), "a" (msr.lo), "d" (msr.hi)
);
}

代碼使用的內嵌彙編靖參考前面文章,本文不再贅述。

三、例子

讀取Intel處理器Baytrail爲例,讀取其平臺類型使用msr讀取寄存器0x17(MSR_IA32_PLATFORM_ID)。coreboot項目代碼如下:

// 打印CPU芯片類型
#define VARIANT_ID_BYTE 18
#define VARIANT_ID_MASK 7
void report_platform_info(void)
{
const char *baytrail_variants[4] = {
"Bay Trail-I (ISG/embedded)",
"Bay Trail-T (Tablet)",
"Bay Trail-D (Desktop)",
"Bay Trail-M (Mobile)",
};
msr_t platform_id = rdmsr(MSR_IA32_PLATFORM_ID);
uint8_t variant = (platform_id.hi >> VARIANT_ID_BYTE) & VARIANT_ID_MASK;


printk(BIOS_INFO, "Baytrail Chip Variant: %s\n", variant < 4 ?
      baytrail_variants[variant] : "Unknown");
print_dram_info();
}

注:截止本文發表時,未能找到“#define VARIANT_ID_BYTE 18”的依據。

另:鄧志的《x86/x64體系探索及編程》中也有涉及MSR,建議去看看。

四、參考

coreboot項目主頁:http://www.coreboot.org/
Intel 64 and IA-32 Architectures Software Developer’s Manual手冊下載地址:
http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章