我目前正在使用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
结构? 更新:
继续这个例子,让我们取整个设备存储器(33631字节),即65字节的512字节+ 1扇区的351字节。
所以解决方案是将它呈现为:
或
这些是最好的解决方案还是有另一种方法来处理这个具体案例?
答案 0 :(得分:2)
What should I pass to set_capacity ?
即使设备使用的硬件扇区大小不同,大小值也应为512字节扇区。
通过你有3个扇区,因此与内核兼容并忽略最后一个扇区 或者通过你有4个512的扇区,在写入的最后一个扇区丢弃464到512的字节,并在读取时填充零。确保使用您的驱动程序的所有驱动程序都知道,最后一个扇区较小并且可以对其进行操作。
How should I fill the gendisk structure ?