linux内核读取u盘扇区,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。

推荐阅读:

0b1331709591d260c1c78e86d0c51c18.png

你可能感兴趣的:(linux内核读取u盘扇区)