Linux下獲取CPUID 硬碟序列號與MAC位址

2021-08-24 21:13:16 字數 2721 閱讀 7600

在很多系統軟體的開發中,需要使用一些系統的唯一性資訊。所以,得到主機的cpuid、硬碟序列號及網絡卡的mac位址,就成個一件很重要的應用。

本人經過一番google即自己的鑽研,基本上實現了這幾個功能。需要的準備知識有:

gcc的嵌入彙編,具體的gcc嵌入彙編知識,請參考相關手冊

ioctl系統呼叫,具體的呼叫方法,請檢視手冊頁

按照網上提供的說明,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)

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 ;

,這其中,serial_no為硬碟的序列號。如果此項為0,則為沒有提供。

思路明確了,以下為實現**:

static int

getdiskid (char *id, size_t max)

fd = -1;

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

root = strtok (null, " ");

if (root == null)

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

fd = open (disk, o_rdonly);

break;}}

fclose (fp);

if (fd < 0)

if (ioctl (fd, hdio_get_identity, &hid) < 0)

close (fd);

snprintf (id, max, "%s", hid.serial_no);

fprintf (stdout, "get hard disk serial number: %s/n", id);

return 0;

}

通過建立乙個socket,然後bind特定的ip位址,就可以通過ioctl得到這個套按地繫結的網路介面名稱。然後再通過網路介面名稱,得到mac位址。

如果ioctl的第二個引數為siocgifname, 則獲得指定網路介面的名稱;如果ioctl的第二個引數為siocgifhwaddr,則獲得指定網路介面的mac位址

ioctl的第三個引數為struct ifreq ,在linux/if.h標頭檔案裡,struct ifreq宣告如下:

struct ifreq

ifr_ifrn;

union ifr_ifru;

}

,其中,ifrn_name為網路介面的名稱,ifr_ifru.ifru_hwaddr為網路介面的mac位址。
#ifndef max_ifindex

# define max_ifindex 8

#endif

static int

getmacaddr (const char *ip, char *id, size_t max)

for (i = 0; i <= max_ifindex; ++ i)

if (ioctl (sockfd, siocgifaddr, req) < 0)

loc = (struct sockaddr_in *) (&(req->ifr_ifru.ifru_addr));

if (loc->sin_addr.s_addr == inet_addr (ip))

}if (i > max_ifindex)

if (ioctl (sockfd, siocgifhwaddr, req) < 0)

close (sockfd);

snprintf (id, max, "%02x%02x%02x%02x%02x%02x",

req->ifr_hwaddr.sa_data[0] & 0xff,

req->ifr_hwaddr.sa_data[1] & 0xff,

req->ifr_hwaddr.sa_data[2] & 0xff,

req->ifr_hwaddr.sa_data[3] & 0xff,

req->ifr_hwaddr.sa_data[4] & 0xff,

req->ifr_hwaddr.sa_data[5] & 0xff);

fprintf (stdout, "mac address of %s: [%s]./n", req->ifr_name, id);

return 0;

}

Linux下獲取CPUID 硬碟序列

linux下獲取cpuid 硬碟序列號與mac位址 woonjoon 按照網上提供的說明,cpuid並不是所有的intel cpu都支援的。如果支援,彙編呼叫為 eax置0000 0003,呼叫cpuid。以下為實現 在我的cpu上,並沒有得到 define cpuid in,a,b,c,d asm...

Linux下獲取CPUID 硬碟序列號

在很多系統軟體的開發中,需要使用一些系統的唯一性資訊。所以,得到主機的cpuid 硬碟序列號及網絡卡的mac位址,就成個一件很重要的應用。需要的準備知識有 1.gcc的嵌入彙編,具體的gcc嵌入彙編知識,請參考相關手冊 2.ioctl系統呼叫,具體的呼叫方法,請檢視手冊頁 按照網上提供的說明,cpu...

Linux下獲取硬碟相關資訊

熟悉linux的都知道,linux下硬碟的命名規則是had hdb sda sdb之類的。但是,如何才能知道機器上到底有多少塊硬碟呢?剛開始,我以為 dev目錄下會有所體現結果我發現裝置檔案存在並不代表這個裝置。那麼怎麼辦才好呢。後來我發現fdisk可以得到硬碟的數量。於是就閱讀了一下fdisk的源...