2
1.1 什么是UNIX V6
UNIX V6由肯·汤普逊(Kenneth Lane Thompson)和丹尼斯·里奇(Dennis MacAlistair
Ritchie)开发,由贝尔实验室于1975年发布。
因为大部分代码都是用C语言完成的,并且公开了源代码,所以包括大学在内的使
用者纷纷将其移植到自己的环境中,UNIX V6因此得到广泛使用。在移植过程中,有些
开发人员加入了独有的功能,其中一些功能后来也被原始版本所采纳。
从UNIX V6派生出来的产品还有很多,但是 本书以其原始版本,�即在DEC公司的
PDP-11/40设备上运行的系统内核作为说明对象�。
1.2 UNIX的历史
贝尔实验室在发布UNIX V6之后,于1979年又发布了UNIX第7版(Seventh Edition
Unix,UNIX V7)。加州大学伯克利分校于1978年发布了以UNIX V6为基础的BSD的首
个版本。在此之后,UNIX和BSD不断有新版本或派生版本出现。然后又出现了标准化
的动向,制定了POSIX标准,意在统一各个操作系统所提供的API。著名的Linux也是将
POSIX标准作为开发目标的。因此, 大多数最新的操作系统都和UNIX(V6)有着千丝万
缕的联系。
UNIX的历史如图1-1所示。
UNIX V6的全貌第1章
第I部分 什么是UNIX V6
3
1.2 UNIX 的历史
图片
:Erase
rhead
1,.Infinity0
.(Own.work:.CC-BY-SA-3.0,.GFDL)
�图1 -1
UNIX
的历史
A�
A
http
://j
a.w
ikip
edia.o
rg/w
iki/
UN
IX
4
第 1章 UNIX.V6 的全貌
第 I 部分 什么是 UNIX V6
1.3 UNIX V6内核
UNIX V6内核提供了这些操作系统所必须具备的如下基本功能:
● 管理运行中的程序(进程)
● 内存管理
● 文件系统
● 文件和周边设备共享 I/O ● 中断
● 支持终端处理
内核向用户提供了经过高度抽象的服务。系统对CPU或磁盘的操作细节被内核或设
备驱动程序隐藏起来,对用户完全透明。
用户程序通过 系统调
用机制访问内核提供的功
能。构成计算机系统的软
件集合如图1-2所示。应
用程序利用UNIX V6提
供的系统内置的用户程
序集(处理用户登录的
程序,或是守护程序等)、
辅助程序(例如ls、cat等)、程序库等进行处理。系统程序等则利用系统调用(调用内
核提供的功能)进行自身的处理。此外,应用程序也可以直接使用系统调用。
内核集中了对系统影响较大的处理,通过限制用户任意执行这些功能,使系统的安
全性和可维护性得以保证。
1.4 构成UNIX V6运行环境的硬件
本节对构成UNIX V6运行环境的硬件进行介绍。这里说明的内容将贯穿以后的各章,
请读者注意理解。
调用程序库函数、执行命令等
应用程序
程序库、系统程序等
内核
系统调用
图1-2 构�成UNIX�V6的软件集合�
5
1.4 构成 UNIX.V6 运行环境的硬件
PDP-11
PDP-11系列是由数字设备公司(Digital Equipment
Corporation,DEC)B设计制造的处理装置。本书内容
以PDP-11/40为对象(图1-3)。
PDP-11/40作为一种16位计算机,指令和数据基
本都是以16比特为单位进行处理的。处理器处理数
据的单位称为字(word)。 对 PDP-11/40 而言,�1个
字的宽度为16比特�。
PDP-11/40没有专用的 I/O总线,而是使用一种名
为Unibus的总线用于数据的输入输出,Unibus同时
具有18比特宽的地址总线C。PDP-11/40以及周边设
备的寄存器被映射到内存最高位的 8KB空间,因此
可以采用与操作内存相同的方法操作寄存器。这
种方式被称为 内存映射 I/O(Memory Mapped I/O)
(图1-4)。
Unibus
PDP-11 内存 磁盘 终端
内存
I/O用
地址
8KB
0
设备的寄存器被映射到内存最高位的8KB空间。通过操作内存来达到访问寄存器的目的(内存映射I/O)
图1-4 通过Unibus进行连接的设备
A http://ja.wikipedia.org/wiki/PDP-11
B 美国计算机企业。于 1998 年被康柏公司(Compaq)收购,随后康柏公司又与惠普公司(Hewlett Packard)合并。
C Unibus 总线共有 72 条信号线,其中有 18 条用于传输地址(地址总线),另有 16 条用于传输数据(I/O 总线)。
——译者注
照片:Stefan_Kögl(GFDL)
图1-3 PDP-11/40①
6
第 1章 UNIX.V6 的全貌
第 I 部分 什么是 UNIX V6
利用内存映射 I/O,可以用C语言将寄存器的操作写成如代码清单1-1所示的形式。
integ的含义请参见本书的附录。
代码清单1-1 寄存器的操作示例�
1/*寄存器被映射的地址*/
2#defineREG_ADDRESS0170000
3
4struct{
5intinteg;
6};
7
8main(){
9inta;
10a=REG_ADDRESS->integ;/*从寄存器读取数据*/
11REG_ADDRESS->integ=0;/*向寄存器写入数据*/
12}
PSW
PDP-11/40拥有一个被称为处理器状态字(Processor Status Word,PSW)的16位的
寄存器(表1-1)。PSW表示处理器的状态。
表1-1 PSW
比特位 含义
15~14 处理器当前模式(00:内核模式、11:用户模式)
13~12 处理器先前模式(00:内核模式、11:用户模式)
7~5 处理器优先级(7~0)
4 陷入(trap)位
3 N。负位。指令执行结果为负时置1
2 Z。零位。指令执行结果为0时置1
1 V。溢出位。指令执行中发生溢出时置1
0 C。借位位。指令执行中发生进位或借位时置1
处理器模式为00时表示内核模式,为11时表示用户模式A。在对系统调用等进行处理
时,处理器需要首先从用户模式切换到内核模式。内核模式和用户模式所使用的进程的
虚拟地址空间是相互独立的,因此在两种模式间传输数据时,需要了解处理器当前模式
和处理器先前模式。
PSW[3-0]会根据指令的执行结果自动设置。关于处理器优先级和陷入位将在第5章
做详细说明。
A 在一些资料中,“内核模式”也译为“核心态”,“用户模式”也译为“用户态”。 ——审校者注
7
1.4 构成 UNIX.V6 运行环境的硬件
通用寄存器
PDP-11具有 r0~r7共8个通用寄存器。其中只有 r6为两个,分别对应用户模式和内
核模式。 在切换PSW的当前模式�时,�r6在硬件上也会自动切换。
UNIX V6通用寄存器的用途如表1-2所示。
表1-2 通用寄存器
寄存器 用途
r0、r1 用于运算、函数的返回值
r2、r3、r4 本地处理
r5 帧指针,环境指针
r6(sp) 栈指针
r7(pc) 程序计数器
上表中的 r5、r6、r7对理解UNIX V6内核尤其重要。
r5称为帧指针或环境指针。在第3章中会做详细介绍。
r6称为栈指针,它指向各进程所拥有的栈的顶端。
r7称为程序计数器。处理器从 r7指示的内存地址读取指令,随后解释并执行该指令。
处理完成后 r7将指向容纳下一条指令的内存地址。
MMU
内存管理单元(MMU,Memory Management Unit)用于地址变换以及访问权限管
理。PDP-11/40以长度为8KB的段(segment)或页(page)为单位,对进程所需的内存
进行管理。试图访问不具备权限的内存时,MMU会引发一个陷入异常(参见第5章)。
MMU通过称为APR的寄存器(页寄存器)对各段进行设定,并将虚拟地址转换为物理地
址。APR和地址变换的详情会在第2章中介绍。
PDP-11/40的MMU具有两个状态寄存器(Status Register)SR0和SR2。SR0用于保存
出错信息和内存管理的有效标志(表1-3)。SR2用于保存目标指令的16位虚拟地址,可
用来确定引起错误的指令(表1-4)。
表1-3 SR0
比特位 含义
15 访问设定错误的页时置1
14 访问由PDR(详细请参见第2章)规定的页长度以外的区域时置1
13 试图向只读区域写入数据时置1
8 维护模式。本书不做详细说明
8
第 1章 UNIX.V6 的全貌
第 I 部分 什么是 UNIX V6
比特位 含义
6~5 出错进程的模式(00:内核、11:用户)
3~1 页编号。可用于确定引起错误的内存页
0 置1时MMU对内存的管理有效
表1-4 SR2
比特位 含义
15~0容纳目标指令的16位虚拟地址。当读取指令失败时SR2的值不更新。另外,如果SR0[15-13]的任意1位为1时SR2的值也不更新
内存
PDP-11/40使用的内存被称为磁芯内存(Magnetic Core Memory),当时的论文等有时
将其称为磁芯(Core),本书为了便于读者理解,仍将其称为内存。
内存以8比特(1字节)为单位赋予地址。地址长度为18比特,因此内存容量为
218=256KB。PDP-11/40将周边设备的寄存器映射到内存高位8KB的地址空间。
处理器利用内存中存储的指令和数据进行运算。
块设备
磁盘设备或磁带设备等块设备可以容纳大量数据。文件系统构筑于块设备之上。对
块设备 I/O处理的介绍参见第7章、第8章,对文件系统的详细说明参见第9章、第10章。
块设备的一部分被用做交换空间。为了在有限容量的内存中运行大量程序,内核会
把不需要的数据从内存转移到交换空间,或者将需要的数据从交换空间移回内存。这被
称为交换处理,在第4章中会对此进行详细说明。
行式�打印机
行式打印机用于在纸张上打印数据的设备。对行式打印机的说明请见第12章。
终端
终端是连接系统与用户的装置。用户可以通过终端对系统进行交互式的操作。终端
处理会在第13章中说明。
(续)
9
1.6 手册
1.5 代码
UNIX V6源代码对应现在的BSD许可证,用户可以在网上获取代码。本书附录中介
绍了登载UNIX V6源代码的网站 [1]。
1.6 手册�
UNIX V6向用户提供了名为UNIX Programmer’s Manual (UPM)的手册。该手册包
括下述9个章节, 阅读内核代码时需要特�别注意第2章和第4章。如果希望了解可执行程序
(a.out)的格式请参考第5章。本书在希望读者参考UPM的某个章节(比如第2章)时,会
以“UPM(2)”的形式标注。如果在阅读代码时遇到难以理解的内容,也请参考UPM。
(1)手册概要
(2)一般命令
(3)系统调用
(4)C语言库函数等
(5)特殊文件 A、设备驱动
(6)文件格式
(7)游戏等
(8)其他
(9)系统管理命令和守护程序
如果想了解内核以外的、系统内置的用户程序集等内容,请参考上述第1章、第3
章、第5章、第8章。
本书附录中介绍了登载UNIX V6手册的网站 [2]。
A 关于特殊文件的说明请参照 7.1 节。——译者注
10
第 1章 UNIX.V6 的全貌
第 I 部分 什么是 UNIX V6
1.7 小结
● UNIX V6由肯·汤普逊和丹尼斯·里奇开发,于1975年由贝尔实验室发布
● UNIX V6可以说是现代操作系统的鼻祖
● UNIX V6的内核提供了系统运行所必需的基本功能
● 内核向用户隐藏了对硬件的操作,以及保证了对系统具有影响的处理的安全性和可
维护性
● 用户程序通过系统调用向内核发出处理请求
● PDP-11/40及周边设备的寄存器被映射到内存的最高位8KB地址空间
● PDP-11/40具有 r0~r7的8个通用寄存器。其中只有 r6又分为两个,分别对应内核模
式和用户模式。理解内核处理时,r5~r7尤其重要