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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值