【问题标题】:LBA starting address alignment from struct request来自结构请求的 LBA 起始地址对齐
【发布时间】:2023-03-10 18:29:01
【问题描述】:

我目前正在做块驱动程序。我在测试期间注意到,如果 我的平台是 RHEL6.x/CentOS6.x 我的结构请求开始了 LBA/sector 总是与 8 对齐(例如 0、8、0x10、0x100、0x2508 等) 这实际上是我设计的驱动程序和固件的最佳选择。看来 结构请求总是在那里对齐。

另一方面,如果我在一些旧系统(如 Oracle 5.6)上测试我的驱动程序, 结构请求的起始 LBA 似乎没有对齐 8 - 大多数情况下 LBA 被偏移(例如 0x2507、300f、0x95bd500f、 等等)

我的阻止队列设置,甚至从 sysfs 中查看都表明我的 逻辑块大小和物理块大小分别为 512 和 512, 分别。所以我认为它与4kB无关 部门。触发这种行为的设置可能是什么?是 有一个请求队列或 gendisk 设置来控制这个我可以 不知道吗?还是这取决于 FS 层?希望有人 可以指出来。

谢谢!

【问题讨论】:

  • “所以我认为这与 4kB 扇区无关” -- 为什么不呢?你听说过“前向兼容性”吗?或者当扇区大小为 4K 字节时,512 B/扇区仿真的最佳性能如何?阅读seagate.com/tech-insights/…
  • 好吧,我假设是因为我的 sysfs 条目读取了逻辑块和物理块的 512 字节,而没有提及 4kb。其他条目如alignment_offset、minimum_io_size 和optimal_io_size 分别为0、512、0。您建议的任何方式都值得调查,我如何验证前向兼容性在我的新系统中是否有效?所以我将在我的旧系统(如 oel 5.6)中实现它。

标签: linux linux-kernel linux-device-driver


【解决方案1】:

这几乎可以肯定是因为您的分区在新系统上与 8 块边界对齐,但在旧系统上却没有(您可以使用sfdisk 详细检查分区表)。

读取将以文件系统块大小为单位,它将是系统页面大小的倍数(在最常见的体系结构上为 4kB)。因此,如果您的文件系统从块设备的开头偏移了非 8 的倍数,则所有读取也将从 8 的倍数偏移该数量。

【讨论】:

  • 我检查了您的建议,但使用 fdisk。我主要在分区时使用“fdisk /dev/”,这就是我对旧系统(OEL5.6)和新系统所做的。生成的分区,当转换为扇区时,旧系统和新系统都提到我的分区 1 从扇区/LBA 63 开始。这是否意味着无论哪种方式,我的分区已经不对齐了 8 个块?
  • 是的。这在旧版本的 fdisk 中很常见,但新版本应默认在 LBA 2048 处启动第一个分区。
  • 谢谢。我已经验证,如果我将分区的开头与 4kB c/o fdisk 对齐,我不会在文件访问期间获得非 4kB 对齐的 LBA。
猜你喜欢
  • 2016-01-09
  • 1970-01-01
  • 2021-11-14
  • 2013-01-23
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
  • 2018-06-08
  • 1970-01-01
相关资源
最近更新 更多