1

这本书 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() 有什么误解吗?

4

1 回答 1

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于更好的性能。

于 2013-01-08T13:57:45.877 回答