Nachos中文教程.docx

上传人:b****1 文档编号:23259888 上传时间:2023-05-15 格式:DOCX 页数:134 大小:117.10KB
下载 相关 举报
Nachos中文教程.docx_第1页
第1页 / 共134页
Nachos中文教程.docx_第2页
第2页 / 共134页
Nachos中文教程.docx_第3页
第3页 / 共134页
Nachos中文教程.docx_第4页
第4页 / 共134页
Nachos中文教程.docx_第5页
第5页 / 共134页
点击查看更多>>
下载资源
资源描述

Nachos中文教程.docx

《Nachos中文教程.docx》由会员分享,可在线阅读,更多相关《Nachos中文教程.docx(134页珍藏版)》请在冰豆网上搜索。

Nachos中文教程.docx

Nachos中文教程

第一章绪论1

第一节Nachos概述1

一、引言1

二、Nachos教学用操作系统1

第二节Nachos的实验环境4

一、Nachos的安装4

二、Nachos的目录结构4

三、各个部分的编译运行4

四、应用程序的编译4

第二章机器模拟6

第一节概述6

第二节机器模拟的实现10

1.Sysdep模块分析(文件sysdep.ccsysdep.h)10

1.1PoolFile函数10

1.2OpenForWrite函数10

1.3OpenForReadWrite函数10

1.4Read函数10

1.5ReadPartial函数11

1.6WriteFile函数11

1.7Lseek函数11

1.8Tell函数11

1.9Close函数11

1.10Unlink函数12

1.11OpenSocket函数12

1.12CloseSocket函数12

1.13AssignNameToSocket函数12

1.14DeAssignNameToSocket函数12

1.15PoolSocket函数12

1.16ReadFromSocket函数13

1.17SendToSocket函数13

1.18CallOnUserAbort函数13

1.19Delay函数13

1.20Abort函数13

1.21Exit函数13

1.22RandomInit函数14

1.23Random函数14

1.24AllocBoundedArray函数14

1.25DeallocBoundedArray函数14

2.中断模块分析(文件interrupt.ccinterrupt.h)14

2.1PendingInterrupt类16

2.2Interrupt类17

2.2.1内部使用方法17

2.2.2内部使用函数18

2.2.3对外接口18

3.时钟中断模块分析(文件timer.cctimer.h)20

4.终端设备模块分析(文件console.ccconsole.h)22

5.磁盘设备模块分析(文件disk.ccdisk.h)22

6.Nachos运行情况统计(文件stats.ccstats.h)24

第三章线程管理系统25

第一节进程与线程25

一、进程25

1.进程概念25

2.进程的状态及状态变化25

3.进程调度26

4.进程之间的同步和互斥27

5.进程的实施28

6.进程的创建28

二、线程28

1.线程概念28

2.进程和线程的关系29

第二节Nachos的线程管理30

一、Nachos的线程管理30

二、Nachos线程管理同实际进程管理的不同32

第三节Nachos线程管理系统的初步实现33

1.工具模块分析(文件list.cclist.hutility.ccutility.h)33

2.线程启动和调度模块分析(文件switch.sswitch.h)33

2.1ThreadRoot函数33

2.2SWITCH函数34

3.线程模块分析(文件thread.ccthread.h)34

3.1Fork方法36

3.2StackAllocate方法36

3.3Yield方法37

3.4Sleep方法38

4.线程调度算法模块分析(文件scheduler.ccscheduler.h)38

4.1Run方法39

5.Nachos主控模块分析(文件main.ccsystem.ccsystem.h)39

6.同步机制模块分析(文件synch.ccsynch.h)40

6.1信号量(Semaphore)40

6.2锁机制40

6.3条件变量41

第四节线程管理系统作业43

第五节实现实例45

4.1对线程的改进45

4.2对线程调度的改进46

第四章文件管理系统48

第一节文件管理系统概述48

一、文件48

1.文件结构48

2.文件访问49

3.文件类型49

4.文件属性50

5.文件操作50

二、目录51

1.目录结构51

2.多级目录结构51

3.文件路径名51

4.工作目录52

5.目录结构的勾连52

6.目录项52

三、UNIX文件系统的实现53

1.UNIX文件系统中的主要结构53

2.UNIX文件系统存储资源的分配和回收54

第二节Nachos文件管理系统57

第三节Nachos文件系统的实现59

1.同步磁盘分析(文件synchdisk.cc、synchdisk.h)59

2.位图模块分析(文件bitmap.cc、bitmap.h)60

3.文件系统模块分析(文件filesys.cc、filesys.h)60

3.1生成方法61

3.2Create方法61

3.3Open方法61

3.4Remove方法62

4.文件头模块分析(文件filehdr.cc、filehdr.h)62

5.打开文件结构分析(文件openfile.cc、openfile.h)62

5.1ReadAt方法63

5.2WriteAt方法63

6.目录模块分析(文件directory.ccdirectory.h)64

第四节文件管理系统作业65

第五章用户程序和虚拟内存66

第一节Nachos对内存、寄存器以及CPU的模拟66

1RaiseException方法68

2ReadMem方法69

3WriteMem方法69

4Translate方法69

5Run方法70

第二节Nachos用户进程运行机制71

一、用户程序空间(文件address.cc,address.h)71

1.1生成方法71

1.2InitRegisters方法72

1.3SaveState方法72

1.4RestoreState方法72

二、系统调用(文件exception.cc,syscall.h,start.s)72

第三节虚存管理的设计和实现74

一、Nachos存储管理的改进要求74

二、一个虚拟存储管理实现的实例74

2.1虚拟存储系统的总体设计74

2.2缺页中断陷入及其调度算法77

2.3虚存的存储分配79

2.4存储保护79

2.5实现中的一些细节79

第四节用户程序和虚拟存储作业80

第六章Nachos的网络系统81

第一节Nachos对物理网络的模拟81

第二节Nachos的邮局协议85

2.1PostalDelivery方法87

2.2Send方法88

第3节网络部分作业89

第一章绪论

第一节Nachos概述

一、引言

计算机操作系统是一门实践性很强的课程。

一般地阐述其工作原理,很可能使本来具体生动的内容变得十分抽象、枯燥并难以理解。

解决好理论与实践相结合的问题是提高操作系统教学质量的关键。

一门好的操作系统实践课将使读者更加形象和深刻地理解课堂中讲述的概念、原理和它们的应用。

国内外许多著名的大学都在操作系统教学实践方面作了大量研究,比较突出的有著名计算机专家A.S.Tanenbaum设计和实现的MINIX。

MINIX是一个比较完整的操作系统,它的用户界面类似于UNIX。

说它比较完整,是因为它包括了进程管理、文件系统管理、存储管理、设备管理以及I/O管理等操作系统的所有重要内容,而且还包含了系统启动和Shell等实际操作系统不可缺少的部分。

由于MINIX较UNIX的出现晚十年,所以在程序风格上较原来的UNIX要好得多,更加结构化和模块化。

包含有3000行注释的12000行源代码使整个系统较为容易阅读和理解。

但是MINIX作为教学用操作系统有它的不足之处,就是由于它的目标是一个完整的操作系统,必然要和具体的设备打交道;而且不同的机器指令集需要有不同的编译器,所以MINIX的移植性并不令人满意。

一个MINIX操作系统需要占据一台独立的主机,所以在网络的配置和实现上比较复杂,读者需要有一定的实践经验才能完成。

上海交通大学开发的MOS操作系统是另一个较成功的教学用操作系统。

它是一个小型而功能较齐全的多道程序的操作系统,主要包括作业调度管理和文件系统管理,建立在一个只包含十几条指令的指令集虚拟机基础之上。

由于MOS比较简单,读者可以非常容易地理解操作系统课程中讲述的进程调度和文件系统等部分原理。

MOS的不足是过于简单,不能涵盖操作系统的大部分功能。

MOS的虚拟机指令集是自定义的,没有现成的编译器,所以读者必须直接编写汇编程序才能在MOS虚拟机上运行。

这样就缺乏开发大型应用程序的能力。

但是MOS毕竟给了读者一个自由发挥的空间,在MOS的基础上衍生出TOS等学生自己定义和实现的相对完整的操作系统。

二、Nachos教学用操作系统

作为教学用操作系统,需要实现简单并且尽量缩小与实际操作系统之间的差距,所以我们采用Nachos作为操作系统课程的教学实践平台。

Nachos是美国加州大学伯克莱分校在操作系统课程中已多次使用的操作系统课程设计平台,在美国很多大学中得到了应用,它在操作系统教学方面具有一下几个突出的优点:

●采用通用虚拟机

Nachos是建立在一个软件模拟的虚拟机之上的,模拟了MIPSR2/3000的指令集、主存、中断系统、网络以及磁盘系统等操作系统所必须的硬件系统。

许多现代操作系统大多是先在用软件模拟的硬件上建立并调试,最后才在真正的硬件上运行。

用软件模拟硬件的可靠性比真实硬件高得多,不会因为硬件故障而导致系统出错,便于调试。

虚拟机可以在运行时报告详尽的出错信息,更重要的是采用虚拟机使Nachos的移植变得非常容易,在不同机器上移植Nachos,只需对虚拟机部分作移植即可。

采用R2/3000指令集的原因是该指令集为RISC指令集,其指令数目比较少。

Nachos虚拟机模拟了其中的63条指令。

由于R2/3000指令集是一个比较常用的指令集,许多现有的编译器如gc++能够直接将C或C++源程序编译成该指令集的目标代码,于是就不必编写编译器,读者就可以直接用C/C++语言编写应用程序,使得在Nachos上开发大型的应用程序也成为可能。

●使用并实现了操作系统中的一些新的概念

随着计算机技术和操作系统技术的不断发展,产生了很多新的概念。

Nachos将这些新概念融入操作系统教学中,包括网络、线程和分布式应用。

而且Nachos以线程作为一个基本概念讲述,取代了进程在以前操作系统教学中的地位。

Nachos的虚拟机使得网络的实现相当简单。

与MINIX不同,Nachos只是一个在宿主机上运行的一个进程。

在同一个宿主机上可以运行多个Nachos进程,各个进程可以相互通讯,作为一个全互连网络的一个节点;进程之间通过Socket进行通讯,模拟了一个全互连网络。

●确定性调试比较方便;随机因素使系统运行更加真实

因为操作系统的不确定性,所以在一个实际的系统中进行多线程调试是比较困难的。

由于Nachos是在宿主机上运行的进程,它提供了确定性调试的手段。

所谓确定性调试,就是在同样的输入顺序、输入参数的情况下,Nachos运行的结果是完全一样的。

在多线程调试中,可以将注意力集中在某一个实际问题上,而不受操作系统不确定性的干扰。

另外,不确定性是操作系统所必须具有的特征,Nachos采用了随机因子模拟了真实操作系统的不确定性。

●简单而易于扩展

Nachos是一个教学用操作系统平台,它必须简单而且有一定的扩展余地。

Nachos不是向读者展示一个成功的操作系统,而是让读者在一个框架下发挥自己的创造性进行扩展。

例如一个完整的类似于UNIX的文件系统是很复杂的,但是对于文件系统来说,无非是需要实现文件的逻辑地址到物理地址的映射以及实现文件inode、打开文件结构、线程打开文件表等重要的数据结构以及维护它们之间的关系。

Nachos中具有所有这些内容,但是在很多方面作了一定的限制,比如只有一级索引结构限制了系统中最大文件的大小。

读者可以应用学到的各种知识对文件系统进行扩展,逐步消除这些限制。

Nachos在每一部分给出很多课程作业,作为读者进行系统扩展的提示和检查对系统扩展的结果。

●面向对象性

Nachos的主体是用C++的一个子集来实现的。

目前面向对象语言日渐流行,它能够清楚地描述操作系统各个部分的接口。

Nachos没有用到面向对象语言的所有特征,如继承性、多态性等,所以它的代码就更容易阅读和理解。

以下各章分五个部分讲述Nachos的各个部分以及它们的功能。

它们是机器模拟、线程管理、文件系统管理、用户程序和虚拟存储以及网络系统。

各章的安排是:

第二章分析Nachos虚拟机的各个部分,包括中断系统、定时器、以及一些外部设备,如磁盘、键盘和显示器。

Nachos的应用程序将在这个虚拟机上运行。

第三章分析Nachos如何实现多线程机制以及Nachos的线程管理方法。

Nachos没有借助于属主UNIX操作系统的多进程机制,而是通过编写自己的进程图象切换函数来实现多线程。

该部分对Nachos的进程图象切换函数作了详细介绍。

第四章分析Nachos的文件系统。

Nachos原有的文件系统非常简单,该部分在分析原有文件系统的基础上提出了对文件系统的扩展要求。

第五章介绍用户程序和虚拟存储。

该部分补充介绍了Nachos对虚拟机内存、寄存器以及CPU的模拟。

现有的Nachos系统没有实现虚拟内存,当一个用户进程的逻辑地址空间较大时,就不能在现有Nachos上运行。

该部分提出了虚拟内存的概念,并且给出了一个实例。

第六章论述了Nachos的网络系统,Nachos的网络部分实现了不可靠的定长报文传送,在此之上需要建立可靠的网络,并实现网络应用程序。

第二节Nachos的实验环境

一、Nachos的安装

本书的实际实验环境是Linux,Nachos可以运行在内核版本1.2.13以上的各种Linux版本,包括Slackware和Redhat。

编译器的版本是gcc2.7.2版本以上。

本书附有一张软盘,磁盘的格式为DOS格式,磁盘上有一个名为“nachos-3.4.tgz”的压缩文件。

学生需要将此文件拷贝到自己的工作目录下:

~/$mcopya:

nachos-3.4.tgz.

并将其解开:

~/$gzip-dcnachos-3.4.tgz|tarxf-

二、Nachos的目录结构

以上操作系统可以发现在工作目录下生成一个名为nachos-3.4的目录。

该目录中含有:

copyright

文件

Nachos的版权信息

readme

文件

Nachos的readme信息

nachos.ps

文件

Nachos的介绍文档(Postscript格式)

c++example

目录

有关C++介绍和实例

doc

目录

Nachos各个部分介绍和原有的作业要求

code

目录

Nachos各个部分的源代码

最主要的部分是Nachos的源代码部分。

它的目录结构是:

Makefile

Mmon

Makefile.dep

文件

文件

文件

Nachos的Makefile文件。

当Nachos需要移植到其它系统时,可以修改Makefile.dep中的HOST参数

machine

目录

Nachos虚拟机模拟部分源代码

threads

目录

Nachos线程管理部分源代码

filesys

目录

Nachos文件系统管理部分源代码

userprog

目录

Nachos用户程序部分源代码

network

目录

Nachos网络管理部分源代码

vm

目录

Nachos虚拟内存管理部分源代码

test

目录

一些测试用应用程序

bin

目录

包含有用户程序目标码变换的程序

三、各个部分的编译运行

Nachos的各个部分都可以独立编译运行,也可以同时编译各个部分。

全部编译可以采用如下命令:

~/nachos-3.4$make

当需要单独编译线程管理部分时,先进入threads目录,然后采用如下命令:

~/nachos-3.4/threads$makedepend

~/nachos-3.4/threads$makenachos

实际上,各部分目录下都有一个Makefile文件,内容大体相同,区别在于一些条件编译的参数。

比如在单独编译线程管理部分时,文件管理部分就被屏蔽了,这样读者读者就可以专心于线程管理部分的调试。

四、应用程序的编译

由于Linux指令集和R2/3000指令集不同,用户编写的应用程序用Linux系统中标准gcc编译后,不能直接在Nachos虚拟机环境下运行。

所以需要采用交叉编译技术。

所谓交叉编译技术是在一个操作系统下将源码编译成另一个操作系统的目标码,这里就是在Linux下通过gcc交叉编译版本将用户程序的源码编译成R2/3000指令集的目标码。

在Linux中,没有缺省的交叉编译工具。

读者可以到上海交通大学计算机系FTP服务器上下载,URL为:

ftp:

//

该文件的解开需要有超级用户的权利,将解开至/usr/local/目录下:

/#gzip-dccross-compiler.tgz|tarxf-

在编译用户程序时,用交叉编译器将源码编译成R2/3000指令集的目标代码,再经过一个简单的转换就可以在Nachos虚拟机上运行。

注意,在读者实现虚拟存储之前,有些应用程序可能会因为使用过多的内存而不能运行。

第二章机器模拟

第一节概述

Nachos是建立在一个软件模拟的虚拟机上的。

该虚拟机包括计算机的基本部分:

如CPU、主存、寄存器、中断系统,还包括一些外部设备,如终端设备、网络以及磁盘系统。

现代许多操作系统都是先在软件模拟的硬件上建立并调试,最后才在真正的硬件上运行。

软件模拟的硬件可靠性比真实的硬件高的多,不会因为硬件故障而导致系统出错,因而便于调试。

模拟的硬件还可以监视程序对硬件的操作,并加以严格的限制,在程序误操作时报告详尽的出错信息。

这些都是真实硬件难以做到的。

用软件来模拟硬件另一个优点是充分利用了宿主机操作系统的软件资源,避免了编写复杂的硬件控制程序。

更重要的是提高了程序的可移植性,只要在不同硬件上实现Nachos虚拟机就完成了Nachos的大部分移植工作。

我们将Nachos移植到Linux上的工作就受益于这种设计。

下面对Nachos的机器模拟部分作概要说明。

Nachos是用C++语言中的类来表示各个对象的。

其中Machine类用来模拟计算机主机。

它提供的功能有:

读写寄存器。

读写主存、运行一条用户程序的汇编指令、运行用户程序、单步调试用户程序、显示主存和寄存器状态、将虚拟内存地址转换为物理内存地址、陷入Nachos内核等等。

Machine类实现方法是在宿主机上分配两块内存分别作为虚拟机的寄存器和物理内存。

运行用户程序时,先将用户程序从Nachos文件系统中读出,写入模拟的物理内存中,然后调用指令模拟模块对每一条用户指令解释执行。

将用户程序的读写内存要求,转变为对物理内存地址的读写。

Machine类提供了单步调试用户程序的功能,执行一条指令后会自动停下来,让用户查看系统状态,不过这里的单步调试是汇编指令级的,需要读者对R2/3000指令比较熟悉。

如果用户程序想使用操作系统提供的功能或者发出异常信号时,Machine调用系统异常陷入功能,进入Nachos的核心部分。

Interrupt类用来模拟硬件中断系统。

在这个中断系统中,中断状态有开,关两种,中断类型有时钟中断、磁盘中断、控制台写中断、控制台读中断、网络发送中断以及网络接收中断。

机器状态有用户态,核心态和空闲态。

中断系统提供的功能有开/关中断,读/写机器状态,将一个即将发生中断放入中断队列,以及使机器时钟前进一步。

在Interrupt类中有一个记录即将发生中断的队列,称为中断等待队列。

中断等待队列中每个等待处理的中断包含中断类型、中断处理程序的地址及参数、中断应当发生的时间等信息。

一般是由硬件设备模拟程序把将要发生的中断放入中断队列。

中断系统提供了一个模拟机器时钟,机器时钟在下列情况下前进(详见第二节对中断模块的分析):

●用户程序打开中断

●执行一条用户指令

●处理机没有进程正在运行

机器时钟前进时,中断处理的过程如下图2.1所示:

所以,在Nachos中只有在时钟前进时,才会检查是否有中断会发生,而Nachos模拟时钟前进的时机不是任意的,这样即使打开了中断,中断也不能在任意时刻发生。

只有在模拟时钟前进的时候才能处理等待着的中断。

通过以后的叙述我们可以看到,在执行非用户代码的大部分时间里,系统不会被中断。

这意味着不正确的同步代码可能在这个硬件模拟环境下工作正常,而实际上在真正的硬件上是无法正确运行的。

在有些中断处理程序的最后可能要进行正文切换,可以通过调用Interrupt类的一个成员函数来要求时钟前进的时候进行正文切换。

中断系统还提供关机的功能,当系统中没有正在运行的进程同时系统中没有除了时钟中断以外的其它中断时,Nachos结束运行。

在这个中断系统基础上,Nachos模拟了各种硬件设备,这些设备都是异步设备,依靠中断来与主机通信。

Timer类模拟定时器。

定时器每隔X个时钟周期就向CPU发一个时钟中断。

它是时间片管理必不可少的硬件基础。

它的实现方法是将一个即将发生的时钟中断放入中断队列,到了时钟中断应发生的时候,中断系统将处理这个中断,在中断处理的过程中又将下一个即将发生的时钟中断放入中断队列,这样每隔X个时钟周期,就有一个时钟中断发生。

由于Nachos是一个软件模拟的系统,有很多的随机事件需要通过一定的控制来实现。

所以系统中在计算下一个时钟中断应发生的时间时,还加入了一些随机值,使得中断发生的时间间隔不确定,这样就与现实的定时器更相似。

Console类模拟的是控制台设备。

当用户程序向控制台写一个字符时,写程序立即返回,过了给定的时钟周期后I/O操作完成,控制台向CPU发一个控制台写中断。

但是控制台是否有用户输入可供读取是随机的,所以控制台每隔给定的时钟周期向CPU发一个控制台读中断,周期性地发中断的方法与定时器的类似,即先计算下一个控制台读中断将发生的时间,然后将读中断放入中断队列,等待读中断的发生。

读中断发生后,如果有用户输入的话,控制台读中断处理过程将控制台输入的字符放入字符缓冲区。

当用户从控制台读字符时,把字符缓冲区的内容传给用户。

控制台的读/写分别用两个文件来模拟。

Disk类模拟了物理磁盘,它一次只能接受一个读写请求,当读写操作完成后向CPU发一个磁盘中断。

该物理磁盘只有一个面,分为几个磁道,每道又分为几个扇区。

每道的扇区数,每个扇区的存储容量都是固定的。

磁盘的使用者可以读写指定的扇区,读写单位是一个扇区。

模拟磁盘用宿主机文件系统中一个文件来实现,当用户发出读写请求时,Nachos的处理过程如下:

1.从

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1