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:04:42 (4002d)