Linux下獲取CPUID 硬碟序列號

2021-08-28 03:11:57 字數 1528 閱讀 4867

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

需要的準備知識有:

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

2.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,則為沒有提供。

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

#include #include#include #include #include #include #includestatic 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;

}

Linux下獲取CPUID 硬碟序列

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

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

在很多系統軟體的開發中,需要使用一些系統的唯一性資訊。所以,得到主機的cpuid 硬碟序列號及網絡卡的mac位址,就成個一件很重要的應用。本人經過一番google即自己的鑽研,基本上實現了這幾個功能。需要的準備知識有 gcc的嵌入彙編,具體的gcc嵌入彙編知識,請參考相關手冊 ioctl系統呼叫,具...

Linux下獲取硬碟相關資訊

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