块设备 - 当不是512字节的多个

时间:2018-05-17 16:43:55

标签: c linux-kernel linux-device-driver block-device sector

我目前正在使用Linux Device Drivers - 3rd学习内核驱动程序编程。

要定义块设备,我必须声明一个gendisk结构并使用相关信息对其进行初始化。

在第16章中写道:

  

sector_t capacity;

     

此驱动器的容量,512字节扇区。 sector_t类型可以是64位宽。司机不应直接设置此字段;   相反,将扇区数传递给set_capacity。

Usualy我使用如下调用来设置容量:

set_capacity(gendisk, sector_number*(hard_sector_size/KERNEL_SECTOR_SIZE));

想象一下,我的设备的内存区域不是512字节的倍数。

我们需要2000个字节,因此有三个512字节区域和一个464字节区域

[-512b-]      [-512b-]      [-512b-]      [-464b-]
0     511    512    1023   1024   1535   1536   1999
  • 我应该将哪些内容传递给set_capacity

此外,在某些设备上,内存被分成几个区域。想象一下,我有一个包含多个内存区域的设备,每个区域都有不同的大小,我想将这个分割的内存抽象到一个内存区域。

area1 => 32000字节
area2 => 512字节
area3 => 50个字节
area4 => 45字节
area5 => 1024字节

在这种情况下,硬扇区大小在设备中不是常数。

  • 我应该如何填写gendisk结构?
@kamilCuk回答后

更新:

继续这个例子,让我们取整个设备存储器(33631字节),即65字节的512字节+ 1扇区的351字节。

所以解决方案是将它呈现为:

  • 33270字节内存区==> 65个部门

  • 33631字节记忆区==>在最后一个扇区末尾丢弃了161个字节的66个扇区

这些是最好的解决方案还是有另一种方法来处理这个具体案例?

  • 基本上问题可以恢复为当块设备不是KERNEL_SECTOR_SIZE的倍数时如何初始化它?

1 个答案:

答案 0 :(得分:2)

  • What should I pass to set_capacity ?
    来自lwm.net article
      

    即使设备使用的硬件扇区大小不同,大小值也应为512字节扇区。

通过你有3个扇区,因此与内核兼容并忽略最后一个扇区 或者通过你有4个512的扇区,在写入的最后一个扇区丢弃464到512的字节,并在读取时填充零。确保使用您的驱动程序的所有驱动程序都知道,最后一个扇区较小并且可以对其进行操作。

  • How should I fill the gendisk structure ?
    要实现,请使用块驱动程序实现。您正在实现块驱动程序而不是文件系统驱动程序,文件位于较高级别。文件系统可以实现在块之间或底层块设备的同一块中保存的多个文件。 (比如btrfs可以将小文件压缩到一个块)