*参照元 [#i9094d9e] #backlinks *説明 [#wbc19723] -パス: [[linux-2.6.33/arch/arm/include/asm/thread_info.h]] -現在実行中のタスクの情報を返す。 -ARM アーキテクチャではスーパバイザモード専用のレジスタバンクを使用し、 モード切り替え時に自動的にレジスタバンクが切り替わるため、 このため、ユーザモード(ユーザプロセス内コード実行時)と、 スーパバイザモード(カーネル内コード実行時)のスタックは独立している。 --スイッチされるのは sp, lr レジスタのみ。他は共通。 **引数 [#p1b5e43b] -なし **返り値 [#rfb02340] -struct thread_info * --現在実行中のタスクの情報。 --[[linux-2.6.33/thread_info]] **参考 [#rd451bb3] -struct thread_info を配置する場所と、 カーネルスタックとの関連は下記を参照のこと。 --スタックポインタの現在値を、 カーネルスタックサイズ以下のビットを 0 でクリアした値を返す理由も書いてある。 --[[linux-2.6.33/current_thread_info()]] *実装 [#k7222071] /* * how to get the thread information struct from C */ static inline struct thread_info *current_thread_info(void) __attribute_const__; - --[[linux-2.6.33/inline]] - --[[linux-2.6.33/__attribute_const__]] static inline struct thread_info *current_thread_info(void) { register unsigned long sp asm ("sp"); -sp レジスタを unsigned long の変数として扱う --GCC マニュアルの "6.44.1 Defining Global Register Variables" を参照 --[[http://gcc.gnu.org/onlinedocs/gcc/Global-Reg-Vars.html#Global-Reg-Vars]] return (struct thread_info *)(sp & ~(THREAD_SIZE - 1)); -スタックポインタの現在値を、 カーネルスタックサイズ以下のビットを 0 でクリアした値を返す。 --[[linux-2.6.33/THREAD_SIZE]] } *コメント [#ne8feb47]