アラインメント要件のハードウェア重要性
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/09/19 14:58 UTC 版)
「データ構造アライメント」の記事における「アラインメント要件のハードウェア重要性」の解説
アライメントの問題は、ハードウェアアドレス変換メカニズム(PCIリマッピング、MMUで実施)によるその領域の効率的なマッピングが目的である場合、C構造体よりもはるかに大きな領域に影響を与える可能性がある。 例えば、32ビットオペレーティングシステムでは、4 KBページは、任意の4 KBのデータチャンクだけではない。通常は、4 KB境界にアラインされたメモリ領域である。これは、ページをページサイズの境界にアラインすると、複雑な算術演算ではなくアドレスの上位ビットを置換することで、ハードウェアが物理アドレスに仮想アドレスをマップできるためである。 例: 物理アドレス0x12345000に仮想アドレス0x2cfc7000のTLBマッピングがあるとする(これらのアドレスは両方とも4 KB境界でアラインされている)。仮想アドレスva = 0x2cfc7abcにあるデータにアクセスすると、0x2cfc7〜0x12345のTLB分解能で、pa = 0x12345abcへの物理アクセスが行われる。ここで、20/12ビットの分割は幸いなことに、5/3桁の16進表現の分割に一致する。ハードウェアは、物理アドレス(0x12345)の最初の20ビットと仮想アドレス(0xabc)の最後の12ビットを単純に組み合わせることによって、この変換を実装できる。これは、仮想インデックス(abc)物理的タグ付け(12345)とも呼ばれる。 サイズ 2^(n+1)-1 のデータのブロックは、常に 2^n バイトにアラインされたサイズ 2^n の1つのサブブロックを有する。 以下は、アライメントの知識のない動的アロケータを使用して、スペースロスの2倍を犠牲にして、アラインしたバッファを提供する方法である。 Example: get a 12-bit aligned 4 KBytes buffer with malloc()// unaligned pointer to large areavoid *up=malloc((1<<13)-1);// well-aligned pointer to 4 KBytesvoid *ap=aligntonext(up,12);where aligntonext() is meant as:move p to the right until next well-aligned address ifnot correct already. A possible implementation is// PSEUDOCODE assumes uint32_t p,bits; for readability// --- not typesafe, not side-effect safe#define alignto(p,bits) (p>>bits<<bits)#define aligntonext(p,bits) alignto((p+(1<<bits)-1),bits)
※この「アラインメント要件のハードウェア重要性」の解説は、「データ構造アライメント」の解説の一部です。
「アラインメント要件のハードウェア重要性」を含む「データ構造アライメント」の記事については、「データ構造アライメント」の概要を参照ください。
- アラインメント要件のハードウェア重要性のページへのリンク