質問:
Linux のアライメントトラップは、WEIM の (外部 FPGA への) アライメントされていないアクセスで見られました
アライメントトラップ:testFPGA(1027)PC = 0x000086dc Instr=0xe1d330b0アドレス= 0x08000001 FSR 0x011
この問題は、Sabre AI のプラットフォーム SDK EIM パラレル Nor Test で再現できます - WEIM_BASE_ADDR +1 にアクセスすると例外が発生します。
EIM テスト開始:
フラッシュサイズ:0x 2000000
フラッシュ消去...
.
おっと、データの中止が発生しました!
例外発生時のレジスタ:
cpsr = nZCvqeAift スーパーバイザー (0x60000113)
r0 = 0x00000000 r8 = 0x00000000
r1 = 0x00000000 r9 = 0x00000000
r2 = 0x00000001 r10 = 0x00000000
r3 = 0x08000001 r11 = 0x10409770
r4 = 0xdeadfeed r12 = 0x00000001
r5 = 0x10002458 sp = 0x10409734
r6 = 0x00000000 lr = 0x1000ef9c
r7 = 0x00000094 pc = 0x1000bfd0
dfsr = 0x00000001
DFAR = 0x08000001
アクセスの種類: 読み取り
障害ステータス:0x1
EIM または AXI HW のアドレス アラインド アクセスは必須ですか。それとも、アラインされていないアクセスをサポートすることは可能ですか?
答え:
EIM は、非アラインメント・アクセスをサポートする必要があります。また、ARM アーキテクチャは、MMU コプロセッサがそのために設定されている場合に限り、データ バスとアドレス バスへのアンアラインメント アクセスをサポートします。
cp15 sctlr[1] を確認してみてください。Linuxは、アライメントされていないメモリへのアクセスを推奨せず、場合によってはバスエラーが発生し、カーネルパニックが発生します。そのため、ドライバーとセットアップ アーキテクチャ ファイルは、アラインされていないメモリ アクセスをサポートする必要があります。
/linux/ドキュメンテーション/unaligned-memory-access.txt
EIM デバイスは AXI スレーブで、アンアライメント アクセスをサポートする必要があります。リファレンス マニュアルと EIM コールのサブチャプター「AXI(マスター) バス サイクル サポート」があります。この章には、AXI to Memory Burst Splits Number という表があり、アラインメントされたアドレスまたはアラインされていないアドレスへのバースト アクセスの増分が示されています。これらは EIM 用であり、AXI バスだけを指すものではないと思います。
いずれにせよ、アライメントされていないアクセスがバーストモードでのみ機能する必要があるかどうか(これは私には意味がありません)、またはRM情報が正しくないかどうかは明確ではありません。また、サポートされていない信号の同じ章では、アライメントされていない信号はリストされていないため、アライメントされていないアクセスがサポートされています。
それに関する一般的なARM情報とリンクします。
http://forums.arm.com/index.php?/topic/8862-axi-narrowunaligned-read-transfers/