通過proc檔案系統獲得,在proc檔案系統中有一個名為partitions的檔案。這個檔案中包含本地磁碟的硬碟及分區信 息。根據Linux下裝置命名規則,如果裝置名稱的最後一個字元是數字就應該是分區,否則就是硬碟。 根據這個檔案,還可以知道硬碟裝置名稱以及每個硬碟中分區的數量和每個分區的裝置名稱。
擷取硬碟扇區大小資訊:
/* get size in bytes */
int
blkdev_get_size(int fd, unsigned long long *bytes)
{
unsigned long size;
int ver = get_linux_version();
/* kernels 2.4.15-2.4.17, had a broken BLKGETSIZE64 */
if (ver >= KERNEL_VERSION (2,6,0) ||
(ver >= KERNEL_VERSION (2,4,18) && ver < KERNEL_VERSION (2,5,0))) {
if (ioctl(fd, BLKGETSIZE64, bytes) >= 0)
return 0;
}
if (ioctl(fd, BLKGETSIZE, &size) >= 0) {
*bytes = ((unsigned long long)size << 9);
return 0;
}
return -1;
}
根據ATA8-ACS文檔規範,我們的作業系統都會有一個ATA IDENTIFY DEVICE的資料結構來說明一個磁碟裝置的,無論linux還是windows都會有一個,在這裡我以linux為例說明,windows也一樣可用API擷取。
在linux下:
unsigned short word106 = 0;
struct hd_driveid id;
int fd = open(diskname, O_RDONLY);
ioctl(fd, HDIO_GET_IDENTITY, &id);
word106 = id.words104_125[2];
擷取這個結構的第106個字(注意是字,不是位元組)。而這個字就定義了磁碟扇區的大小,我們來看下這個字是怎麼定義扇區大小的。
bit 15 固定為0。
bit 14 固定為1。
bit 13 如果為1就說明一個邏輯扇區有多個物理扇區組成。
bit 12 如果為1就說明裝置被格式化成一個邏輯扇區的大小超過256個字。
bit 11-4 為保留。
bit 3-0 如果bit 13為1的話,這三個位元位就用來表示邏輯扇區的大小。
我們重點看下這前4個位元位是怎麼表示扇區大小的。我用個公式來表示,sector_size = 2^x * 物理扇區大小(即512b)。
即是說邏輯扇區大小是2的x次方個物理扇區的大小,即是:扇區大小 = 2^x * 512。x就是這個字的前4位的值。
舉個例來說,如果是個大扇區,扇區大小為4K即是4096個位元組,那麼在這個字中的表示為:
bit 13 = 1
bit 3-0 = 0011
位元0011 = 十進位數3,那麼2的三次方為8,那麼扇區大小是8*512,即4096 bytes。