Unix V6 环境搭建:Simh 安装 Unix V6、Unix V6 基本使用以及源代码获取

一、引言

最近心血来潮看到了一本有意思的书:《Unix内核源码剖析》。这本书有意思之处在于,作者的研究对象是 Unix V6。虽然 Unix V6 已经是 1975 年的系统了,但是其源代码拢共只有 1w 行左右,并且使用了 C 语言(K & R 之前的标准),还是现代操作系统的鼻祖,所以说是初学者最好的研究对象。本着看看总不会吃亏就买了这本书,没想到一开始就差点弃掉。因为这个 Unix V6 系统想要在自己的电脑上搭建起来,着实需要花点精力。

其实搭建 Unix V6 环境、Unix V6 系统的基本使用以及源代码的获取,作者虽然没有明说,但是在附录中的指引中已经指出了能够找到这些资料的地方。

这里,我通过自己的实践,结合作者的指引以及网上的一些博客,成功在 Win10 系统上搭建了 Unix V6 系统。这篇博客本着对网友零假设的基础上进行详细的阐述,力图让每一位阅读本博客的网友都可以按着我这篇博客的内容,一步一步的在自己的 Windows 电脑上搭建出 Unix V6 环境。

那么, 让我们开始吧:)

ps:
Simh 和 Unix V6 的下载速度可能很慢,这里我放到了自己的百度网盘上,供大家下载:
链接:https://pan.baidu.com/s/1NVGMtm4egJicV8TedfsGAA 提取码:mkkj

再 ps:
本博客涉及到的链接网址,这里做个整理:
Simh官方网址
Installing Unix v6 (PDP-11) on SIMH
Unix V6 Manuals (http://man.cat-v.org/unix-6th/)
The Unix Tree

二、下载 Simh

《Unix内核源码剖析》的作者在附录中给出了 Simh 的官方地址,但是具体如何下载我们需要的版本,他并没有细说,也没有细说 Simh 到底是什么:
Simh官方网址 (http://simh.trailing-edge.com/)

简单来说,Simh 是一个旨在模拟历史上的操作系统的一个模拟器软件,我们的 Unix V6(PDP-11)也就正好在它的模拟范畴里面,并且其对 Unix V6 提供了完善的模拟支持,因此我们搭建 Unix V6 环境,一般都是离不开 Simh 的。

那么问题来了,我们下载哪个版本的 Simh 呢?

根据作者在附录中给出的安装指引中,能看到我们只需要 Simh 版本在 3.8-1 及其以后的即可,因此,这里我贴出了 Simh3.9.0 (目前是最新的稳定版本)的下载地址:
下载 Simh3.9.0 (http://simh.trailing-edge.com/sources/simhv39-0-exe.zip)

下载下来,其中的 pdp11.exe 就是我们将要使用的程序:
Unix V6 环境搭建:Simh 安装 Unix V6、Unix V6 基本使用以及源代码获取_第1张图片

不过我们暂时先不使用它,把它放在一边,因为我们还需要下载 Unix V6 的系统镜像(英文是 tape,我不知道翻译成什么好,也许系统胶带更好 T_T)。

三、下载 Unix V6

作者其实给出了一个介绍 Simh 安装 Unix V6 的 wiki 网址,但是这个 wiki 对于小白来说不是特别友好:
Installing Unix v6 (PDP-11) on SIMH

这个 wiki 的前提假设,就是读者已经下载了 Simh 和 Unix V6 系统镜像。在这个 wiki 中给出了 Unix V6 系统镜像的下载地址,也就是这个:
下载 Unix V6 系统镜像 (http://sourceforge.net/projects/bsd42/files/Install%20tapes/Research%20Unix/Unix-v6-Ken-Wellsch.tap.bz2/download)

下载下来的压缩包名称为 Unix-v6-Ken-Wellsch.tap.bz2,并且里面只有一个文件 Unix-v6-Ken-Wellsch.tap:
Unix V6 环境搭建:Simh 安装 Unix V6、Unix V6 基本使用以及源代码获取_第2张图片

如此这般,我们已经下载了所有我们搭建 Unix V6 所需要的所有内容,达成了安装 Unix V6 系统的前提条件。接下来,让我们继续跟着那篇 wiki 的指引在 Simh 中安装 Unix V6。

四、在 Simh 中安装 Unix V6

之所以要写这篇博客,就是因为作者给出的那篇在 Simh 中安装 Unix V6 的 wiki 写的有些草略,对于小白来说,可能更想要的是事无巨细的说明书一样的东西,这里,我结合作者给出的 wiki 和网上的一些博客,详细记录下我在 Win10 系统下是如何成功在 Simh 中安装 Unix V6 的。其中,作者在附录中给出的在 Simh 中安装 Unix V6 的 wiki 地址如下,感兴趣的同学可以去看看:
Installing Unix v6 (PDP-11) on SIMH

1. 新建文件夹,解压 Simh 和 Unix V6

我们在前面下载了 simhv39-0-exe.zip 和 Unix-v6-Ken-Wellsch.tap.bz2。现在我们需要新建一个文件夹(在哪里都可以),然后将这两个文件夹的内容都解压到这个文件夹中去。
Unix V6 环境搭建:Simh 安装 Unix V6、Unix V6 基本使用以及源代码获取_第3张图片

2. 重命名 Unix-v6-Ken-Wellsch.tap 为 dist.tap

这一步是非常非常关键的一步,因为在作者给出的 wiki 中,有这么一行配置代码:

attach tm0 dist.tap

其实作者的原意是,你下载下来的 Unix-v6-Ken-Wellsch.tap 先重命名为 dist.tap,然后在这一行代码中进行连接。但是这篇 wiki 的作者偏偏就漏掉了这关键的一句解释,导致很多人配置启动参数无法成功(这一点也是我看其他人的博客才无意中发现的)。
Unix V6 环境搭建:Simh 安装 Unix V6、Unix V6 基本使用以及源代码获取_第4张图片

3. Simh 中配置安装 Unix V6

接下来就是点击文件夹中的 pdp11.exe 程序,配置 Unix V6 的系统启动参数。在弹出来的界面中,粘贴以下配置代码即可(这里可以复制好了之后,鼠标移动到弹出来的界面中右键进行粘贴)。

a. 安装系统(Tape boot )

加载引导块,并将根分区加载到 rk 文件上去。可能有些人会疑惑下面的 11/40 是啥,联想下 Unix V6 是在 DEC 公司的 PDP-11/40 设备上运行的就不难理解了:

set cpu 11/40
set tm0 locked
attach tm0 dist.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

当你运行到这一刻的时候,模拟器会卡住,此时你使用 Ctrl + E 退出,然后再准备配置硬盘信息:

g 0

运行了这行代码,会弹出一个 = 的等待输入提示符,此时按照如下对话进行输入即可:

sim> g 0
=tmrk
disk offset
0
tape offset
100
count
1
=tmrk
disk offset
1
tape offset
101
count
3999
=                                              [## Hit CTRL-E here]
Simulation stopped, PC: 137300 (BGE 137274)
sim> q

其中 [## Hit CTRL-E here] 的意思是让你在那个地方 Ctrl + E 中断运行。我这里的运行截图如下:
Unix V6 环境搭建:Simh 安装 Unix V6、Unix V6 基本使用以及源代码获取_第5张图片

b. 安装硬盘(disk install)

在上一步的最后,我们 q 退出了程序,现在我们接着再点击 pdp11.exe,然后输入下面的配置代码:

set cpu 11/40
set tto 7b
set tm0 locked
attach tm0 dist.tap
attach rk0 rk0
attach rk1 rk1
attach rk2 rk2
dep system sr 173030
boot rk0

此时,程序会打印出来一个 @ 符号提示输入,输入如下内容即可告诉模拟器我们要加载 Unix 核心模块:

rkunix

Unix V6 环境搭建:Simh 安装 Unix V6、Unix V6 基本使用以及源代码获取_第6张图片

c. 修改终端显示为小写(Fixing the Terminal)

如果此时你输入 ls,会发现默认的不管输入还是显示都是大写字母,只需要输入下面的配置代码即可转为小写:

# STTY -LCASE

d. 重新构建内核(Rebuilding the kernel)

我们需要重新构建内核,才能让内核能够支持 SImh 提供的硬件设备。首先,我们需要重建 mkconfg 程序:

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

其中的 chdir 是移动目录的指令, cc 是 C 编译器,默认输出为 a.out 文件,然后 mv 修改名称为 mkconf。

当我们重新构建了 mkconf,还需要给他一个基本的配置文件:

# ./mkconf
rk
tm
tc
8dc
lp
done
#

接下来,我们编译配置,将其与内核的其余的库文件进行链接,最后将其复制到 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

其中的 as 是汇编命令。为了确认,我们可以查看内核大小是否为 30Kb 大小:

# ls - /unix
-rwxrwxrwx  1 root    30346 Oct 10 12:45 /unix

e. 构建设备文件(building device files)

复制粘贴运行配置指令即可:

/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*

f. 恢复操作系统的其余部分(Restoring the rest of the OS)

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

g. 配置启动(configure boot)

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

然后点击 Ctrl + D 中断。

h. 重新构建 df 指令(rebuild the df command)

# 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

在你运行 ed df.c 的时候,会出现诸如 1282 或者 1297 或者其他的数字,不用惊慌,这是正常现象。

i. 检查文件系统(check filesystems)

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

j. 启动多用户登录服务(enable multiser)

默认的 /etc/ttys 文件没有监听多个端口,我们可以通过配置以下代码进行修改:

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

k. 重启(reboot)

这里的多次运行 sync 并不是强迫症,也不是没有意义的,因为没有重启指令,我们只能强制同步多次,并且 Ctrl + E 中断退出模拟器:

# sync
# sync
# sync
# sync
#                               [## Hit CTRL-E here]
Simulation stopped, PC: 002502 (MOV (SP)+,177776)
sim> q

4. 正常运行(Running normally)

我们已经配置好了 Simh 和模拟器中的 Unix V6,每次运行的时候,我们都可以点击 pdp11.exe(或者从 cmd 中运行它),然后复制粘贴如下配置代码:

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

其中的 5555 端口是提供给其他用户登录用的。接着我们在弹出来的 @ 后面输入 unix,在接下来提示的 login 后面以 root 用户登录。
Unix V6 环境搭建:Simh 安装 Unix V6、Unix V6 基本使用以及源代码获取_第7张图片
至此,我们就搭建好了 Unix V6 环境了,你可以欢快的尝试各种 Unix V6 所支持的命令了:)

五、Unix V6 的使用

1. Unix V6 手册

作者在附录中给出了 Unix V6 的使用手册,大家可以看看,里面有相当详细的阐述,包括 Unix V6 所支持的命令以及相关解释、系统调用、C 函数库等等信息:
Unix V6 Manuals (http://man.cat-v.org/unix-6th/)

你可以参照里面的内容,使用 Unix V6 系统。

2. Unix V6 正常运行

有人可能嫌弃每次在 Simh 中运行 Unix V6 都要粘贴前面那一大串的配置信息,怎么样才能简化这个操作呢?

这个很简单,我们可以新建一个文件比如说 config.ini,将配置内容写入进去:

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

然后使用 cmd 运行 pdp11.exe,后面加个参数 config.ini:

pdp11.exe config.ini

这样就可以直接跳到登录步骤,输入 unix 然后输入登录名 root 即可:
Unix V6 环境搭建:Simh 安装 Unix V6、Unix V6 基本使用以及源代码获取_第8张图片

六、Unix V6 的源代码获取

Unix V6 的源代码获取地址,作者也在附录中有提到,这个网址能够找到各个古老历史版本的 Unix 源代码:
The Unix Tree

其中我们需要的 Unix V6 的源代码位于:
Unix V6 源代码下载

其中下载 v6src.tar.gz 即可看到完整的 Unix V6 源代码。

七、总结

至此,我已经把我在 Win10 上成功搭建 Unix V6 环境的过程一步一步的详细写出来了。终于算是松了一口气,没想到原以为内容不多的博客,还是洋洋洒洒写了这么多。这篇博客里面大幅度参考了作者指引的 wiki 和网上的一些博客内容,诚惶诚恐之中,就连英文的翻译都有些拿捏不准,难免有些纰漏,网友如有看不透的地方,还请多多包涵呀 ^_^

这篇博客里面涉及到的安装步骤,因为原文 wiki 是英文的,有些专业术语的翻译,我也拿捏不准,因此都附上了原文英文,方便大家查看,还希望大家谅解。

《Unix内核源码剖析》这本书我也刚开始看,有些内容也还不清楚,希望这篇博客能够给同样处于我这种情况的网友一些帮助,至少都能搭建一个 Unix V6 环境出来,开心的把玩一番也是好的~~~

To be Stronger:)

你可能感兴趣的:(linux,Unix,V6,PDP-11,Simh,Unix内核源码剖析,Unix)