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の操作方法に関しての記事を予定している。

次回

未公開

no000.hateblo.jp