Tweet

ARMv6 での unaligned データアクセス

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

ARM gcc バッドノウハウ集:アラインメントも合わせて読んでくださいまし.

環境

Linux カーネル
2.6.31.6
ユーザランド
debian wheezy

プログラム

#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 プログラムです.

コンパイル

$ gcc unaligned.c

/proc/cpu/alignment

実行前の /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)

実行してみる

$ ./a.out
89674523

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

再度 /prco/cpu/alignment を見る

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

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

まとめ

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


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2012-05-03 (木) 23:17:29 (2821d)