Memory 在块设备上检查未对齐的I/O

Memory 在块设备上检查未对齐的I/O,memory,linux-kernel,driver,linux-device-driver,kernel-module,Memory,Linux Kernel,Driver,Linux Device Driver,Kernel Module,我一直在玩Linux内核中的块层,并制作了一个模块来覆盖任何块设备的make_request_fn。我想记录make_request_fn I覆盖的块设备上未对齐的I/o请求(如果有)的数量和大小。我的问题是关于对齐和未对齐的i/o,我知道块层中的许多函数,甚至编译器都试图通过使用各种方法来避免未对齐的i/o 链接()中的引号显示了一种检查未对齐磁盘访问的方法,如下所示: “当您尝试读取N字节的数据时,会发生未对齐的内存访问 来自一个不能被N整除的地址(即addr%N!=0)。 例如,从地址0x

我一直在玩Linux内核中的块层,并制作了一个模块来覆盖任何块设备的make_request_fn。我想记录make_request_fn I覆盖的块设备上未对齐的I/o请求(如果有)的数量和大小。我的问题是关于对齐和未对齐的i/o,我知道块层中的许多函数,甚至编译器都试图通过使用各种方法来避免未对齐的i/o

链接()中的引号显示了一种检查未对齐磁盘访问的方法,如下所示:

“当您尝试读取N字节的数据时,会发生未对齐的内存访问 来自一个不能被N整除的地址(即addr%N!=0)。 例如,从地址0x10004读取4字节的数据是可以的,但是 从地址0x10005读取4字节的数据将是未对齐的内存 进入。”

<>但这并不考虑任何逻辑、物理块大小,甚至不考虑底层设备可能存在的对齐偏移。为i/o生成bio时是否考虑了这些因素?或者是否调整了扇区号以适应此问题


对不起,这是一个新手问题,我对这一切都不熟悉。

阻塞IO本质上就是阻塞。意味着您将始终根据硬件块大小及其地址访问块。因为它应该对齐。@0安德烈,谢谢你的回复,但我还是有点困惑。如果扇区读/写不是从物理块边界开始,或者其大小不等于物理块大小,则任何扇区读/写都是未对齐的。这意味着任何发布的struct bio都必须将其扇区置于物理块边界,并且其大小等于物理块大小。这是否正确?驱动程序正在使用块访问读取整个扇区,即使您从4k物理扇区中请求字节[35623],缓存它,VFS层也会向用户返回其中的一段日期。@0andriy,感谢您的快速回复。我转储了每个struct bio持有的所有扇区号,它们都是8的倍数,问题大小为整个物理块。这很有帮助。谢谢。积木IO天生就是积木。意味着您将始终根据硬件块大小及其地址访问块。因为它应该对齐。@0安德烈,谢谢你的回复,但我还是有点困惑。如果扇区读/写不是从物理块边界开始,或者其大小不等于物理块大小,则任何扇区读/写都是未对齐的。这意味着任何发布的struct bio都必须将其扇区置于物理块边界,并且其大小等于物理块大小。这是否正确?驱动程序正在使用块访问读取整个扇区,即使您从4k物理扇区中请求字节[35623],缓存它,VFS层也会向用户返回其中的一段日期。@0andriy,感谢您的快速回复。我转储了每个struct bio持有的所有扇区号,它们都是8的倍数,问题大小为整个物理块。这很有帮助。谢谢