Lions'Commentary - oraccha/omicron GitHub Wiki

正確には Lions' Commentary on UNIX という Unix ハッカー伝説の書.

  • 私も不法コピーしました.. あれは'94のことですね。まあ最後の世代でしょう.. でも最初の部分しか読んでないな(^^;

  • おぉ,ちょっぴり歴史の生き証人って感じですね. 本当に正式版が出回る直前まで不正コピーされていたんですね.

  • [http://www.lemis.com/grog/Documentation/Lions/index.html Commentary on the Sixth Edition UNIX Operating System]

正式出版 & 日本語版も出版されて誰でも手に入るようになった.

なんか研究室で読み会するみたいなので,気がついたことを書いて行こうかなと 思うけど,どうなるかわからない.

  • どこかの研究室でも読み会してるって聞いたな。コード量はちょうどいいんだけど、Cの表記が古い(K&Rよりも)のが、読み会に使うのをためらわせてしまう...
    • 型の扱いがずいぶん違うので,悩ましい.構造体メンバの名前空間がフラットだったり,int* に暗黙キャストしまくったりね.
  • Dennis Ritchie 氏のページにこの古〜いCコンパイラの話が書いてありますよ. コードもあるし.
    • [http://www.cs.bell-labs.com/who/dmr/primevalC.html Very early C compilers and language]
    • [http://www.slashdot.org/articles/99/07/31/0622237.shtml Ritchie Releases Early Compilers] (Slashdot.org 1999-07-31)
  • V6 のころはまだ S.C.Johnson 氏の Portable C Compiler にもなってないんですよね.V7 は PortableC になってるみたいだけど.それ以前のコンパイラは Interdata のとかって記述があるな.
    • [http://studenti.ing.unipi.it/doc/7thEdManVol2/porttour/porttour.html A Tour Through the Portable C Compiler] (←は Not Found なので[http://plan9.bell-labs.com/7thEdMan/ ここ]の troff ファイルを参照して)

SCO のおかげでソースコードを読むことができます. ダウンロードは次のURLから.

  • [http://www.sco.com/offers/ancient.html SCO Ancient Unix]
  • [http://www.tom-yam.or.jp/2238/changenotes.html UNIX CHANGES (Differences between Bell UNIX & Standard Ver. 6) compiled by Mike O'Brien] ([http://www.tom-yam.or.jp/2238/unix_changes.txt diff])

Lions'Commentary にはあるのに,姿が見えないソースコード.

次の二つは mkconf の実行により自動生成される.

  • low.s (l.s)
  • conf.c (c.c)

Thu May 24 13:12:34 JST 2001 . そもそも,PDP-11のアーキテクチャをある程度わかってないときついな.

  • アドレス空間が 16bit なので,プログラム全体が 64k に収まっている必要があった.PDP-11 の後期モデルでは命令空間(I空間)とデータ空間(D空間)に独立した 16bit のアドレス空間が用意されるようになった.

    • 一つのプログラムのインスタンスを複数動かすときには,I空間を一つとD空間をインスタンス分用意すればよくなったので,メモリ消費も押えることができるようになった.
  • PDP-11ってマイクロプログラミング可能だったと思うんだけど、Unixとはどういう関係になっていたのでしょうかね。--- Hayakawa

  • 少なくともこの本には書いてありませんけど,どうなんでしょうね. どっかに記述ないかな?

最初に基礎知識として,x86 (Linuxの場合)と PDP-11 における関数呼出しを比較してみよう.

で,本日の本題.

2001-11-25 . で,その続きは...(^^;)


2003-06-12 . メモリ管理

セグメンテーション

  • 仮想アドレス空間は 64KB で,1ページは 8KB.8ページで1セグメント.
  • ユーザモード,カーネルモード用にそれぞれセグメンテーションレジスタが存在し,個別のセグメントを持つことができる.
    • カーネル空間セグメント(KISA) . ページ 0〜5 は物理メモリ最下位のページにストレートマッピングされ,ページ 7 は物理メモリの最上位のページにマッピングされる.
      • 0〜5 システムセグメント: カーネルのテキスト,データ領域
      • 6 ユーザセグメント: カレントプロセスの u 領域,カーネルスタック
      • 7 I/O セグメント: 特殊デバイスレジスタ
    • ユーザ空間セグメント(UISA)
  • 1セグメントはページアドレスレジスタ(PAR)とページディスクリプションレジスタ(PDR)であらわされる.
    • ページは 64B のブロック 128 個の集合であり,ブロック境界で使用部分,未使用部分にページを二つに分割できる.未使用部分に物理メモリを割り当てる必要はない.
    • PAR と PDR 一組で1ページの制御を行なう.

物理メモリ管理

  • malloc/mfree
  • 二つのリソースマップ
    • coremap
    • swapmap

プロセス

  • 0: アイドルタスクとしてだけではなく,スケジューラ用のコンテキストでもある.
    • コンテキストスイッチ(swtch)ではプロセス0のコンテキストで動くけど,スケジューラ(sched)は各プロセスのカーネルコンテキストで動いてるような.
    • sched は Linux のようにディスパッチ先を決定するのではなく,スワップイン/アウトを制御している.
    • swtch は主に sleep すると呼ばれる.
  • 1: init プロセス.

2238 クラブへの第一歩としては fork,コンテキストスイッチ,プロセススワップあたりを理解していく必要がある.

  • fork(newproc) のどこで親子プロセスが分裂するのか.
    • fork にしろ,PThread 型(?)にしろ,カーネルコードを読むとまず引っかかるところ.一度理解してしまえばどうってことないが.普通,コンテキストスイッチは手続き呼出しの延長なので,OS 作ろうと思ったら,まずはコンパイラが吐くコードをじっくり眺めろってことだな.
    • プロセススワッピングは結局 Linux では実装されなかったが,まぁ考え方自体は難しいものじゃない.
  • コルーチンジャンプ . savu は r5(フレームポインタ),r6(スタックポインタ) を引数であたえられたアドレスに保存する.
    • savu/retu の組
      • u.u_asav[2]
    • savu/aretu の組
      • u.u_qsav[2] シグナル
      • u.u_ssav[2] スワップ
  • プロセス生成に十分なメモリが足りないときに fork するとどうなるか.
    • カレントプロセスをスワップアウトして空間を確保するんだけど,あまりいい戦略と言えない気がするけど.
  • Linux/プロセス管理

プロセススワッピング

  • まず newproc,expand で savu(u.u_ssav) により r5,r6 が保存される.swtch でスィッチ対象のプロセスがスワップアウトされているなら,aretu(u.u_ssav) で中断されていた newproc または expand へ復帰する.なお swtch ではメモリ上に存在しないプロセスにはスイッチしないので,例えば expand でスワップアウトされたプロセスが,直後の swtch で再度プロセススイッチされることはない.SLOAD と SSWAP フラグの使い方に注意.スワップインは sched から呼び出される swap で行われる.
  • Unix で CopyOnWrite が実装されるのはもっとずっと後の話なのでデータやスタックの共有はしないが,テキストはリファレンスカウントを使ってプロセス間で共有されている.
  • スワップ関連のフラグ
    • u 領域
      • ULOAD
      • ULOCK
      • USWAP
    • グローバル変数
      • runin
      • runout
      • runrun
  • swap と xswap の関係

ディスク

  • なんでサイズ指定が負値なんだろう?

    • RK ではサイズ指定(RKWC レジスタ)は2の補数で行なうと書いてある.
  • RH コントローラのソースコードは Commentary には収録されてないみたいだけど.

  • ブロックデバイスとキャラクタデバイス(デバイススイッチ)

spl

  • spl4 と spl5 が同じなのはなぜ?

{{{ PSW 15 14 13 12 11 07 06 05 04 03 02 01 00 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | CMD | PMD |GR| | PL |TT| N| Z| O| C| +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

CMD: 現モード(00=カーネル,11=ユーザ) PMD: 前モード GR: 汎用レジスタセット PL: 優先度レベル(0〜7) TT: Trace trap N|Z|O|C: フラグ

PAR 15 0 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | PAGE ADDRESS FIELD (PAF) | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

PDR 15 14 08 07 06 05 04 03 02 01 00 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ |BC| PAGE LENGTH FIELD | 0| W| 0| 0|ED| ACF | 0| +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

ACF: 未割当て,リードオンリ,リードライト ED: ページの拡張方向 W: ダーティビット PLF: ブロック数-1 }}}


Errata??

  • 441
  • s/u_ssize/u_'''t'''size/
  • 1755
  • s/UlSD->r[16]/U'''I'''SD->r[16]/
  • 1847
  • s/P==NULL/'''p'''==NULL/
  • 1902
  • s/a2 = NULL/a2 ='''=''' NULL/
  • 2122
  • s/p_uchan/p_'''w'''chan/
  • p.322表中
  • s/t+16/'''d'''+16/
  • s/t+144/'''d'''+144/
  • p.332-l.11
  • s/2284行でu.u_rsavに格納された値が2281行でu.u_ssavに格納された値と/ . 2284行でu.u_'''s'''savに格納された値が2281行でu.u_'''r'''savに格納された値と/
  • p.345-l.10
  • s/jar/jsr/
    • jar 命令なんてあったっけ?

関連する話題

  • [http://www.salon.com/tech/feature/1999/11/30/lions/ CodeCritic] (Salon.com 1999-11-30) . 著者の John Lions 氏について.
  • [http://cm.bell-labs.com/cm/cs/who/dmr/odd.html Odd Comments and Strange Doings in Unix] . ''/* You are not expected to understand this */'' というコメントにまつわる話など.
    • V7 ではポータブルにこの部分が書き直されたので,このコメントもなくなっちゃったのね.
  • [http://www.tom-yam.or.jp/2238/ 2238クラブ] または私は如何にして心配するのを止めてUNIXカーネルを愛するようになったか
    • 参考になりそう.
  • [http://fukumori.org/diary/?category=PDP-11%A5%B7%A5%DF%A5%E5%A5%EC%A1%BC%A5%BF%A4%C7%B8%C5%C2%E5%A4%CEUNIX%A4%F2%C6%B0%A4%AB%A4%B7%A4%C6%A4%DF%A4%EB PDP-11シミュレータで古代のUNIXを動かしてみる] (やさぐれ日記)
  • http://www.ba-stuttgart.de/~helbig/os/