> Linux教程 > linux基础 >

linux c 获取cpu序列号

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)