快速业务通道

Linux下获取CPUID、硬盘序列号与MAC地址

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-26

  在很多系统软件的开发中,需要使用一些系统的唯一性信息.,得到主机的CPUID、硬盘序列号及网卡的MAC地址,就成个一件很重要的应用.

  本人经过一番google即自己的钻研,基本上实现了这几个功能.需要的准备知识有:

  GCC的嵌入汇编,具体的GCC嵌入汇编知识,请参考相关手册

  ioctl系统调用,具体的调用方法,请查看手册页

  获取CPUID

  按照网上提供的说明,CPUID并不是所有的Intel CPU都支持的.如果支持,汇编调用为:eax置0000_0003,调用cpuid.

  以下为实现代码(在我的CPU上,并没有得到):

  #define cpuid(in,a,b,c,d) asm("cpuid": "=a" (a), "=b" (b), "=c" (c), "=d" (d) : "a" (in));

  static int

  getcpuid (char *id, size_t max)

  {

  int i;

  unsigned long li, maxi, maxei, ebx, ecx, edx, unused;

  cpuid (0, maxi, unused, unused, unused);

  maxi &= 0xffff;

  if (maxi < 3)

  {

  return -1;

  }

  cpuid (3, eax, ebx, ecx, edx);

  snprintf (id, max, "lx lx lx lx", eax, ebx, ecx, edx);

  fprintf (stdout, "get cpu id: %sn", id);

  return 0;

  }

  获取硬盘序列号

  这个的实现,采用的是读取/etc/mtab文件,找到/(即根目录)挂载的设备文件,然后打开它,再用系统调用ioctl来实现的.

  ioctl第二个参数为HDIO_GET_IDENTITY, 获得指定文件描述符的标志号

  ioctl的第三个参数为struct hd_driveid ,在linux/hdreg.h中,struct hd_driveid的声明有

  struct hd_driveid {

  unsigned short config; / lots of obsolete bit flags */

  unsigned short cyls; /* Obsolete, "physical" cyls */

  unsigned short reserved2; /* reserved (word 2) */

  unsigned short heads; /* Obsolete, "physical" heads */

  unsigned short track_bytes; /* unformatted bytes per track */

  unsigned short sector_bytes; /* unformatted bytes per sector */

  unsigned short sectors; /* Obsolete, "physical" sectors per track */

  unsigned short vendor0; /* vendor unique */

  unsigned short vendor1; /* vendor unique */

  unsigned short vendor2; /* Retired vendor unique */

  unsigned char serial_no[20]; /* 0 = not_specified */

  unsigned short buf_type; /* Retired */

  unsigned short buf_size; /* Retired, 512 byte increments

  * 0 = not_specified

  */

  ……

  };

  ,这其中,serial_no为硬盘的序列号.如果此项为0,则为没有提供.

  思路明确了,以下为实现代码:

  static int

  getdiskid (char *id, size_t max)

  {

  int fd;

  struct hd_driveid hid;

  FILE *fp;

  char line[0x100], *disk, *root, *p;

  fp = fopen ("/etc/mtab", "r");

  if (fp == NULL)

  {

  fprintf (stderr, "No /etc/mtab file.n");

  return -1;

  }

  fd = -1;

  while (fgets (line, sizeof line, fp) != NULL)

  {

  disk = strtok (line, " ");

  if (disk == NULL)

  {

  continue;

  }

  root = strtok (NULL, " ");

  if (root == NULL)

  {

  continue;

  }

  if (strcmp (root, "/") == 0)

  {

  for (p = disk strlen (disk) - 1; isdigit (*p); p --)

  {

  *p = '''';

  }

  fd = open (disk, O_RDONLY);

  break;

  }

  }

  fclose (fp);

  if (fd < 0)

  {

  fprintf (s

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号