c linux 获取cpuid_Linux下获取CPUID、硬盘序列号与 MAC地址

本文介绍了如何在Linux系统下利用GCC的嵌入式汇编获取CPUID,通过读取系统文件和ioctl系统调用来获取硬盘序列号,以及获取MAC地址的方法。内容包括汇编调用cpuid的实现代码以及读取设备文件和使用ioctl获取硬盘标识的详细步骤。
摘要由CSDN通过智能技术生成

Linux

CPUID

、硬

序列号与

MAC

地址

在很多系

统软

件的

开发

中,需要使用一些系

的唯一性

信息。所以,得到主机的

CPUID

、硬

序列号及网卡

MAC

地址,就成个一件很重要的

用。

本人

经过

一番

google

即自己的

研,基本上

实现

几个功能。需要的准

有:

1.

GCC

的嵌入

汇编

,具体的

GCC

嵌入

汇编

参考相

手册

2.

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 

{

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;

}

取硬

序列号

个的

实现

,采用的是

/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 */

C语言可以通过使用Windows和Linux操作系统提供的相关 API 来获取本机的 CPUID 和 MAC 地址。 首先,我们可以通过Windows API函数`GetSystemInfo()`获取CPUID。示例代码如下: ```c #include <stdio.h> #include <windows.h> void main() { SYSTEM_INFO sys_info; GetSystemInfo(&sys_info); printf("CPU ID: %x %x %x %x\n", sys_info.dwProcessorType, sys_info.dwPageSize, sys_info.dwActiveProcessorMask, sys_info.dwNumberOfProcessors); } ``` 然后,我们可以通过使用Windows API函数`GetAdaptersInfo()`来获取本机的 MAC 地址。示例代码如下: ```c #include <stdio.h> #include <windows.h> #include <iphlpapi.h> #pragma comment(lib, "iphlpapi.lib") void main() { IP_ADAPTER_INFO adapter_info[16]; DWORD buf_len = sizeof(adapter_info); if (GetAdaptersInfo(adapter_info, &buf_len) == ERROR_SUCCESS) { PIP_ADAPTER_INFO curr_adapter = adapter_info; while (curr_adapter != NULL) { printf("MAC Address: %02x:%02x:%02x:%02x:%02x:%02x\n", curr_adapter->Address[0], curr_adapter->Address[1], curr_adapter->Address[2], curr_adapter->Address[3], curr_adapter->Address[4], curr_adapter->Address[5]); curr_adapter = curr_adapter->Next; } } } ``` 对于Linux操作系统,我们可以使用`sys/sysinfo.h`和`ifaddrs.h`头文件来获取 CPUID 和 MAC 地址。示例代码如下: ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/sysinfo.h> #include <ifaddrs.h> #include <netinet/in.h> #include <arpa/inet.h> #include <net/if.h> #include <string.h> void main() { struct sysinfo sys_info; if (sysinfo(&sys_info) == 0) { printf("CPU ID: %08x\n", (unsigned int)sys_info.processor_id[0]); } struct ifaddrs* ifaddr, *ifa; if (getifaddrs(&ifaddr) == 0) { for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) { if (ifa->ifa_addr == NULL || ifa->ifa_addr->sa_family != AF_PACKET) continue; struct sockaddr_ll* s = (struct sockaddr_ll*)ifa->ifa_addr; unsigned char mac[6]; memcpy(mac, s->sll_addr, 6); printf("MAC Address: %02x:%02x:%02x:%02x:%02x:%02x\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); } freeifaddrs(ifaddr); } } ``` 需要注意的是,在使用这些API函数时,可能需要添加某些特定的库文件或在编译选项中指定相关的库文件,具体需要根据不同的操作系统和编译环境来进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值