在很多系统软件的开发中,需要使用一些系统硬件信息。比如CPU、硬盘、网卡等。所以,得到主机的CPUID、硬盘序列号及网卡的MAC地址,就成为一件很重要的功能。
命令获得
要实现这些信息,标准的Linux系统之中,有很多现成的命令,或者说工具,可以直接使用。
比如,要取得网卡的信息,可以使用
ifconfig
或者
ip a
命令。
取得CPU的信息,可以查看/proc/cpuinfo。或者通过/dev/cpu/[id]/cpuid文件取得cpuid。
要取得硬盘的序列号,可以使用lsblk命令。
如要取得/dev/nvme1n1硬盘的序列号,可以执行命令:
lsblk --nodeps -no serial /dev/nvme1n1
。另外,还可以通过tune2fs命令来获得文件系统的信息,比如创建时间。
比如,执行
tune2fs -l /dev/sda1
就可以看到系统的创建时间、最后挂载时间、最后写入时间等。
C/C++语言取得
如何要在C/C++语言中获得,当然可以直接在语言中调用这些命令,但是也可以使用一些更底层的函数来实现。
需要用到的准备知识有:
- GCC的嵌入汇编。具体的GCC嵌入汇编知识,请参考相关手册。
- ioctl系统调用。具体的调用方法,请查看手册页
获取CPUID
按照网上提供的说明,CPUID并不是所有的Intel CPU都支持的。如果支持,汇编调用为:eax置0000,再0003,调用cpuid。
以下为实现代码:
int
getcpuid (char *id, size_t max)
{
unsigned long maxi, eax, 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, "%08lx %08lx %08lx %08lx", eax, ebx, ecx, edx);
fprintf (stdout, "get cpu id: %s\n", id);
return 0;
}