UNIX v6クイズ合戦

不意に始まった神々の戯れ(UNIX v6クイズ合戦)。 楽しかったので記録しておきます。 みなさんもUNIX v6クイズ合戦に参加して知識を深め合いましょう!
6
takahiro(John Smith) @superhoge

クイズ。v6でプロセスがSIDL状態になるのはどこでしょう?また、SIDL状態になることの目的は何でしょう?

2012-07-20 13:12:36
濱マゴロク @magoroku15

プロセスの複製を行うnewprocは、複製する子のメモリの獲得に失敗した場合、親の空間を共有した状態でswapoutを行い、子プロセスの空間をDISKに複製する。複製中に親のメモリが変化すると正しく複製されないため、複製中は親をスケジュールの対象から外す。この状態をSIDLと呼ぶ

2012-07-20 16:55:56
濱マゴロク @magoroku15

この話、Bell研の技術誌がUNIXの特集をやったときの論文で紹介されてます。「DISK IO はDMAなのでCPUサイクルを使わない。このためforkではDISK IOを積極的に使った」←たしかこんな感じ。訳書も出ててた「UNIX原典」http://t.co/fSYKP1vd

2012-07-20 17:01:40
濱マゴロク @magoroku15

クイズ v6のinodeにあるISVTXとは何か?

2012-07-20 17:09:13
takahiro(John Smith) @superhoge

@magoroku15 すみません、ツイート見落としてました。正解です!SSLEEP, SWAITだと実行対象からは外れるんですが、スワップアウトの対象にはなっちゃうんですよね。

2012-07-20 22:42:39
takahiro(John Smith) @superhoge

@magoroku15 Sticky bitですね。テキストセグメントに対応するinodeに立ち得るフラグで、そのテキストセグメントを参照するプロセスがいなくなってもスワップ領域に残る。シェルなど再度実行される可能性が高いプログラムの再読み込みを省略できる。

2012-07-20 23:01:29
濱マゴロク @magoroku15

あたりです @superhoge Sticky bitですね。テキストセグメントに対応するinodeに立ち得るフラグで、そのテキストセグメントを参照するプロセスがいなくなってもスワップ領域に残る。シェルなど再度実行される可能性が高いプログラムの再読み込みを省略できる。

2012-07-20 23:02:28
takahiro(John Smith) @superhoge

具体的にはxfree( )でスワップ領域から"解放しない"処理が書かれている。text[ ]のエントリとスワップ領域のデータが残っているので、再実行したときはxalloc( )で単にprocからそのtext[ ]を指すだけで完了。

2012-07-20 23:05:24
takahiro(John Smith) @superhoge

ちなみにsticky bitの用途はOSによって異なるので注意

2012-07-20 23:09:33
濱マゴロク @magoroku15

クイズ。v6でユーザプロセスは常に0番地から実行されるが、exec後の0番地には407/410/411の何れかがロードモジュールの形式を示すマジックナンバーが置かれている。何故0番地からの実行が可能なのか?

2012-07-20 23:09:56
takahiro(John Smith) @superhoge

407/410/411が8進数であることに気づけないと難易度激増

2012-07-20 23:15:51
濱マゴロク @magoroku15

風呂で明日の問題考えてくるわw

2012-07-20 23:18:06
takahiro(John Smith) @superhoge

はっきり言ってカーネルだけ読んでも答えられない激ムズ問題w

2012-07-20 23:19:23
濱マゴロク @magoroku15

ヒント 4.xBSDでは真のマジックナンバとなり、代わりにa.outにentry pointが追加された。 http://t.co/ggB5sTdy

2012-07-20 23:31:20
takahiro(John Smith) @superhoge

マジックナンバーがxx(伏字)命令で、飛ぶ先がxxxxx(伏字)の先頭になるということまでは理解しているのだけれど、全体像を少し見失っているので調べ中。

2012-07-20 23:35:19
takahiro(John Smith) @superhoge

@magoroku15 例えば0407ならば2(PCのインクリメント)+14でPCは16(020)となる。020はプログラム(命令列)の開始ポイント。

2012-07-20 23:45:10
takahiro(John Smith) @superhoge

…ん、execの後のユーザプロセスの0番地ってa.outの020番地(マジックナンバを含むヘッダの後。textの先頭)が来るような。あれ、なんか混乱してきた。

2012-07-20 23:55:28
takahiro(John Smith) @superhoge

あ、さっきの回答なしで。

2012-07-21 00:04:24
濱マゴロク @magoroku15

むずかしいの考えておきますw @superhoge

2012-07-21 00:12:06
takahiro(John Smith) @superhoge

@magoroku15 execシステムコールの後、ユーザプロセスの0番地にはマジックナンバではなく、プログラム(text)の先頭が来ませんか?xalloc( )を見ると、a.outの先頭から020(ヘッダ分)オフセットを足して読み込んでいると思うのですが。

2012-07-21 00:14:23
濱マゴロク @magoroku15

あーっ間違えた。bootの話だった。@superhoge

2012-07-21 00:16:45
残りを読む(85)

コメント

コメントがまだありません。感想を最初に伝えてみませんか?