C語言呼叫Intel處理器CPUID指令的例項

2021-09-07 19:43:24 字數 3822 閱讀 8514

**

在linux環境下,使用c語言內嵌彙編的手段使用cpuid指令,進而在高階語言層面上看到獲取的資訊。

實現檔案cpuid.c**如下:

struct

cpuid_result ;

/** generic cpuid function

*/static inline struct cpuid_result cpuid(unsigned int

op)static inline unsigned int cpuid_eax(unsigned int

op)void get_cpu_vendor(char* cpu_vendor, unsigned int*cpuid_level)

;

struct

cpuid_result result;

unsigned

int level = 0

; vendor_name[

0] = '

\0'; /*

unset

*/result = cpuid(cpuid_op); //

eax為0表示讀取vendor id,一共12位元組,依次在ebx、edx、ecx。

level =result.eax;

vendor_name[

0] = (result.ebx >> 0) & 0xff

; vendor_name[

1] = (result.ebx >> 8) & 0xff

; vendor_name[

2] = (result.ebx >> 16) & 0xff

; vendor_name[

3] = (result.ebx >> 24) & 0xff

; vendor_name[

4] = (result.edx >> 0) & 0xff

; vendor_name[

5] = (result.edx >> 8) & 0xff

; vendor_name[

6] = (result.edx >> 16) & 0xff

; vendor_name[

7] = (result.edx >> 24) & 0xff

; vendor_name[

8] = (result.ecx >> 0) & 0xff

; vendor_name[

9] = (result.ecx >> 8) & 0xff

; vendor_name[

10] = (result.ecx >> 16) & 0xff

; vendor_name[

11] = (result.ecx >> 24) & 0xff

; vendor_name[

12] = '\0'

; strcpy(cpu_vendor, vendor_name);

*cpuid_level =level;

}void get_cpu_id(char* cpu_id, unsigned int*cpu_sign)

struct

cpuinfo_x86 ;

//參考ia32開發手冊第2卷第3章。cpuid exa==0x01的圖3-6

static inline void get_fms(struct cpuinfo_x86 *c, uint32_t tfms)

void get_cpu_fms(unsigned int* family, unsigned int* model, unsigned int*stepping)

void get_cpu_name(char*processor_name)

temp_processor_name[

49] = '

\0'; //

最後的位元組為0,結束

/*skip leading spaces.

*/processor_name_start =temp_processor_name;

while (*processor_name_start == '')

processor_name_start++;

memset(processor_name,

0, 49

); strcpy(processor_name, processor_name_start);

}void get_address_bits(unsigned int* linear, unsigned int*physical)

主函式實現**如下:

intel處理器的cpuid遠不止上文所述,詳情請參考intel ia32軟體開發手冊。

在gcc中獲取cpuid資訊(相容vc) 

*************************== end

Intel處理器系列

intel處理器系列俗稱x86,經歷了乙個長期的 不斷進化的發展過程。1.8086 1978年,29k個電晶體 它是第一代單晶元 16位微處理器之一。2.80286 1982年,134k個電晶體 它增加了更多的定址模式。3.i386 1985年,275k個電晶體 擴充套件到了32位,增加了平坦的定址...

Intel處理器基本暫存器

ia 32架構提供16個基本程式執行暫存器,用於一般系統和應用程式程式設計 這些暫存器可分為如下四類 通用暫存器主要儲存指令運算過程中的各類資料,包括 ia 32架構下共包含了8個通用暫存器,依次命名為eax ebx ecx edx esi edi ebp esp。儘管這些暫存器都可用於通用資料的儲...

協處理器CP15

在基於arm的嵌入式應用系統中,儲存系統通常是通過系統控制協處理器cp15完成的。arm處理器使用協處理器15 cp15 的暫存器來控制cache tcm和儲存器管理。cp15包含16個32位的暫存器,其編號為0 15。mcr arm暫存器到協處理器暫存器的資料傳送 mrc 協處理器暫存器到arm暫...