Tweet


* ARM Thumb 命令セット Linux カーネル [#r2209008]

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

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

** menuconfig 設定項目 [#q9e38350]

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.

とあります.

** 実際のコード [#o5355405]

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