在很多系統軟體的開發中,需要使用一些系統的唯一性資訊。所以,得到主機的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));這個的實現,採用的是讀取/etc/mtab檔案,找到/(即根目錄)掛載的裝置檔案,然後開啟它,再用系統呼叫ioctl來實現的。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;
}
ioctl第二個引數為hdio_get_identity, 獲得指定檔案描述符的標誌號
ioctl的第三個引數為struct hd_driveid ,在linux/hdreg.h中,struct hd_driveid的宣告有
struct hd_driveid ;,這其中,serial_no為硬碟的序列號。如果此項為0,則為沒有提供。
思路明確了,以下為實現**:
static int通過建立乙個socket,然後bind特定的ip位址,就可以通過ioctl得到這個套按地繫結的網路介面名稱。然後再通過網路介面名稱,得到mac位址。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;
}
如果ioctl的第二個引數為siocgifname, 則獲得指定網路介面的名稱;如果ioctl的第二個引數為siocgifhwaddr,則獲得指定網路介面的mac位址
ioctl的第三個引數為struct ifreq ,在linux/if.h標頭檔案裡,struct ifreq宣告如下:
struct ifreq,其中,ifrn_name為網路介面的名稱,ifr_ifru.ifru_hwaddr為網路介面的mac位址。ifr_ifrn;
union ifr_ifru;
}
#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的源...