win128 の謎 (SunView ドライバーを外す)

-- X11R6.3, X11R6.4 を使っているなら、こうした方が得 --


現在、SunOS4.1.4 を使う人のほとんどは X11 をインストールしていて、SunView は使用していないと思われます。 X11 がカーネル非依存な作りになっているのに対し、SunView では、カーネルに SunView 専用のドライバーを持つ構造になっています。
追記

下記の _mem_rop などの未解決シンボルについてですが、これらはどうやら SunView の pixrect 関係のもので、cgsix.o に組み込まれているものの SunView を使わなければ使用されないように思えてきました。

そこで、下記では conf/files を修正し、mem_rop.o 等を link することで解決したのですが、そうではなく、_mem_rop 等のシンボルを、単なるダミースタブに置き換えてみることにしました。

具体的には、conf/files を元に戻し、_mem_rop, _mem_putattributes, _mem_ops を定義した適当な C ソースを書き、 config のあと、作成された Makefile にそのソースを追加し、後は普通に kernel make します。

こうすると、mem_rop.o 等のオブジェクトも外れるため、vmunix はさらに小さくきれいになります。

この状態で、X11R6.3 が問題なく動きました。
さらに、X11R6.4 も無事動きました。


SunView のドライバーは、/usr/kvm/sys/`arch -k`/conf 以下のコンフィグファイルに、

  pseudo-device  win128
  pseudo-device  dtop4

のように記述されています。(sun4m では win256 かもしれません)

このオプションが指定されていると、vmunix にはかなりの数の SunView 関係のドライバーがリンクされます。

これらは、X11 を使う限り、全く不要です。 これらのドライバーは外した方がシステムが軽くきれいになります。

では、この2行を単純に # でコメントアウトしてカーネルを make してみましょう。
(あと、options WINSVJ もコメントアウトの必要があります)
すると、make の最後付近の ld で、

loading vmunix
ld: Undefined symbol
   _mem_rop
   _mem_putattributes
   _mem_ops

というエラーが出て、make に失敗するでしょう。

これを解決する方法がわかりました。

修正するファイルは /usr/kvm/sys/`arch -k`/conf/files です。このファイルには、カーネルのコンフィグファイルで、『どの option が指定されるとどのソースとリンクするか』ということが書かれています。 問題は、このファイルの先頭付近にある、

  pixrect/../mem/mem_colormap.c   optional win device-driver
  pixrect/../mem/mem_kern.c       optional win device-driver
  pixrect/../mem/mem_rop.c        optional win device-driver
  pixrect/../pr/pr_clip.c         optional win device-driver

の4行です。これらの、mem_colormap.c (実際には OBJ/mem_colormap.o, カーネルのソースコードは持っていないため) 等の4つのファイルは、cgsix 等を使う場合に必要です。しかし、optional win device-driver と書かれているため、カーネルのコンフィグオプションから win128 をコメントアウトすると、files のこれらのファイルまで外されてしまうのです。

そこで、この win を cgsix に書き換えます。つまり、

  pixrect/../mem/mem_colormap.c optional cgsix device-driver
  pixrect/../mem/mem_kern.c     optional cgsix device-driver
  pixrect/../mem/mem_rop.c      optional cgsix device-driver
  pixrect/../pr/pr_clip.c       optional cgsix device-driver

とします。すると、カーネルのコンフィグオプションで cgsix を有効にしている限り、これらの4つのファイルが無事リンクされます。 このように files を修正してから、再度 /usr/etc/config を実行し、あとは通常通りカーネルを make すれば、エラーなく SunView のドライバーの外れた vmunix ができます。もちろん、こうしてできた新しい vmunix 上で、X11R6.3 が問題なく動作しています。

おそらく、Sun では cgsix とかを使う場合は SunView のドライバーを必ず使うという前提で、/usr/kvm/sys/`arch -k`/conf/files を記述したのでしょう。


しかし、考えてみれば SunView もコンパクトによくできたシステムだったのかも知れません。私も昔、Sun3 時代に SunView を使っていました。

今、インストールメディアの SunView_Users のカテゴリーを見てみると、そのサイズはたったの 2.7MByte(*1) です。・・これは font を含んでいないのだな ・・と思ったら、ちゃんとフォントも含めてこのサイズなのです。

X11 だと、コア部分だけでも数十MByte になるので、SunView をあらためて見ると驚きます。 あと、(本質に関係ありませんが)SunView では、全体にデザインが上品な感じがしました。例えば、SunView の clock を見なれたあとで、X11 の xclock を見た時、そのデザインがなんとなく無骨に感じました。

(*1) これは non-JLE の場合のサイズ。JLE では 約5.4MByte。ちなみに、JLE のインストレーション紙マニュアルでは、non-JLE の英文マニュアルを直訳したせいか、SunView_Users, SunView_Programmers のサイズの記述が間違っていて non-JLE 版のサイズが書かれている。

To 謎の処理系 SunOS 4.1.4 Home
yamamori