一、引言

最近心血来潮看到了一本有意思的书:《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 的系统镜像(英文是 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 所需要的所有内容,达成了安装 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。现在我们需要新建一个文件夹(在哪里都可以),然后将这两个文件夹的内容都解压到这个文件夹中去。

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

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

attach tm0 dist.tap

其实作者的原意是,你下载下来的 Unix-v6-Ken-Wellsch.tap 先重命名为 dist.tap,然后在这一行代码中进行连接。但是这篇 wiki 的作者偏偏就漏掉了这关键的一句解释,导致很多人配置启动参数无法成功(这一点也是我看其他人的博客才无意中发现的)。

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 中断运行。我这里的运行截图如下:

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

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 环境了,你可以欢快的尝试各种 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 的源代码获取

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:)

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

  1. itop和mysql_LAMP环境搭建+iTop安装(实测使用centos7更方便)

    LAMP环境搭建+iTop安装(实测使用centos7更方便) 发布时间:2020-06-22 13:49:02 来源:51CTO 阅读:4953 作者:归来仍少年 栏目:数据库 centos 6.7 ...

  2. SLAM导航机器人零基础实战系列:(五)树莓派3开发环境搭建——2.安装ros-kinetic

    SLAM导航机器人零基础实战系列:(五)树莓派3开发环境搭建--2.安装ros-kinetic 摘要 通过前面一系列的铺垫,相信大家对整个miiboo机器人的DIY有了一个清晰整体的认识.接下来就正式 ...

  3. fabric 环境 搭建与安装

    fabric环境搭建与安装 一.前期系统配置 1.安装操作系统为Ubuntu20.04的虚拟机,使用虚拟机进行fabric环境搭建与安装 2.为虚拟机配置国内源,以配置清华源为例(方便后面安装软件) ...

  4. SLAM导航机器人零基础实战系列:(五)树莓派3开发环境搭建——1.安装系统ubuntu_mate_16.04...

    SLAM导航机器人零基础实战系列:(五)树莓派3开发环境搭建--1.安装系统ubuntu_mate_16.04 摘要 通过前面一系列的铺垫,相信大家对整个miiboo机器人的DIY有了一个清晰整体的认 ...

  5. 阿里云轻量应用服务器环境搭建-Docker安装tomcat

    阿里云轻量应用服务器环境搭建-Docker安装tomcat 参考链接:https://www.runoob.com/docker/docker-install-tomcat.html 拉取官方的镜像: ...

  6. pybullet机器人仿真环境搭建 1.安装pybullet,测试官方示例,基础环境搭建

    pybullet机器人仿真环境搭建 1.安装pybullet 前言 安装 测试官方示例 基础环境搭建 导入pybullet 创建服务端 (可选)配置图形GUI 添加资源路径 设置重力 加载模型 迭代运 ...

  7. uni-app(1)— 环境搭建(安装编辑器,创建项目,项目运行)

    此文为uni-app总结笔记(1)- 环境搭建 (安装编辑器 – 创建项目 – 运行到浏览器,微信开发者工具) 一: 安装编辑器HbuilderX [下载地址] : https://www.dclou ...

  8. ubuntu20环境搭建+Qt6安装

    ubuntu20环境搭建+Qt6安装 1 镜像地址 2 安装 3 更改源 4 搭建工作环境 4.1 删除libreoffice 4.2 删除Amazon的链接 4.3 删掉基本不用的自带软件(用的时候 ...

  9. Linux 下ffmpeg的环境搭建与安装

    Linux下ffmpeg的环境搭建与安装 背景 [FFmpeg是什么] 1· FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源软件.采用LGPL或GPL许可证,提供了录制.转 ...

  10. 【Selenium项目实战】项目环境搭建:安装JDK、mysql、Tomcat、jpress和测试系统

    前言 一直想学习自动化测试,但是都没行动,业余时间学习零零碎碎并记录20210416. [Selenium项目实战] 项目环境搭建:安装JDK.mysql.Tomcat.jpress和测试系统 需求分 ...

最新文章

  1. 第四周项目五-用递归方法求解(求n的阶乘)
  2. Python入门100题 | 第038题
  3. SpringBoot - 构建监控体系02_定义度量指标和 Actuator 端点
  4. python 全栈开发,Day79(Django的用户认证组件,分页器)
  5. final、finally与finalize的区别
  6. spark的Web UI中的Storage啥信息都没有
  7. 在JS函数中执行C#中的函数、字段
  8. grup2命令启动windows
  9. MyBatis Generator逆向工程生成实体、接口、映射文件等代码
  10. 论文阅读笔记(七)——Thin MobileNet
  11. 挑战性题目DSCT302:求不同形态的平衡二叉树数目
  12. 签名格式 - 职场 Email 礼仪
  13. 使用Sencha cmd安装extjs6
  14. mysql 通达信公式_公式选股--均线黏合(更多公式关注公众号“斯达克逻辑”)...
  15. 如何用电脑调试安卓手机浏览器上的网页
  16. Web前端最流行图表显示组件
  17. 百度云同同步盘 mac版
  18. Verilog 与门
  19. 美团点评2020校招数据分析方向笔试题
  20. [BZOJ]1071: [SCOI2007]组队 STL优先队列

热门文章

  1. MySQL万字总结!超详细!
  2. 在html中input是什么意思,HTML中input是什么意思
  3. Pdf文件打印功能恢复(绿色版)
  4. mysql 16进制字符串转中文_mysql如何把16进制转换成中文字符显示
  5. 超全前端面试题及答案
  6. arcgis中如何导出奥维可识别的图_如何在奥维中加载ArcGIS发布的地图服务
  7. 斯坦福博士生自制的 PPT 生成神器火了!
  8. 征文第一弹 | 中国民生信托:如何利用Informatica CDC实现增量数据捕获
  9. JAVA基于J2ME的手机游戏开发和实现——贪吃蛇
  10. Zabbix5.2发布,由loT物联网和综合监控驱动!