ITHJF 发表于 2007-06-26 22:48

求:C语言编程获得CPU类型(WINDOWS或LUNUX)

最近想深入学习一下LINUX操作系统,现在遇到的第一个问题是编程获得CPU类型。但是还不太清楚思路,请大家指导一下。

hshq_cn 发表于 2007-06-27 09:07

内嵌汇编指令码? cpuid?

ITHJF 发表于 2007-06-27 13:22

我明白怎么编写了

#include<stdio.h>

unsigned int veax;
unsigned int vebx;
unsigned int vedx;
unsigned int vecx;
//执行CPUID指令
void cpuid(unsigned int veax1)
{
        _asm{
             mov eax,veax1
               cpuid
               mov veax,eax
               mov vebx,ebx
               mov vecx,ecx
               mov vedx,edx
        }
}

//做移位操作,把寄存器中的ASCII码,以字符形式输出
void LeftMove(unsigned int var)
{
printf("%c",var);
for(int i=0;i<3;i++)
{
var=(var>>8);
printf("%c",var);
}
}

//做移位操作,把寄存器中的值以“%d”形式输出
void LM(unsigned int var)
{
printf("%d",var);
for(int i=0;i<3;i++)
{
var=(var>>8);
printf("%d",var);
}
}

//得到CPU的生产厂商(当EAX值为0时),依次存放在EBX,EDX,ECX中
void getCpuName()
{
cpuid(0);
LeftMove(vebx);
LeftMove(vedx);
LeftMove(vecx);
printf("\n");
}

//得到CPU的商标,当EAX中的值为0x80000003和0x80000004时分别返回16个字符,组成商标
//依次存放在EAX,EBX,ECX,EDX中
void getCpuBrand()
{
for(int j=0;j<2;j++)
{
cpuid(0x80000003+j);
LeftMove(veax);
LeftMove(vebx);
LeftMove(vecx);
LeftMove(vedx);
}
printf("\n");
}

//获得CPU的特性,参数是eax = 1,返回值放在edx和ecx,通过验证edx或者ecx的某一个bit,
//可以获得CPU的一个特性是否被支持。比如说,edx的bit 32代表是否支持MMX,
//edx的bit 28代表是否支持Hyper-Threading,ecx的bit 7代表是否支持speed sted。
voidgetCpuFeature()
{//由于特性太多,无法一一编写,需要的时候再写,方法是一样的。

}

//获得CPU序列号,获得序列号需要两个步骤,首先用eax = 1做参数,返回的eax中存储序列号的高两个WORD。
//用eax = 3做参数,返回ecx和edx按从低位到高位的顺序存储前4个WORD。
void getCpuSeris()
{
cpuid(1);
LM(veax);
cpuid(3);
LM(vecx);
LM(vedx);
printf("\n");
}
void main()
{
getCpuName();
getCpuBrand();
getCpuSeris();
}

W.Z.T 发表于 2007-06-28 07:58

顶下:P :P :P

朱熹之 发表于 2007-06-28 08:08

只能内嵌汇编
或者自己做个库进行支持

cjaizss 发表于 2007-07-16 01:59

可以看看/proc/cpuinfo有没有你想要的信息

PiscesSTAR 发表于 2007-07-24 16:01

回复 #3 ITHJF 的帖子

支持一下
学到东西了

[ 本帖最后由 PiscesSTAR 于 2007-7-24 16:29 编辑 ]

cjaizss 发表于 2007-07-25 14:20

嵌入cpuid指令也有不好的地方,不好跨不同种类的CPU,而这点违背了UNIX的原则
不过话说回来,真的想做到最好的可移植性还是分支编译比较好:)

leviathan.alan 发表于 2007-07-27 10:00

Intel Processor Identification and the CPUID Instruction.pdf

leviathan.alan 发表于 2007-07-27 10:01

回复 #8 cjaizss 的帖子

其它实现IA32/x64的CPU vendor,也是要提供同样语义的cpuid指令的。
页: [1]
查看完整版本: 求:C语言编程获得CPU类型(WINDOWS或LUNUX)