メモ

いたるところで呼ばれている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にするオプションらしい。