UNIXv1のエミュレーション環境の構築
はじめに
本記事では、初期UNIXであるResearch Unix version1(以降UNIXv1)をPDP-11/20のエミュレーションが可能なsimhを利用し環境構築する手法を説明する。
目次
説明する環境に関して
今回環境構築をするにあたってUbuntu 20.04.4 LTS x86_64を用いて環境構築を行った。
作業ディレクトリを用意
$ mkdir UNIXv1 $ cd UNIXv1
simhのビルド
simhをソースコードからビルドする。
ビルドに必要なパッケージの準備
$ sudo apt install build-essential $ sudo apt install libpcap-dev $ sudo apt install bridge-utils $ sudo apt install uml-utilities
simhの準備
まず、エミュレータであるsimhをビルドする。simhはgithubにおけるリポジトリ(https://github.com/simh/simh)で開発がされている。よって、このリポジトリを任意のディレクトリにダウンロードする。また、この記事を書いた時simhのmasterはversion4である。
$ wget https://github.com/simh/simh/archive/refs/heads/master.zip -O simh.zip $ unzip simh.zip
simhのビルド
simhディレクトリ内に入り、ビルドを行う。
$ cd simh-master $ make pdp11
ビルドされた実行ファイルはsimh-master/BIN/pdp11として存在する。
イメージの準備
イメージのダウンロード
UNIXv1ディレクトリに戻り、イメージ関連の圧縮ファイルがダウンロードする。
$ wget https://www.tuhs.org/Archive/Distributions/Research/Dennis_v1/images-20080625.tgz -O V1image.tgz $ mkdir V1image; tar -xzvf V1image.tgz -C V1image --strip-components 1
ディレクトリの構成が以下のようになっているかを確認する。
UNIXv1 ├── V1image ├── V1image.tgz ├── images-20080625 ├── pdp11 ├── simh-master └── simh.zip
この際、simh.zipは削除しても大丈夫だが、イメージ内の環境を壊してしまった場合やリセットしたい場合のためにV1image.tgzは保持しておくことをお勧めする。
UNIXv1の起動
simh.cfgを起動スクリプトとして渡し、UNIXv1を起動する。
$ cd V1image $ ../simh-master/BIN/pdp11 simh.cfg
以下のような表示がされた場合UNIXv1の起動には成功している。
初期セットアップ
rootでログインを行う。ここからは、UNIXv1内での作業に移る。以降はバックスペースが効かないため注意すること。もし間違えた場合、@を行末に追加しEnterを押すことで入力を無効化することができる。
login: root root # ls -@ #
セットアップスクリプトと実行
tmpディレクトリに移動する
chdir tmp
cat コマンドを利用し、set.shを作成する。chdir /で始まる内容を入力するにはクリップボードを使用すれば良い。また、入力後に改行してからCtrl-dを押せば確定する。
# cat >set.sh chdir / chmod 017 tmp ls -al chdir /usr chown 6 ken ls -al chdir /usr/src/lib as crt0.s; mv a.out crt0.o mv crt0.o /usr/lib/crt0.o #
set.shを実行する。
# sh set.sh
set.shでやっていること
セットアップスクリプトで実行していることを説明する。
tmpディレクトリの権限書き換え
一般ユーザーでもedコマンド等を利用できるようにtmpディレクトリの権限を変更する。rootユーザーでtmpディレクトリの権限を変更する。
# chdir / # chmod 017 tmp
ls -alを使って権限が変更されたかを確認する。
# ls -al ... 114 sdrwrw 2 root 120 Jan 1 00:00:00 tmp ...
/usr/kenの所有者の変更
kenディレクトリ内でユーザーkenによるリダイレクトを利用できるようにする。そのために/usr/kenの所有者をrootからkenに変更する。こちらでも、rootユーザーで所有者を変更する。
# chdir /usr # chown 6 ken
ls -alを使い確認
# ls -al ... 57 sdrwr- 2 ken 70 Jan 1 00:00:00 ken ...
C言語の実行起動ルーチンの準備
/usr/src/lib/crt.sをビルドし適切な場所に配置する必要がある。まず、/usr/src/libに移動する。
# chdir /usr/src/lib
次に、ビルドをする。
# as crt0.s; mv a.out crt0.o
最後に、アセンブルしたファイルを/usr/libに配置する。
# mv crt0.o /usr/lib/crt0.o
C言語が動作するか確認
次の作業をするためにCtrl-dを押しログアウトをする。すると、プロンプトがでてくるため、そこにkenと入力しユーザーkenでログインする。その後、catコマンドを利用しソースファイルを作成する。
@ cat >hello.c
このコマンドを入力した時点で入力待ちになるため、以下のコードを入力する。
@ cat >hello.c main(){ extern printf; printf("hello UNIXv1\n"); return; }
入力後は改行をし、Ctrl-dを押すことで確定する。その後、コンパイルをする。
@ cc hello.c
この際、コンパイルできていればセットアップは完了である。実行ファイルであるa.outファイルが生成されるので実行する。
@ a.out hello UNIXv1
停止のさせ方
Ctrl-eを押すことでsimhのコマンドモードに移行する。
# Simulation stopped, PC: 007332 (MOV (SP)+,25244) sim>
ここでquitコマンドを入力することで終了する。
# Simulation stopped, PC: 007332 (MOV (SP)+,25244) sim> quit Goodbye %SIM-INFO: RF: writing buffer to file: rf0.dsk
最後に
今回は、UNIXv1をエミュレータで実行するための環境構築に関して解説した。他にもdockerイメージなども公開されているため調べてみてほしい。次回は、UNIXv1の操作方法に関しての記事を予定している。
次回
未公開