1.2.3. コードの移植と非境界整列アクセスの検出

他のアーキテクチャ(x86 CISCなど)用の従来の C コードでは、ARM プロセッサでは動作しないポインタを使用して、非境界整列データへのアクセスを実行する場合があります。これは移植性のないコードであるため、このようなアクセスは特定し、境界整列データを前提とする RISC アーキテクチャ上で動作するように修正する必要があります。

非境界整列アドレスへのロード操作およびストア操作を使用すると誤った動作が発生するため、非境界整列アクセスを特定するのは困難な場合があります。また、C ソースのどの部分が問題の原因であるかを追跡することも困難です。

メモリ管理ユニット(MMU)を搭載した ARM プロセッサ(ARM926™ など)では、オプションでアライメントをチェックする機能がサポートされており、アクセスが発生するたびに、そのアクセスが境界整列されているかどうかをプロセッサがチェックします。正しく境界整列されていないアクセスが行われると、MMU によってデータアボートが生成されます。

ARM7TDMI® などのシンプルなコアの場合は、Application Specific Integrated Circuit(ASIC)またはApplication Specific Standard Product(ASSP)内にアライメントをチェックする機能を実装することをお勧めします。これを行うには、ARM コアの外部に、すべてのデータアクセスのアクセスサイズとアドレスバスの最下位ビットを監視するハードウェアブロックを追加します。ASIC/ASSP は、非境界整列アクセスが発生した場合に ABORT 信号を生成するように設定できます。ARM Limited では、他のアーキテクチャのコードを移植する ASIC/ASSP デバイスには、このようなロジックを含めることをお勧めします。

非境界整列アクセスをアボートするようにシステムが設定されている場合は、データアボート例外ハンドラをインストールする必要があります。境界整列アクセスが行われると、データアボートハンドラが起動され、(r14-8)で示される異常なデータアクセス命令を特定できます。

このようなアクセスを特定したら、C コードのソースを変更して、そのデータアクセスを修正する必要があります。この変更は、以下のコードを使用して条件付きにすることができます。

#ifdef __arm
  #define  PACKED  __packed
#else
  #define  PACKED
#endif
...
  PACKED int *pi;
...

非境界整列データへのアクセスは、コードサイズとパフォーマンスのオーバーヘッドを増加させるため、最小限に抑えることをお勧めします。

詳細については、RealView Compilation Tools v3.0 Compiler and Libraries Guideで、コード生成の制御に関するセクションの --pointer_alignment および --min_array_alignment オプションの説明を参照して下さい。

Copyright © 2002-2006 ARM Limited. All rights reserved.ARM DUI 0203GJ
Non-Confidential