自分が読書会に参加する前に終わっており自分で本を読まないといけないと思いつつ中々時間がとれずにいましたが、やっと読むことができました。

swtch()から返る先~ 3.3の最後まで、の範囲です。

細部には色々疑問も残りますが、スタックの使い方は概ね納得できました。他の箇所の勉強がある程度進んだら、また読み直してみたいと思います。

5/12(日)に「はじめてのOSコードリーディング」読書会の4回目がありました。

今回は第4章スワッピングを読みました。またしても予定がぶつかってしまい途中退席しなければならなかったのは残念ですが、参考になる意見を色々聞けて良かったです。

なぜテキストセグメントを新規に作成する時に、データセグメントに作成してスワップアウトして後からスケジューラがスワップインする際にテキストセグメントを仮想アドレス0に割り当てるという複雑な方法をとっているのか疑問でしたが、readi()は仮想アドレスを使いmalloc()は物理アドレスを使うからではないかとのことでした。正しいのか今は判断できないので今後理解が進んでから改めて考えてみたいと思います。

また実行プログラムヘッダのマジックナンバーが0407のプログラムはテキストとデータをまとめてプロセスのデータ領域に読み込むということは以前出てきましたが、なぜ0407が必要なのかピンと来ていませんでした。本日の話の中でsched()の32行目でrp->p_textpがNULLかどうか判定しているのは0407か0410か判定しているのと同じことであり、0407では命令列を後で書き換えることがありうるのでROのテキストではなくRWのデータに読み込むとのことで納得しました。

少しずつですが分かる箇所が増えてきているので、分からない箇所を記録に残し、後日読み直した時に分かるようになっていればいいなと思います。

5/11(土)にV6セミナーの4回目がありました。

仮想記憶の実装としては、V6,V7が第1世代、V32,4.3bsdが第2世代、4.4bsd以降が第3世代。

4.3bsdはコードとしてはV6とネーミングの共通点があるので追いやすいが、カーネル空間とユーザー空間が常駐型になっているところが大きく異なる。常駐型になればユーザー空間からカーネル空間のメモリを参照するのに特殊命令を使わずに済むので効率的。32bitCPUになりコンピュータに積まれるメモリ量が大きくなったことが常駐型が採用された背景の1つ。

スワッピングとページングは別物。スワッピングはプロセス全体をメモリから追い出したり読み込んだりするがページングはページ単位。

ページングをするには最近使われていないページを知る必要がある。ハードでサポートされているのが望ましいがVAXではサポートされておらずソフトで実現するため実装が複雑化している。

4.3bsdのコードを追いかけるところは良く分からなかったので後から資料を読み直してみましたがやはり良くわからなかったです。(^_^;)

でも仮想記憶の実現法がどのように変化してきたかが理解できて参考になりました。