メモ
いたるところで呼ばれているcurrentという変数が使われている。
それぞれのアーキテクチャーのcurrent.hに記述されてた。
./include/asm-i386/current.h
8 static inline struct task_struct * get_current(void) 9 { 10 return current_thread_info()->task; 11 } 12 13 #define current get_current()
でcurrent_thread_info()を調べる。
./include/asm-i386/thread_info.h
56 #ifdef CONFIG_4KSTACKS 57 #define THREAD_SIZE (4096) 58 #else 59 #define THREAD_SIZE (8192) 60 #endif 88 static inline struct thread_info *current_thread_info(void) 89 { 90 struct thread_info *ti; 91 __asm__("andl %%esp,%0; ":"=r" (ti) : "0" (~(THREAD_SIZE - 1))); 92 return ti; 93 }
インラインアセンブラの意味が分からなかったと思ったら、LKHに情報有り。
http://hira.main.jp/wiki/pukiwiki.php?current_thread_info%28%29%2Flinux2.6
スタックポインタ(espが指すアドレス)の下位13ビットを0(8191(8KB-1)をビット反転)でマスクした値がthread_infoのポインタである
うーん。。厳しい。
http://www-06.ibm.com/jp/developerworks/linux/010615/j_l-ia.html
なんかよさげなサイト見つけた。
アセンブラー・テンプレートはアセンブラー命令からなっています。入力オペランドは、命令への入力オペランドとして機能するC表現です。出力オペランドは、アセンブラー命令の出力が実行されるC表現です。
インライン・アセンブラーが重要なのは、主として、自分の出力を操作し、それをC変数に挿入できるからです。この機能のために、"asm" は、アセンブラー命令とそれを含んでいるCプログラムとの間のインターフェースとして働きます。
ふーん。
"=r"で出力オペランドで"="があることで出力であることを示している模様。。
- 追記
CONFIG_4KSTACKSはスタックのサイズを4KBにするオプションらしい。