linux c 获取cpu序列号
时间:2014-10-12 05:11 来源:linux.it.net.cn 作者:it
linux c 获取cpu序列号
http://blog.chinaunix.net/uid-23390992-id-3480474.html
在 linux下可以通过查看 cat /proc/cpuinfo查看CPU的相关信息,但是在linux下C编程需要使用汇编语言来实现,因为C语言中没有实现查看CPU信息的函数,一般实现如下:
(C中运行汇编用 __asm__等)
#include<stdio.h>
#include<stdlib.h>
static inline void
get_cpuid(unsigned int i, unsigned int * buf)
{
unsigned int eax,ebx,ecx,edx;
__asm__ (
"cpuid"
:"=a"(eax),"=b"(ebx),"=c"(ecx),"=d"(edx):"a"(i));
buf[0]=eax;
buf[1]=ebx;
buf[2]=edx;
buf[3]=ecx;
}
int main()
{
unsigned int cpu[4];
get_cpuid(0,cpu);
}
需要清楚的是get_cpuid(i,buf)中i等于不同值,代表不同的含义:
0: Get vendor ID
1: Processor Info and Feature Bits,
3: Processor Serial Number
80000000h: Get Highest Extended Function Supported
80000001h: Extended Processor Info and Feature Bits
80000002h,80000003h,80000004h: Processor Brand String
具体访问http://en.wikipedia.org/wiki/CPUID
#include <stdio.h>
#include <stdint.h>
unsigned int veax;
unsigned int vebx;
unsigned int vedx;
unsigned int vecx;
void cpuid(unsigned int veax1)
{
asm("cpuid"
:"=a"(veax),
"=b"(vebx),
"=c"(vecx),
"=d"(vedx)
:"a"(veax));
}
void LM(int var,uint32_t *vx)
{
int i;
for(i=0;i<3;i++)
{
var=(var>>i);
vx[i]=var;
}
}
static void getcpuid (char *id)
{
uint32_t ax[3],cx[3],dx[3];
cpuid(1);
LM(veax,ax);
cpuid(3);
LM(vecx,cx);
LM(vedx,dx);
sprintf(id,"%u%u%u%u%u%u%u%u%u",ax[0],ax[1],ax[2],cx[0],cx[1],cx[2],dx[0],dx[1],dx[2]);
}
int main(void)
{
char cpuid[100];
getcpuid(cpuid);
printf("cpuid is %s\\n",cpuid);
return 0;
}
(责任编辑:IT)
linux c 获取cpu序列号 http://blog.chinaunix.net/uid-23390992-id-3480474.html 在 linux下可以通过查看 cat /proc/cpuinfo查看CPU的相关信息,但是在linux下C编程需要使用汇编语言来实现,因为C语言中没有实现查看CPU信息的函数,一般实现如下: (C中运行汇编用 __asm__等) #include<stdio.h> #include<stdlib.h> static inline void get_cpuid(unsigned int i, unsigned int * buf) { unsigned int eax,ebx,ecx,edx; __asm__ ( "cpuid" :"=a"(eax),"=b"(ebx),"=c"(ecx),"=d"(edx):"a"(i)); buf[0]=eax; buf[1]=ebx; buf[2]=edx; buf[3]=ecx; } int main() { unsigned int cpu[4]; get_cpuid(0,cpu); } 需要清楚的是get_cpuid(i,buf)中i等于不同值,代表不同的含义: 0: Get vendor ID 1: Processor Info and Feature Bits, 3: Processor Serial Number 80000000h: Get Highest Extended Function Supported 80000001h: Extended Processor Info and Feature Bits 80000002h,80000003h,80000004h: Processor Brand String 具体访问http://en.wikipedia.org/wiki/CPUID
#include <stdio.h>
#include <stdint.h>
unsigned int veax;
unsigned int vebx;
unsigned int vedx;
unsigned int vecx;
void cpuid(unsigned int veax1)
{
asm("cpuid"
:"=a"(veax),
"=b"(vebx),
"=c"(vecx),
"=d"(vedx)
:"a"(veax));
}
void LM(int var,uint32_t *vx)
{
int i;
for(i=0;i<3;i++)
{
var=(var>>i);
vx[i]=var;
}
}
static void getcpuid (char *id)
{
uint32_t ax[3],cx[3],dx[3];
cpuid(1);
LM(veax,ax);
cpuid(3);
LM(vecx,cx);
LM(vedx,dx);
sprintf(id,"%u%u%u%u%u%u%u%u%u",ax[0],ax[1],ax[2],cx[0],cx[1],cx[2],dx[0],dx[1],dx[2]);
}
int main(void)
{
char cpuid[100];
getcpuid(cpuid);
printf("cpuid is %s\\n",cpuid);
return 0;
}
(责任编辑:IT) |