2026/03/01

【続】TangConsoleDCJ11MEMへの2.11BSDのインストール ~デバイスの追加~

警告  

 インストール手順に複数の誤りが見つかったため、新しい文書を準備中です。この文書の手順は実行しないでください。(3月11日追記)

改定版の文書を作成しました。こちらを参照してください。(3月15日追記)

前回はルートファイルシステムだけインストールしましたが、「デバイスを足せばフルインストールできるのでは」と思い立ち、磁気テープドライブ TM11 (TU10)と大容量ハードディスクドライブRP11 (RP03)を追加してみました。

2.11BSDのRP03ドライバ

配布されたソースツリーでは組み込めるようになっていませんが、RP03のドライバ(rp.c)は/usr/src/sys/OTHERS/rp03/の下にあります。ここにあるrp.cとrpreg.hを/usr/src/sys/pdpuba/に移動して後述のパッチを適用することで動作するようになります。

パッチを適用する前にファイルを移動するのを忘れないようにしてください。 

TM11のドライバの組み込み

こちらはドライバ自身は無改造で組み込めますが、カーネル起動時に初期化されないため、autoconfigを動かすか、静的に初期化関数を呼び出すかする必要があります。

メモリが足りない状態ではautoconfigを動かせる気がしなかったので、上記のRP03のドライバと合わせて静的に初期化関数を呼び出すことにしました。

デバイスを追加するためのパッチ

パッチはこちらです。 デバイスを追加するパッチ

変更量を少なくするために、デバイス番号などは既存のデバイスドライバ(br.c)が使用しているものを乗っ取っています(邪悪)。

なお、ドライバの初期化関数を静的に呼び出している部分を見ると魂が汚れるので、見ないふりをすることをお勧めします。 

用意するもの

前回と同様ですが、追加でfile6.tarのみを書き込んだmicroSDカードが必要です。これはテープデバイスのエミュレーションの1ファイル32MBの制限を回避するためのものです。 

インストール手順

まずは前回の手順に従ってシングルユーザモードで起動できるようにします。ただし、ソースコードのパッチは今回のものも追加で適用します。新しいカーネルで起動してください。

以後の作業はシングルユーザモードで行います。デバイスファイルを作成するだけでも分のオーダーの時間がかかるので、気長に待ちましょう。

なお、引数"br[012]"でデバイスを作成していますが、生成されるデバイスファイル名は"rp*"となります。MAKEDEVはこういう実装になっていますので混乱しないようにしてください。 

 @773010g
73Boot from rk(0,0,0) at 0177404
: rk(0,0)unix
Boot: bootdev=03000 bootcsr=0177404

2.11 BSD UNIX #46: Sat Feb 28 15:50:06 PST 2026
    root@curly.2bsd.com:/usr/src/sys/SMALL


phys mem  = 253952
avail mem = 64832
user mem  = 307200

February 28 03:27:10 init: configure system

autoconfig: couldn't find symbols in /unix.
February 28 03:27:11 init: configuration setup error

erase, kill ^U, intr ^C
# stty erase ^H crt
# cd /dev
# rm -f *rk* *mt* *rp*
# ./MAKEDEV rk0 tm0 br0 br1 br2
# ls -l rk0* *mt0 rp*
brw-rw-rw-  1 root       1,   0 Feb 28 03:28 mt0
brw-rw-rw-  1 root       1,   4 Feb 28 03:28 nmt0
crw-rw-rw-  1 root       7,   4 Feb 28 03:28 nrmt0
brw-r-----  1 root       6,   0 Feb 28 03:28 rk0h
crw-rw-rw-  1 root       7,   0 Feb 28 03:28 rmt0
brw-r-----  1 root      11,   0 Feb 28 03:29 rp0a
brw-r-----  1 root      11,   1 Feb 28 03:29 rp0b
brw-r-----  1 root      11,   2 Feb 28 03:29 rp0c
brw-r-----  1 root      11,   3 Feb 28 03:29 rp0d
brw-r-----  1 root      11,   4 Feb 28 03:29 rp0e
brw-r-----  1 root      11,   5 Feb 28 03:29 rp0f
brw-r-----  1 root      11,   6 Feb 28 03:29 rp0g
brw-r-----  1 root      11,   7 Feb 28 03:29 rp0h
brw-r-----  1 root      11,   8 Feb 28 03:29 rp1a
brw-r-----  1 root      11,   9 Feb 28 03:29 rp1b
brw-r-----  1 root      11,  10 Feb 28 03:29 rp1c
brw-r-----  1 root      11,  11 Feb 28 03:29 rp1d
brw-r-----  1 root      11,  12 Feb 28 03:29 rp1e
brw-r-----  1 root      11,  13 Feb 28 03:29 rp1f
brw-r-----  1 root      11,  14 Feb 28 03:29 rp1g
brw-r-----  1 root      11,  15 Feb 28 03:29 rp1h
brw-r-----  1 root      11,  16 Feb 28 03:30 rp2a
brw-r-----  1 root      11,  17 Feb 28 03:30 rp2b
brw-r-----  1 root      11,  18 Feb 28 03:30 rp2c
brw-r-----  1 root      11,  19 Feb 28 03:30 rp2d
brw-r-----  1 root      11,  20 Feb 28 03:30 rp2e
brw-r-----  1 root      11,  21 Feb 28 03:30 rp2f
brw-r-----  1 root      11,  22 Feb 28 03:30 rp2g
brw-r-----  1 root      11,  23 Feb 28 03:30 rp2h
# cd /
# mkfs -s 80000 /dev/rp0h
isize = 20000
m/n = 2 100
# mkfs -s 80000 /dev/rp1h
isize = 20000
m/n = 2 100
# mkfs -s 10400 /dev/rp2a
isize = 2592
m/n = 2 100
# mkfs -s 64400 /dev/rp2c
isize = 16096
m/n = 2 100
# mount /dev/rp0h /usr
# mkdir /usr/src
# mount /dev/rp1h /usr/src
# mkdir /usr/src/ucb
# mkdir /usr/src/sys
# mount /dev/rp2a /usr/src/ucb
# mount /dev/rp2c /usr/src/sys
# df
Filesystem  1K-blocks     Used    Avail Capacity  Mounted on
root             3022     2855      167    94%    /
/dev/rp0h       78748        5    78743     0%    /usr
/dev/rp1h       78748        4    78744     0%    /usr/src
/dev/rp2a       10236        2    10234     0%    /usr/src/ucb
/dev/rp2c       63392        2    63390     0%    /usr/src/sys

# TAPE=/dev/nrmt0; export TAPE
# mt rew
# mt fsf 7
# cd /usr/src
# tar xv
x sys/pdpuba/tmscp.c, 55882 bytes, 110 tape blocks
x sys/pdpuba/rl.c, 18839 bytes, 37 tape blocks
x sys/pdpuba/tags symbolic link to ../sys/tags

(snip)

x include/varargs.h, 219 bytes, 1 tape blocks
x include/vfont.h, 546 bytes, 2 tape blocks
x include/Makefile, 2959 bytes, 6 tape blocks
# mt rew
# mt fsf 8
# tar xv
x Makefile, 3536 bytes, 7 tape blocks
x asm.sed, 53 bytes, 1 tape blocks
x asm.sed.pdp, 53 bytes, 1 tape blocks

(snip)

x usr.sbin/ntp/patchl, 5658 bytes, 12 tape blocks
x usr.sbin/ntp/read_local.c, 655 bytes, 2 tape blocks
x usr.sbin/Makefile, 777 bytes, 2 tape blocks

ここでmicroSDカードをfile6.tarのみ書き込んだものに交換する

# mt rew

# cd /usr 

# tar xv

x adm/README, 107 bytes, 1 tape blocks
x adm/daily, 1609 bytes, 4 tape blocks
x adm/lpd-errs, 0 bytes, 0 tape blocks
 

(snip)

ucb/page linked to ucb/more
ucb/uptime linked to ucb/w
ucb/u linked to ucb/users
ucb/reset linked to ucb/tset
#
# df
Filesystem  1K-blocks     Used    Avail Capacity  Mounted on
root             3022     2705      317    90%    /
/dev/rp0h       78748    33417    45331    42%    /usr
/dev/rp1h       78748    37281    41467    47%    /usr/src
/dev/rp2a       10236     4126     6110    40%    /usr/src/ucb
/dev/rp2c       63392     5180    58212     8%    /usr/src/sys

以上でフルインストールの完了です。おそらくメモリ不足でログインプロンプトまでたどり着けないので、これ以上は先に進まないことをお勧めします。haltコマンドで終了しましょう。

次回予告(?) 

メモリ拡張について検討してみました。検討事項として思いついたのは以下の三つです。

  1. 追加のアドレス腺の接続方法
  2. DMA可能なアドレス範囲の制限
  3. FPGAの空き領域(?) 

BS信号(BS0, BS1)をPmodコネクタに接続する実験は行っていたので、1.については問題なさそうです(ジャンパ腺で対応可能)。

DMA可能なアドレス範囲ですが、ディスクもテープもDMAアドレスは18bitしかないので、サイズとしては256KBまでしかアクセスできません。このため、PDP-11ではUNIBUSのDMAアドレスを変換するUNIBUS mapという仕組みがあります。

このUNIBUS mapを新規実装するのは私のスキル的に難易度が高いのでためらっていたのですが、2.11BSDのドライバのソースを眺めていたら"SOFUB_MAP"というオプションに気が付きました。コンフィグファイルのコメントによると、

# Software UNIBUS/QBUS map.  Permits
# use of 18 bit controllers in a 22 bit
# Qbus system.  Normally NO except for
# the GENERIC kernel or if you actually
# have an 18 bit RX02 on a Qbus system. 

 とのことなので、これを有効にすればよさそうです。

FPGAの空き領域については余裕がありそうなので、これも大丈夫そうです。

ということで、メモリ拡張に挑戦してみようと思います。 

 

 

0 件のコメント:

コメントを投稿

TangConsoleDCJ11MEMにおける2BSDの誤動作の調査 その3

誤動作の原因の二つ目が判明しました。 符号なし2進数と符号付2進数の比較 後述するSOFUB_MAPの実装に符号なし2進数と符号付2進数を比較しているコードがありました。直接の比較ではありませんでしたが、符号なし整数の値を符号付整数の変数に代入し、その変数と定数を比較していたため...