Tweet


* ARMv5 での unaligned データアクセス [#e5531dfa]

ARM11 の SoC が載ったマシンを借りることができたので,debian を乗っけてサクっと試してみた.

[http://jr0bak.homelinux.net/~imai/linux/arm_gcc_badknowhow/arm_gcc_badknowhow-4.html ARM gcc バッドノウハウ集:アラインメント]も合わせて読んでくださいまし.

** 環境 [#qc3df7f3]
:Linux カーネル|2.6.31.6
:ユーザランド|debian wheezy

** プログラム [#p30055c7]

 #include <stdio.h>
 
 main ( void )
 {
         char *str = "\x01\x23\x45\x67\x89\xab\xcd\xef";
         unsigned *u = (unsigned *)(str + 1);
 
         printf ( "%08x\n", *u );
 }

上記ページにもある,4バイト境界をまたぐ4バイトアクセスを行う C プログラムです.

** コンパイル [#r059fdcf]

 $ gcc unaligned.c

** /proc/cpu/alignment [#gc24f045]

実行前の /proc/cpu/alignment.
unaligned access を修正しない設定とした.

 $ cat /proc/cpu/alignment 
 User:		0
 System:		0
 Skipped:	0
 Half:		0
 Word:		0
 DWord:		0
 Multi:		0
 User faults:	0 (ignored)

** 実行してみる [#lf0465b1]
 $ ./a.out
 89674523

事前に聞いていたとおり,x86 と同じ挙動であり,ARMv5 のようにバイト単位で回るような挙動は無い.

** 再度 /prco/cpu/alignment を見る [#n61ef17b]
 $ cat /proc/cpu/alignment 
 User:		0
 System:		0
 Skipped:	0
 Half:		0
 Word:		0
 DWord:		0
 Multi:		0
 User faults:	0 (ignored)

unaligned access の例外は捕捉されていない.

** まとめ [#j59cfba8]
ARMv6 機では,従来の ARM 機とは異なり unaligned データアクセスに対応しており,例外も発生しない.
もちろん,バス上でのメモリアクセスでのペナルティは有り得るので,アラインメントを整えたデータ構造にすべきではある.
が,データアラインメントの制限が無いため,従来の ARM 上よりもプログラムの移植が楽になるのではないかと思われる.



トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS