4

バスのデータ幅に基づいてメモリを4バイトと8バイトに調整する必要がある理由を理解しました。しかし、次のステートメントは私を混乱させます

「IoDriveでは、O_DIRECTを使用してデバイスで実行されるすべてのI / Oが、512バイトにアラインされ、サイズが512バイトの倍数である必要があります。」

アドレスを512バイトに揃える必要は何ですか。

4

3 に答える 3

5

大きなバッファアライメント制限についてDMAを非難する包括的なステートメントは間違っています。

PCIバスは一度に32ビットまたは64ビットを物理的に転送できるため、ハードウェアDMA転送は通常4バイトまたは8バイトの境界で調整されます。この基本的な調整に加えて、ハードウェアDMA転送は、提供された任意のアドレスで機能するように設計されています。

ただし、ハードウェアは物理アドレスを処理し、OSは仮想メモリアドレス(x86 CPUのプロテクトモード構造)を処理します。これは、プロセススペース内の連続したバッファが物理RAM内で連続していない可能性があることを意味します。物理的に隣接するバッファを作成するように注意しない限り、DMA転送はVMページの境界(通常は4K、場合によっては2M)で分割する必要があります。

ディスクセクターサイズに合わせる必要のあるバッファに関しては、これは完全に真実ではありません。DMAハードウェアは、ハードドライブの物理セクターサイズを完全に認識していません。

Linux 2.4ではO_DIRECTに4Kアライメントが必要でしたが、2.6では512Bに緩和されました。いずれの場合も、単一セクターの更新がVMページの境界を超えないようにするため、分割DMA転送が必要になるのはおそらく設計上の決定でした。(任意の512Bバッファーには、4Kページを通過する可能性が1/4あります)。

したがって、ハードウェアではなくOSのせいですが、ページ整列バッファがより効率的である理由がわかります。

編集:もちろん、とにかく大きなバッファー(100KB)を書き込んでいる場合、交差するVMページの境界の数は、512Bに調整したかどうかに関係なく実質的に同じになります。したがって、512Bアライメントによって最適化される主なケースは、単一セクターの転送です。

于 2010-12-16T20:08:56.003 に答える
4

通常、このような大規模なアライメント要件は、基盤となるDMAハードウェアが原因です。大規模なブロック転送は、ここにあるものよりもはるかに強力な配置制限を要求することにより、はるかに高速になる場合があります。

いくつかのARMプロセッサでは、第1レベルの変換テーブルを16KBの境界に揃える必要があります。

于 2010-08-12T17:02:35.277 に答える
0

何をしているのかわからない場合は、O_DIRECTを使用しないでください。

O_DIRECTは、「デバイスへの直接アクセス」を意味します。これは、すべてのOSキャッシュをバイパスし、ディスク(または場合によってはRAIDコントローラーなど)に直接アクセスすることを意味します。ディスクアクセスはセクターごとに行われます。

編集: アライメント要件はIOオフセット/サイズです。通常、これはメモリアライメントの要件ではありません。

編集:あなたがこのページを見ているなら(それが唯一のヒットであるように見えます)、それはまたメモリがページ整列されなければならないことを言います。

于 2010-08-12T17:11:52.397 に答える