*参照元 [#l5f8c43a] #backlinks *説明 [#u2466fd6] -パス: 複数あり --x86 版: [[linux-2.6.33/arch/x86/include/asm/thread_info.h]] -現在実行中のタスクの情報を返す。 --タスクの情報は、はカーネルスタックの末尾 (メモリアドレスで言うとアドレス 0 に近い側)に配置されている。 スタックポインタが 0x87650987 で、 THREAD_INFO = 8192 の場合 0x00000000 ----> |----------| |**********| ====(略)==== |**********| 0x87650000 ----> |----------| <- カーネルスタックの末尾 | thread_ | | info | |----------| | | | | stack_pointer -> |----------| <- カーネルスタックは↑に成長する | 使用中 | | カーネル | | スタック | | 領域 | | | 0x87651fff ----> |----------| <- カーネルスタックの先頭 |**********| ====(略)==== |**********| 0xffffffff ----> |----------| **引数 [#x29a746d] -なし **返り値 [#xb52e2b6] -struct thread_info * --現在実行中のタスクの情報。 --[[linux-2.6.33/thread_info]] **参考 [#g6f70a2d] *実装 [#t256669e] /* how to get the thread information struct from C */ static inline struct thread_info *current_thread_info(void) { return (struct thread_info *) (current_stack_pointer & ~(THREAD_SIZE - 1)); -例えば THREAD_SIZE が 8192(= 2 ^ 13)だとすると、 THREAD_SIZE : 8192 = 0000 0000 0000 0000 0010 0000 0000 0000 THREAD_SIZE - 1 : 8191 = 0000 0000 0000 0000 0001 1111 1111 1111 ~(THREAD_SIZE - 1): = 1111 1111 1111 1111 1110 0000 0000 0000 -下位 13ビットを全て 0 にする、 つまりカーネルスタックの末尾のアドレスを計算し、 thread_info のポインタにキャストして返す。 --スタックは 0 に向かう方向に成長するので、 thread_info はカーネルスタックの末尾にある。 -現在のカーネルスタックのポインタを返す。 --[[linux-2.6.33/current_stack_pointer(global)]] -カーネルスタックのサイズを表す。 --[[linux-2.6.33/THREAD_SIZE]] } *コメント [#la21204d]