欢迎光临!
若无相欠,怎会相见

使用 Simh 搭建 Unix V6 虚拟环境

序言

最近对老代码特别感兴趣, 像老操作系统 Unix, Minix, Linux, BSD 等, 老版数据库 Redis, SQLite 等, 其他工具等等。

现在我找到了 Unix  V6 的虚拟系统, 也只能是虚拟的了, 因为 pdp11 现在很罕见了, 反正我是接触不到, 因此就在虚拟系统中体验并理解一下代码等

准备

首先要下载一些工具, 例如模拟器和模拟器的系统镜像。

simh

Simh 模拟器是个开源的, 支持不少古老的设备, 而它的 Windows 应用程序最新的是 simhv39-0 , 官方网站是 http://simh.trailing-edge.com/, 代码地址是https://github.com/simh/simh, 如果有需要可以自己编译 simh 最新代码, 但是官方发布的 Windows 程序最新的是 simhv39-0。

解压后如下图, 实际使用的是 pdp11.exe

Unix V6 镜像

模拟器已经下载了, 现在下载 V6 的系统镜像, 链接是 Unix V6 tap , 实际上 bsd42 这个项目有很多资源可以利用, 感兴趣的自己可以看看。

下载完毕后是一个压缩包, 解压后是 tap 文件, 应该是 simh 或 pdp 设备的镜像文件, 由于不了解, 所以只能猜测。

到此准备工作完成。

安装 Unix V6

英文参考链接:Installing UNIX v6 (PDP-11) on SIMH

首先将我们需要的 pdp11.exe 和 Unix-v6-Ken-Wellsch.tap 放在一个目录里面, 并双击打开 pdp11.exe 或命令行中执行, 我是在命令行中执行的, 因为好看

Tape boot

加载引导块,并将根分区加载到 rk 文件上去。 使用的代码如下:

set cpu 11/40
set tm0 locked
attach tm0 dist.tap        ; 此处的 dist.tap 就是系统镜像的名称
attach rk0 rk0
attach rk1 rk1
attach rk2 rk2
d cpu 100000 012700        ; mov #172526,R0
d cpu 100002 172526
d cpu 100004 010040        ; mov R0,-(R0)
d cpu 100006 012740        ; mov #60003,-(R0)
d cpu 100010 060003
d cpu 100012 000777        ; br 100012
g 100000

可以直接复制并粘贴到命令窗口的代码:

set cpu 11/40
set tm0 locked
attach tm0 Unix-v6-Ken-Wellsch.tap
attach rk0 rk0
attach rk1 rk1
attach rk2 rk2
d cpu 100000 012700       
d cpu 100002 172526
d cpu 100004 010040        
d cpu 100006 012740     
d cpu 100010 060003
d cpu 100012 000777        
g 100000

但是会在 g 100000 执行的时候 lock 住, 如图所示

然后使用 Ctrl + E 中止模拟器运行, 并进行硬盘信息的配置,然后使用 g 0 命令开始进行硬盘信息的配置, 完整步骤如下

Simulation stopped, PC: 100012 (BR 100012)
sim> g 0
=tmrk
disk offset
0
tape offset
100
count
1
=tmrk
disk offset
1
tape offset
101
count
3999
=
Simulation stopped, PC: 137300 (BGE 137274)
sim> q
Goodbye

上述的两次 stopped 都是使用 Ctrl + E 的结果, 完整步骤如下图:

到此就将硬盘信息写好了, 同时你会发现 rk0 文件大小变成了 2000KB

安装硬盘

上一步中关闭了 pdp11.exe, 现在重新打开并复制如下命令:

set cpu 11/40
set tto 7b
set tm0 locked
attach tm0 Unix-v6-Ken-Wellsch.tap attach rk0 rk0 attach rk1 rk1 attach rk2 rk2 dep system sr 173030 boot rk0

上述命令执行完毕后会打印出 @ 符号并等待输入, 输入 rkunix 进入 Unix 核心模块

同时可以发现进入 Unix 后字母是大写的, 看着不习惯, 使用 STTY -LCASE 进行修改

重建内核

需要重新构建内核来支持 simh 提供的硬件,首先先构建 mkconf 程序

mkconf

需要注意的是 Unix V6 切换目录的命令是 chdir, 不是 cd, 且不能输错字符, 因为没有 backspace 退格键删除, 也没有 tab 键补全。

如执行如下命令进行 mkconf 的编译:

chdir /usr/sys/conf
cc mkconf.c
mv a.out mkconf

cc 是 Unix V6 的编译器, mv 用于将生成的可执行文件 a.out 重命名文 mkconf

基本设备配置

直接运行 mkconf 程序, 并输入如下内容

rk
tm
tc
8dc
lp
done

编译内核

上一步添加了我们想使用的 device, 现在可以编译 unix 内核了, 编译完成后将内核移动到根目录

as m40.s
mv a.out m40.o
cc -c c.c
as l.s
ld -x a.out m40.o c.o ../lib1 ../lib2
mv a.out /unix

编译后的 kernel 大小是 30346

构建设备文件

/etc/mknod /dev/rk0 b 0 0
/etc/mknod /dev/rk1 b 0 1
/etc/mknod /dev/rk2 b 0 2
/etc/mknod /dev/mt0 b 3 0
/etc/mknod /dev/tap0 b 4 0
/etc/mknod /dev/rrk0 c 9 0
/etc/mknod /dev/rrk1 c 9 1
/etc/mknod /dev/rrk2 c 9 2
/etc/mknod /dev/rmt0 c 12 0
/etc/mknod /dev/lp0 c 2 0
/etc/mknod /dev/tty0 c 3 0
/etc/mknod /dev/tty1 c 3 1
/etc/mknod /dev/tty2 c 3 2
/etc/mknod /dev/tty3 c 3 3
/etc/mknod /dev/tty4 c 3 4
/etc/mknod /dev/tty5 c 3 5
/etc/mknod /dev/tty6 c 3 6
/etc/mknod /dev/tty7 c 3 7
chmod 640 /dev/*rk*
chmod 640 /dev/*mt*
chmod 640 /dev/*tap*

可以直接复制粘贴到终端里面

恢复系统的其他部分

dd if=/dev/mt0 of=/dev/rk1 count=4000 skip=4100
/etc/mount /dev/rk1 /usr/source
dd if=/dev/mt0 of=/dev/rk2 count=4000 skip=8100
mkdir /usr/doc
/etc/mount /dev/rk2 /usr/doc

将 /usr/source 挂载到 /dev/rk1 磁盘上, 然后又创建了 /usr/doc, 并挂载到 /dev/rk2

 

系统启动项

为了方便, 直接将挂载操作写入到系统启动项里, 系统启动就挂载

# cat >> /etc/rc
/etc/mount /dev/rk1 /usr/source
/etc/mount /dev/rk2 /usr/doc

重建 df 命令

# chdir /usr/source/s1
# ed df.c
/rp0/d
.-2a
  "/dev/rk0",
  "/dev/rk1",
.
w
q
# cc -s -O df.c
# cp a.out /bin/df
# rm a.out

检查文件系统

icheck /dev/rrk0
dcheck /dev/rrk0
icheck /dev/rrk1
dcheck /dev/rrk1
icheck /dev/rrk2
dcheck /dev/rrk2

启用多用户登录

# ed /etc/ttys
1,8s/^0/1/p
w
q
#

重启

# sync
# sync
# sync
# sync
#
#
Simulation stopped, PC: 002502 (MOV (SP)+,177776)
sim> q
Goodbye

正常运行

重新打开 pdp11.exe 并执行下列命令

set cpu 11/40
set cpu idle
set tto 7b
set tm0 locked
attach rk0 rk0
attach rk1 rk1
attach rk2 rk2
attach lpt printer.txt
set dci en
set dci lines=8
set dco 7b
att dci 5555
boot rk0

可以使用 telnet 进行连接了, 当然连接的是 simh 模拟器, OK 这样就正常启动了。

登录的时候,出现 @ 符号的时候输入 unix, 出现 login 的时候输入 root 就能进入 Unix V6 系统了。

配置文件启动

每次启用 Unix V6 系统得输入很多命令, 很不方便, 可以在 pdp11.exe 的目录新建 config.ini 文件, 将命令写入到里面, 再用 pdp11.exe 的时候加上启动参数就 OK 了

以后再运行就不用 tap 文件了, 只要 rk0, rk1 和 rk2 文件存在,就可以运行, 这三个文件应该就是充当 pdp11 设备的存储设备即硬盘, tap 文件就是系统镜像, 将镜像写入到存储设备硬盘后, 就不在需要了

结语

经过一番操作, 终于把这个环境搞好了, 太不容易了~

如有错误, 敬请指出, 感谢指正!     — 2021-11-06 15:45:33

赞(0) 打赏
转载请注明:飘零博客 » 使用 Simh 搭建 Unix V6 虚拟环境
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

欢迎光临