Io _uuubread()是否总是返回页面大小字节数?

Io _uuubread()是否总是返回页面大小字节数?,io,linux-kernel,Io,Linux Kernel,Linux内核API有一个_面包方法: __bread(struct block_device *bdev, sector_t block, unsigned size) 它返回一个缓冲区头指针,其数据字段包含大小值的数据。但是,我注意到,读取超过大小字节的数据仍然为我提供了有效的数据,最大为页宽的字节数。这让我想知道,即使传递给它的SIZE参数较小,我是否可以假定*\u bread*返回的缓冲区\u head始终包含与页面大小字节相同的有效数据 或者这只是巧合。面包从给定的块接口执行读取IO

Linux内核API有一个_面包方法:

__bread(struct block_device *bdev, sector_t block, unsigned size)
它返回一个缓冲区头指针,其数据字段包含大小值的数据。但是,我注意到,读取超过大小字节的数据仍然为我提供了有效的数据,最大为页宽的字节数。这让我想知道,即使传递给它的SIZE参数较小,我是否可以假定*\u bread*返回的缓冲区\u head始终包含与页面大小字节相同的有效数据


或者这只是巧合。

面包从给定的块接口执行读取IO,但根据备份存储,您会得到不同的结果

对于硬盘驱动器,块设备将获取扇区大小的数据。通常为512字节或4K。如果512字节,而您要求256字节,则可以访问扇区的最后部分。因此,您可以获取扇区大小。然而,这并不总是正确的。对于内存备份设备,您只能访问256字节,因为它不是由块层提供的,而是由VSL提供的


简而言之,不应该。您不应该依赖此功能,因为它取决于支持存储的块设备,并且也可能随着块层实现而改变。

我认为,答案是否定的:如果您读取的文件包含的字节数小于页面大小怎么办?我是从扇区大小为512字节、“群集”大小为4k的FAT32磁盘读取的。虽然我通过u面包请求了512字节,但我得到了4k的有效数据。因此,对于硬盘驱动器,可能它返回的数据块大小(与扇区大小相反)值?当然,上限是页面大小,在我的系统上是4k。关于以扇区大小的块从磁盘获取数据,您是对的。在从512字节和4k扇区大小的磁盘读取数据时,通过检查'bh->b_size'成员的值来验证这一点。