Tweet

ARM Thumb 命令セット

ARM の Thumb 命令セットの特徴をざっくり書くと

  • 1 命令が 16 bit
  • できることは ARM 命令セットのサブセット
  • 使えるレジスタは r0 〜 r7 の 8 つ
  • 2 オペランド命令

といったところかな.

プログラムサイズが小さくなる

命令長が短いことから,高密度のコードを生成できることが期待されるのだけれど,命令長が短いがために 1 命令あたりでできることは少なくなります. ARM 社の説明によると,それでもトータルで 30% 程度コード量が小さくなるそうです.

実行速度は遅くなる

Thumb 命令は CPU 内部では ARM 命令に展開されて実行されるそうです. 1 命令でできることは ARM 命令よりも少ないので,プログラムの速度は ARM 命令よりも遅くなります.

ということで

ARM Linux 上で Thumb 命令はどれだけ使えるのか,というあたりをつついていこうかと思ってます. どこまで突っ込んで見れるかはわからないけど.

(追記)

そういえば,Thumb-2 命令セット,なんてのもあるけど,今回はこっちの話は無し. だって実行環境持ってないんだもん.

ARM Thumb 命令セット 文献

ざっくりと挙げておきます.

ARM Architecture Reference Manual

ARM 社が出している ARMv5 アーキテクチャのリファレンスマニュアルです.

改訂 ARMプロセッサ―32ビットRISCのシステム・アーキテクチャ (Design Wave BOOKS)

いきなり英語はつらい方は,こちらで予習してから臨んだほうがよいでしょう.

大学の講義を前提にして書かれた本のようで,「ARM を例に CPU アーキテクチャの勉強をする」というスタンスで書かれています. 「そんなのはもう知ってるから,オレは ARM アーキテクチャについて知りたいんだ」という場合には正直うざいところがあります.

gcc のマニュアル

わざわざ web で読まなくても,環境によっては info コマンドで読める場合があります.

ARM Thumb 命令セット 状態遷移

もう少し復習めいた話が続きます.

32bit ARM 命令のモードと Thumb 命令のモード間の遷移は下図のようになります.

ARM          --(BX)-->               Thumb
            <--(BX)--
      <--(interrupt/exception)--

BX 命令でブランチすることにより,プログラム中で明示的に命令モードを変更することができます. 暗黙の遷移として,割り込みや例外などが発生した場合,Thumb モードから強制的に ARM モードへと切り替わります. この「割り込み」には「ソフトウェア割り込み」も含まれます. つまり,Linux 上でのシステムコールでもこの遷移が発生することになります.

ARM Thumb 命令セット Linux カーネル

Thumb 命令セットの Linux カーネル側の対応について.

Linux カーネル自身が Thumb コードでコンパイルされるわけではなく,Thumb ユーザプログラムが動くようにするための話です.

menuconfig 設定項目

CONFIG_ARM_THUMB という項目があります.

この項目の help を見ると

         Say Y if you want to include kernel support for running user space
         Thumb binaries.

         The Thumb instruction set is a compressed form of the standard ARM
         instruction set resulting in smaller binaries at the expense of
         slightly less efficient code.

         If you don't know what this all is, saying Y is a safe choice.

とあります.

実際のコード

CONFIG_ARM_THUMB で grep かけてみると,このマクロの影響する部分はちょろちょろとあります. 例えば linux/arch/arm/kernel/entry-armv.S の中です.

#ifdef CONFIG_ARM_THUMB
        bx      \reg
#else
        mov     pc, \reg
#endif

カーネルモードからユーザモードにジャンプするコードです. (マクロ定義の中なので,レジスタ名の部分が \reg になっちゃってます) bx 命令は Thumb 命令セットを持つ CPU でしか使えないので,こういうことになってるのでしょう. カーネル空間では ARM 命令セットで動作しているのでユーザ空間に戻るときはモードを元に戻す必要があり,ここで bx 命令が使われるわけです.


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-11-07 (土) 17:01:42 (3735d)