gpt4 book ai didi

c - block 设备 - 当不是 512 字节的倍数时初始化 gendisk 结构

转载 作者:太空宇宙 更新时间:2023-11-04 07:55:30 27 4
gpt4 key购买 nike

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

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

在第 16 章中写道:

sector_t capacity;

The capacity of this drive, in 512-byte sectors. The sector_t type can be 64 bits wide. Drivers should not set this field directly; instead, pass the number of sectors to set_capacity.

通常我使用这样的调用来设置容量:

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 字节内存区 ==> 66 个扇区,最后一个扇区末尾丢弃 161 字节

这些是最好的解决方案还是有另一种方法来处理这种特定情况?


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

最佳答案

  • 我应该将什么传递给 set_capacity ?
    来自 lwm.net article :

    The size value should be in 512-byte sectors, even if the hardware sector size used by your device is different.

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

  • 如何填充gendisk结构?
    确实,使用您的 block 驱动程序实现。您正在实现 block 驱动程序而不是文件系统驱动程序,文件在上层。文件系统可以实现多个文件保存在 block 之间或底层 block 设备的同一 block 中。 (像btrfs可以将小文件压缩到一个 block )

关于c - block 设备 - 当不是 512 字节的倍数时初始化 gendisk 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50396613/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com