这本书ldd说的函数blk_queue_segment_boundary()是这样的:
某些设备无法处理跨特定大小的请求 记忆界限;如果您的设备是其中之一,请使用此功能 告诉内核关于那个边界。例如,如果您的设备 对于跨越4 MB边界的请求有困难,传入掩码 0x3fffff默认掩码是0xffffffff。
我不太明白这里的边界意味着什么,例如,我有一个虚拟块设备,它实际上是4MB文件,所以我想要一个不超过4MB边界的请求,
unsigned long sector = blk_rq_pos(req);
unsigned long offset = sector << 9;
unsigned long nbytes = blk_rq_bytes(req);
int file_offset = offset % (1 << 22);
我想要的是(file_offset + nbytes)不超过4M,但有时它超过4M, 那么,对blk_queue_segment_boundary()有什么误解吗?
答案 0 :(得分:1)
某些控制器(特别是IDE)无法处理跨越4MB内存区域的DMA请求。将其视为段:索引寻址,其中索引不能大于设置边界。
还有blk_queue_max_segment_size
。两者都用于构造对设备的正确请求 - 请求被重新排序和合并。
还有其他用途。例如,来自xen-blkfront.c
:
/* Each segment in a request is up to an aligned page in size. */
blk_queue_segment_boundary(rq, PAGE_SIZE - 1);
blk_queue_max_segment_size(rq, PAGE_SIZE);
请求仅限PAGE_SIZE
以获得更好的效果。