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 に答える