# アライメント(128bit境界)
PlayStation 2では、そのアーキテクチャの仕様から、 128bit境界でデータを 配置する必要がある場合があります。変数宣言した場合は、コンパイラが便宜 を図ってくれるので問題は無いのですが、malloc系の関数を使って動的にメモ リを確保した場合、128bit境界に合わない場合があります。そのため、128bit 境界に合わせる必要があるデータを動的に確保する場合は、境界に合っている かをチェックして、ずれているならば合わせる処理を行わなければなりません。 COLOR(orange){bus error}が出た場合、このアライメント問題の可能性が高いです。
# だからアラインメントってなによ?
これ読んでちょ
# アライメントに気を配る必要のあるもの
本当は、マニュアルを読んだり、ライブラリを見たりして、判断する方が良い のですが、簡単な見分け方を紹介しておきましょう。 アライメントに気を配る必要があるのは、
typedef int ps2Samp0IVECTOR[4] __attribute__(aligned (16));
といった感じで、定義に COLOR(orange){ attribute( (aligned (16) ) ) }の オプションが付いているものです。 本研究室のライブラリ等を使用していれば、この問題を気にする必要は少なく なるでしょう。
# アライメントの調整方法
128bit境界に合わせつつ、メモリを動的に確保する(mallocする)プログラムの 例を、以下に示します。
/* どっかにこんな感じのベクタ型が定義されている */
typedef int ps2Samp0FVECTOR[4] __attribute__(aligned (16));
.
.
.
ps2SampOFVECTOR *align = memalign(16,sizeof(int)*4);
ここでのポイントは、以下の通り。
- COLOR(orange){6byte分多くメモリを確保して、ずらすことでアライメントを調整}
- COLOR(orange){freeするために、malloc関数から返された元々のアドレス確保しておく (ずらしたアドレスをfreeしてはいけない!) }