歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux下獲取存儲介質扇區大小

Linux下獲取存儲介質扇區大小

日期:2017/2/28 14:45:30   编辑:Linux教程

通過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。

Copyright © Linux教程網 All Rights Reserved