操作系统如何处理不是块设备扇区大小倍数的 I/O 写入?

How does the operating system handle I/O writes, that are not a multiple of the block device's sector-size?

提问人:Marco 提问时间:9/15/2023 最后编辑:Marco BonelliMarco 更新时间:9/15/2023 访问量:55

问:

我试图理解一个数据块,它不是驱动器默认扇区大小的倍数,是如何被写下来的。 在我的理解中,操作系统只能执行多扇区大小的块设备操作,但它以某种方式设法写下更小的字节块。

假设,我想将 300Bytes 写入块设备上的 file(禁用缓冲)中,该文件的扇区大小为 512 字节。在这种情况下,从理论上讲,操作系统必须添加一些填充,以便以物理方式写入数据。我假设,这个填充将由0x00组成。

与我的假设相反,这 300 字节已经完美地写下来,没有任何明显的填充。在字节 301 处,位于先前写入的字节。这似乎是操作系统首先将块读入内存,替换受影响的字节并将新的 512bytes 块写入驱动器的特定扇区。这也意味着,不是 512 的倍数的写入需要更长的时间,并且需要在 RAM 中增加一个缓冲区...... 如果这是正确的,操作系统的哪个部分负责考虑这一点?如果我能得到一个例子(例如来自 Linux 内核)来了解发生了什么,我会很高兴。

io linux-kernel device-driver block-device

评论

0赞 stark 9/15/2023
所有写入都转到 RAM 中的块缓存。只有整个块被读取或写入磁盘。
1赞 Marco Bonelli 9/15/2023
“这似乎是,操作系统确实首先将块读取到内存中,替换受影响的字节并将新的 512bytes 块写入驱动器的特定扇区”——是的,这或多或少正是发生的事情。
0赞 Ian Abbott 9/16/2023
不过,写入通常会延迟,因此脏块在写入磁盘之前可能会再次被修改。
0赞 Marco 9/16/2023
@stark我没有使用缓冲 I/O 并禁用内核级缓存。“RAM中的块缓存”到底指的是什么?
0赞 Marco 9/16/2023
@MarcoBonelli好吧,有道理。那么究竟是哪一层负责处理这些操作呢?是文件系统本身还是特定的块设备驱动程序?

答: 暂无答案