序言
最近对老代码特别感兴趣, 像老操作系统 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。
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
构建设备文件
/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
最新评论
这个软件有bug的,客户端windows有些键不能用如逗号、句号
没有收到邮件通知
我的评论通知貌似坏掉了,定位一下问题
测试一下重新部署后的邮件功能
居然看到自己公司的MIB库,诚惶诚恐
那可能是RobotFramework-ride的版本问题。我装的1.7.4.2,有这个限制。我有空再尝试下旧版本吧,感谢回复。
你好!我在python2.7中安装RobotFramework-ride的时候提示wxPython的版本最高是2.18.12,用pip下载的wxPython版本是4.10,而且我在那个路径下没有找到2
真的太好了,太感谢了,在bilibili和CSDN上都找遍了,终于在你这里找到了