バスのデータ幅に基づいてメモリを4バイトと8バイトに調整する必要がある理由を理解しました。しかし、次のステートメントは私を混乱させます
「IoDriveでは、O_DIRECTを使用してデバイスで実行されるすべてのI / Oが、512バイトにアラインされ、サイズが512バイトの倍数である必要があります。」
アドレスを512バイトに揃える必要は何ですか。
バスのデータ幅に基づいてメモリを4バイトと8バイトに調整する必要がある理由を理解しました。しかし、次のステートメントは私を混乱させます
「IoDriveでは、O_DIRECTを使用してデバイスで実行されるすべてのI / Oが、512バイトにアラインされ、サイズが512バイトの倍数である必要があります。」
アドレスを512バイトに揃える必要は何ですか。
大きなバッファアライメント制限について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アライメントによって最適化される主なケースは、単一セクターの転送です。
何をしているのかわからない場合は、O_DIRECTを使用しないでください。
O_DIRECTは、「デバイスへの直接アクセス」を意味します。これは、すべてのOSキャッシュをバイパスし、ディスク(または場合によってはRAIDコントローラーなど)に直接アクセスすることを意味します。ディスクアクセスはセクターごとに行われます。
編集: アライメント要件はIOオフセット/サイズです。通常、これはメモリアライメントの要件ではありません。
編集:あなたがこのページを見ているなら(それが唯一のヒットであるように見えます)、それはまたメモリがページ整列されなければならないことを言います。