- 追加された行はこの色です。
- 削除された行はこの色です。
* 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 命令が使われるわけです.
カーネル空間では ARM 命令セットで動作しているのでユーザ空間に戻るときはモードを元に戻す必要があり,ここで bx 命令が使われるわけです.