アダルト・ヴァイオリン May the force be with you..

2007年5月29日

Linuxのタスクスイッチマクロ switch_to

Filed under: Weblog — @ 11:54 PM

カーネルスケジューラのキーが、switch_toというマクロである。
このマクロの中で、スタックを切り替えることで、タスクが切り替わる。

このマクロ、引数を3個取るのだが、この説明をまともにしている書籍が(先日紹介したものを含め)ない。

i386では、このマクロは次のように定義されている。
問題は、3つめのlast引数である。実は、この引数は、本来必要はないものだ。多くの解説本では、もっともらしい言い訳を創出しているが、アセンブラに対して中で呼び出す__switch_toの入出力を明示的に示すためだけにあるのである。

#define switch_to(prev,next,last) do {                                  \
unsigned long esi,edi;                                          \
asm volatile("pushfl\n\t"                                       \
"pushl %%ebp\n\t"                                  \
"movl %%esp,%0\n\t"        /* save ESP */          \
"movl %5,%%esp\n\t"        /* restore ESP */       \
"movl $1f,%1\n\t"          /* save EIP */          \
"pushl %6\n\t"             /* restore EIP */       \
"jmp __switch_to\n"                                \
"1:\t"                                             \
"popl %%ebp\n\t"                                   \
"popfl"                                            \
:"=m" (prev->thread.esp),"=m" (prev->thread.eip),  \
"=a" (last),"=S" (esi),"=D" (edi)                 \
:"m" (next->thread.esp),"m" (next->thread.eip),    \
"2" (prev), "d" (next));                          \
} while (0)

colinuxのカーネルビルド環境を作ったついでに、3つ目の引数を使わないマクロに変更し、動作させてみる。変更後のマクロを次に示す。

#define switch_to(prev,next) do {                                       \
unsigned long esi,edi;                                          \
asm volatile("pushfl\n\t"                                       \
"pushl %%ebp\n\t"                                  \
"movl %%esp,%0\n\t"        /* save ESP */          \
"movl %5,%%esp\n\t"        /* restore ESP */       \
"movl $1f,%1\n\t"          /* save EIP */          \
"pushl %6\n\t"             /* restore EIP */       \
"jmp __switch_to\n"                                \
"1:\t"                                             \
"popl %%ebp\n\t"                                   \
"popfl"                                            \
:"=m" (prev->thread.esp),"=m" (prev->thread.eip),  \
"=a" (prev),"=S" (esi),"=D" (edi)                 \
:"m" (next->thread.esp),"m" (next->thread.eip),    \
"2" (prev), "d" (next));                          \
} while (0)

当然だが、sched.cのswitch_toの呼び出しも第3引数を削る。

こうやって作ったvmlinuxは全く普通に動作することからも、第3の引数が不要であったことが確かめられる。

上の変更後マクロのポイントは、prevを入力にも出力にも利用している点だ。これによって、FASTCALLの__switch_toへの引数ならびに返り値として、EAXを利用するコードとなって、所期の目的が果たせるのだ。

少なくとも、i386系列のアーキテクチャで第3の引数がなくて困るものはないと思うのだが・・・?

2007年5月28日

デュアルブートかcoLinuxか・・それが問題だ。

Filed under: Weblog — @ 1:23 PM

私のPCはデュアルブートに設定していて、Linuxを動かすときには再起動していたのだが、最近は、Cygwinを多用するようになったおかげで、Linuxの稼働率が低くなりつつあった。

ただ、やはり、Linuxでないとできないこともまだまだあるので、久々にLinuxをブートしようとしたら、ブートできない!

ええい、この際だから、Linux側は coLinuxにしてしまえとばかりに、coLinuxをインストールした。だが、使ってみると分かるのだが、coLinuxでは、ディスクイメージをWindows側のローカルファイルとして展開するため、案外、便利ではない。(鬼門と言われるネットワーク設定はローカルのIPアドレスに気をつけてNATにすればあまり問題なかった)

どうせなら、ブートできないLinuxのパーティションにcoLinuxのファイルを展開しようと思ったが、このパーティション、GRUBが入っているので、単純に消去できない。(というのも、GRUBの構成情報はLinuxのパーティションに入れていたのだ)

coLinuxで使うなら、GRUBはいらないので、MBRを書き換えればいいやと、簡単に考えたが、WindowsXPでMBRを書き換えるのは、CDブートして、回復ツールを起動する必要があるらしい。(私のPCにはCDがついていない)

ということで、数日スタックしていたが、ふと、

TestDisk

というツールを発見。これで、MBRの書き換えができるらしい。

こいつのMBRは最初のパーティションからブートしようとするらしいので、先頭のDIAG用パーティションを削除し、TestDiskのMBRを書き込む。

えいやっ!とばかりにリブート、無事、ブートしてくれた。

これでようやく広々した領域が使えるようになるので、本格的にcoLinuxをいじってみるか・・

まずは、coLinuxではカーネルの再構成はどうするのかから探し出さないといけない。

2007年5月21日

Linuxカーネル解読室

Filed under: 読書感想 — @ 1:34 PM

久々にLinux本を購入

Linuxカーネル2.6解読室

2.6でも、マイナーバージョンごとに細かく構成が変わっているLinuxであるが、この本は2.6.15というバージョンをターゲットとしている。

カーネルメーリングリストを追いかける時間が取れなくなって久しいが、目新しいところで、LinuxのページングがAMD64アーキテクチャ向けに4段マッピングに変更されたということだ。SuSEがポーティングしたときに、3段マッピングを無理やり使って、しかも、論理空間が512GBしかないという中途半端さを嘆いたのだが、4段マッピングを標準カーネルでサポートすれば、論理空間の不自由さはなくなる。

この本、はじめから順序良くじっくりと読むのにお奨めだ。初心者向けに丁寧に書かれている印象がある。(若干、説明が微妙なところもあるが・・)

ソースを普段から扱っている人が、トピックスを拾い読みするなら、

詳解 Linuxカーネル 第3版

の方が適しているような気がする。要するに使い分ければいい。

いずれにせよ、かなり分厚い本なので、持ち運びに不便なのが問題といえば問題か(笑)

2007年5月3日

再び Joel on Software

Filed under: Weblog — @ 8:04 AM

スラッシュドットの記事で、面白そうなリンク
Java スクールの危機
を見つけたと思ったら、以前紹介した本、

の翻訳サイトだった(^^;)

再度、このリンクを読んだが、Joel on Softwareは私の感性に非常に訴えるものが多い。

あのリンクで紹介されている記事は、大学での言語教育の話だが、技術者の採用や教育に興味がある人はぜひ一読して欲しい。
(本当は、Joen on Softwareの本を買ってしっかり読んだほうが楽しめること請負いである)

Powered by WordPress