收藏 分销(赏)

Nachos中文教程.doc

上传人:丰**** 文档编号:4124995 上传时间:2024-07-30 格式:DOC 页数:96 大小:864.10KB
下载 相关 举报
Nachos中文教程.doc_第1页
第1页 / 共96页
Nachos中文教程.doc_第2页
第2页 / 共96页
Nachos中文教程.doc_第3页
第3页 / 共96页
Nachos中文教程.doc_第4页
第4页 / 共96页
Nachos中文教程.doc_第5页
第5页 / 共96页
点击查看更多>>
资源描述

1、目 录第一章 绪论1第一节 Nachos概述1一、引言1二、Nachos教学用操作系统1第二节 Nachos的实验环境4一、Nachos的安装4二、Nachos的目录结构4三、各个部分的编译运行4四、应用程序的编译5第二章 机器模拟6第一节 概述 6第二节 机器模拟的实现101. Sysdep模块分析(文件sysdep.cc sysdep.h)101.1 PoolFile 函数101.2 OpenForWrite 函数101.3 OpenForReadWrite 函数101.4 Read 函数101.5 ReadPartial 函数111.6 WriteFile 函数111.7 Lseek 函

2、数111.8 Tell 函数111.9 Close 函数111.10 Unlink 函数121.11 OpenSocket 函数121.12 CloseSocket 函数121.13 AssignNameToSocket 函数121.14 DeAssignNameToSocket 函数121.15 PoolSocket 函数121.16 ReadFromSocket 函数131.17 SendToSocket 函数131.18 CallOnUserAbort 函数131.19 Delay 函数131.20 Abort 函数131.21 Exit 函数141.22 RandomInit 函数14

3、1.23 Random 函数141.24 AllocBoundedArray 函数141.25 DeallocBoundedArray 函数142. 中断模块分析(文件interrupt.cc interrupt.h)142.1 PendingInterrupt类162.2 Interrupt类172.2.1 内部使用方法172.2.2 内部使用函数182.2.3 对外接口183. 时钟中断模块分析(文件timer.cc timer.h)204. 终端设备模块分析(文件console.cc console.h)225. 磁盘设备模块分析(文件disk.cc disk.h)236. Nachos

4、运行情况统计(文件stats.cc stats.h)24第三章 线程管理系统25第一节 进程与线程25一、进程251. 进程概念252. 进程的状态及状态变化253. 进程调度264. 进程之间的同步和互斥275. 进程的实施286. 进程的创建28二、线程291. 线程概念292. 进程和线程的关系30第二节 Nachos的线程管理31一、Nachos的线程管理31二、Nachos线程管理同实际进程管理的不同33第三节 Nachos线程管理系统的初步实现341. 工具模块分析(文件list.cc list.h utility.cc utility.h)342. 线程启动和调度模块分析(文件s

5、witch.s switch.h)342.1 ThreadRoot函数342.2 SWITCH函数353. 线程模块分析(文件thread.cc thread.h)353.1 Fork 方法373.2 StackAllocate 方法383.3 Yield 方法393.4 Sleep 方法404. 线程调度算法模块分析(文件scheduler.cc scheduler.h)404.1 Run方法415. Nachos主控模块分析(文件main.cc system.cc system.h)416. 同步机制模块分析(文件synch.cc synch.h)426.1 信号量 ( Semaphore

6、 )426.2 锁机制426.3 条件变量43第四节 线程管理系统作业45第五节 实现实例474.1 对线程的改进474.2 对线程调度的改进48第四章 文件管理系统51第一节 文件管理系统概述51一、文件511. 文件结构512. 文件访问523. 文件类型524. 文件属性535. 文件操作53二、目录541. 目录结构542. 多级目录结构553. 文件路径名554. 工作目录555. 目录结构的勾连556. 目录项56三、UNIX文件系统的实现561. UNIX文件系统中的主要结构562. UNIX文件系统存储资源的分配和回收58第二节 Nachos文件管理系统61第三节 Nachos

7、文件系统的实现631. 同步磁盘分析(文件synchdisk.cc 、synchdisk.h)632. 位图模块分析(文件bitmap.cc、bitmap.h)643. 文件系统模块分析(文件filesys.cc、filesys.h)643.1 生成方法653.2 Create方法653.3 Open方法663.4 Remove方法664. 文件头模块分析(文件filehdr.cc、filehdr.h)665. 打开文件结构分析(文件openfile.cc、openfile.h)675.1 ReadAt方法675.2 WriteAt方法686. 目录模块分析(文件directory.cc di

8、rectory.h)68第四节 文件管理系统作业70第五章 用户程序和虚拟内存71第一节 Nachos 对内存、寄存器以及CPU的模拟711 RaiseException 方法742 ReadMem 方法743 WriteMem 方法744 Translate方法745 Run 方法75第二节 Nachos用户进程运行机制77一、用户程序空间(文件address.cc, address.h)771.1 生成方法771.2 InitRegisters方法781.3 SaveState方法781.4 RestoreState方法78二、系统调用(文件exception.cc, syscall.h,

9、 start.s)78第三节 虚存管理的设计和实现80一、Nachos存储管理的改进要求80二、一个虚拟存储管理实现的实例802.1 虚拟存储系统的总体设计802.2 缺页中断陷入及其调度算法832.3 虚存的存储分配852.4 存储保护852.5 实现中的一些细节85第四节 用户程序和虚拟存储作业87第六章 NACHOS的网络系统88第一节 Nachos对物理网络的模拟88第二节 Nachos的邮局协议912.1 PostalDelivery方法922.2 Send方法93第三节 网络部分作业943第一章 绪论 第一节 Nachos概述第一章绪论第一节Nachos概述一、引言计算机操作系统是

10、一门实践性很强的课程。一般地阐述其工作原理,很可能使本来具体生动的内容变得十分抽象、枯燥并难以理解。解决好理论与实践相结合的问题是提高操作系统教学质量的关键。一门好的操作系统实践课将使读者更加形象和深刻地理解课堂中讲述的概念、原理和它们的应用。国内外许多著名的大学都在操作系统教学实践方面作了大量研究,比较突出的有著名计算机专家A.S.Tanenbaum设计和实现的MINIX。MINIX是一个比较完整的操作系统,它的用户界面类似于UNIX。说它比较完整,是因为它包括了进程管理、文件系统管理、存储管理、设备管理以及I/O管理等操作系统的所有重要内容,而且还包含了系统启动和Shell等实际操作系统不

11、可缺少的部分。由于MINIX较UNIX的出现晚十年,所以在程序风格上较原来的UNIX要好得多,更加结构化和模块化。包含有3000行注释的12000行源代码使整个系统较为容易阅读和理解。但是MINIX作为教学用操作系统有它的不足之处,就是由于它的目标是一个完整的操作系统,必然要和具体的设备打交道;而且不同的机器指令集需要有不同的编译器,所以MINIX的移植性并不令人满意。一个MINIX操作系统需要占据一台独立的主机,所以在网络的配置和实现上比较复杂,读者需要有一定的实践经验才能完成。上海交通大学开发的MOS操作系统是另一个较成功的教学用操作系统。它是一个小型而功能较齐全的多道程序的操作系统,主要

12、包括作业调度管理和文件系统管理,建立在一个只包含十几条指令的指令集虚拟机基础之上。由于MOS比较简单,读者可以非常容易地理解操作系统课程中讲述的进程调度和文件系统等部分原理。MOS的不足是过于简单,不能涵盖操作系统的大部分功能。MOS的虚拟机指令集是自定义的,没有现成的编译器,所以读者必须直接编写汇编程序才能在MOS虚拟机上运行。这样就缺乏开发大型应用程序的能力。但是MOS毕竟给了读者一个自由发挥的空间,在MOS的基础上衍生出TOS等学生自己定义和实现的相对完整的操作系统。二、Nachos教学用操作系统作为教学用操作系统,需要实现简单并且尽量缩小与实际操作系统之间的差距,所以我们采用Nacho

13、s作为操作系统课程的教学实践平台。Nachos是美国加州大学伯克莱分校在操作系统课程中已多次使用的操作系统课程设计平台,在美国很多大学中得到了应用,它在操作系统教学方面具有一下几个突出的优点:l 采用通用虚拟机Nachos是建立在一个软件模拟的虚拟机之上的,模拟了MIPS R2/3000的指令集、主存、中断系统、网络以及磁盘系统等操作系统所必须的硬件系统。许多现代操作系统大多是先在用软件模拟的硬件上建立并调试,最后才在真正的硬件上运行。用软件模拟硬件的可靠性比真实硬件高得多,不会因为硬件故障而导致系统出错,便于调试。虚拟机可以在运行时报告详尽的出错信息,更重要的是采用虚拟机使Nachos的移植

14、变得非常容易,在不同机器上移植Nachos,只需对虚拟机部分作移植即可。采用R2/3000指令集的原因是该指令集为RISC指令集,其指令数目比较少。Nachos虚拟机模拟了其中的63条指令。由于R2/3000指令集是一个比较常用的指令集,许多现有的编译器如gc+能够直接将C或C+源程序编译成该指令集的目标代码,于是就不必编写编译器,读者就可以直接用C/C+语言编写应用程序,使得在Nachos上开发大型的应用程序也成为可能。l 使用并实现了操作系统中的一些新的概念随着计算机技术和操作系统技术的不断发展,产生了很多新的概念。Nachos将这些新概念融入操作系统教学中,包括网络、线程和分布式应用。而

15、且Nachos以线程作为一个基本概念讲述,取代了进程在以前操作系统教学中的地位。Nachos的虚拟机使得网络的实现相当简单。与MINIX不同,Nachos只是一个在宿主机上运行的一个进程。在同一个宿主机上可以运行多个Nachos进程,各个进程可以相互通讯,作为一个全互连网络的一个节点;进程之间通过Socket进行通讯,模拟了一个全互连网络。l 确定性调试比较方便;随机因素使系统运行更加真实因为操作系统的不确定性,所以在一个实际的系统中进行多线程调试是比较困难的。由于Nachos是在宿主机上运行的进程,它提供了确定性调试的手段。所谓确定性调试,就是在同样的输入顺序、输入参数的情况下,Nachos

16、运行的结果是完全一样的。在多线程调试中,可以将注意力集中在某一个实际问题上,而不受操作系统不确定性的干扰。另外,不确定性是操作系统所必须具有的特征,Nachos采用了随机因子模拟了真实操作系统的不确定性。l 简单而易于扩展Nachos是一个教学用操作系统平台,它必须简单而且有一定的扩展余地。Nachos不是向读者展示一个成功的操作系统,而是让读者在一个框架下发挥自己的创造性进行扩展。例如一个完整的类似于UNIX的文件系统是很复杂的,但是对于文件系统来说,无非是需要实现文件的逻辑地址到物理地址的映射以及实现文件inode、打开文件结构、线程打开文件表等重要的数据结构以及维护它们之间的关系。Nac

17、hos中具有所有这些内容,但是在很多方面作了一定的限制,比如只有一级索引结构限制了系统中最大文件的大小。读者可以应用学到的各种知识对文件系统进行扩展,逐步消除这些限制。Nachos在每一部分给出很多课程作业,作为读者进行系统扩展的提示和检查对系统扩展的结果。l 面向对象性Nachos的主体是用C+的一个子集来实现的。目前面向对象语言日渐流行,它能够清楚地描述操作系统各个部分的接口。Nachos没有用到面向对象语言的所有特征,如继承性、多态性等,所以它的代码就更容易阅读和理解。以下各章分五个部分讲述Nachos的各个部分以及它们的功能。它们是机器模拟、线程管理、文件系统管理、用户程序和虚拟存储以

18、及网络系统。各章的安排是:第二章分析Nachos虚拟机的各个部分,包括中断系统、定时器、以及一些外部设备,如磁盘、键盘和显示器。Nachos的应用程序将在这个虚拟机上运行。第三章分析Nachos如何实现多线程机制以及Nachos的线程管理方法。Nachos没有借助于属主UNIX操作系统的多进程机制,而是通过编写自己的进程图象切换函数来实现多线程。该部分对Nachos的进程图象切换函数作了详细介绍。第四章分析Nachos的文件系统。Nachos原有的文件系统非常简单,该部分在分析原有文件系统的基础上提出了对文件系统的扩展要求。第五章介绍用户程序和虚拟存储。该部分补充介绍了Nachos对虚拟机内存

19、、寄存器以及CPU的模拟。现有的Nachos系统没有实现虚拟内存,当一个用户进程的逻辑地址空间较大时,就不能在现有Nachos上运行。该部分提出了虚拟内存的概念,并且给出了一个实例。第六章论述了Nachos的网络系统,Nachos的网络部分实现了不可靠的定长报文传送,在此之上需要建立可靠的网络,并实现网络应用程序。第一章 绪论 第二节 Nachos的实验环境第二节Nachos的实验环境一、Nachos的安装本书的实际实验环境是Linux,Nachos可以运行在内核版本1.2.13以上的各种Linux版本,包括Slackware和Redhat。编译器的版本是gcc2.7.2版本以上。本书附有一张

20、软盘,磁盘的格式为DOS格式,磁盘上有一个名为“nachos-3.4.tgz”的压缩文件。学生需要将此文件拷贝到自己的工作目录下:/$mcopy a:nachos-3.4.tgz .并将其解开:/$gzip -dc nachos-3.4.tgz | tar xf -二、Nachos的目录结构以上操作系统可以发现在工作目录下生成一个名为nachos-3.4的目录。该目录中含有:copyright文件Nachos的版权信息readme文件Nachos的readme信息nachos.ps文件Nachos的介绍文档(Postscript格式)c+example目录有关C+介绍和实例doc目录Nacho

21、s各个部分介绍和原有的作业要求code目录Nachos各个部分的源代码最主要的部分是Nachos的源代码部分。它的目录结构是:MakefileMmonMakefile.dep文件文件文件Nachos的Makefile文件。当Nachos需要移植到其它系统时,可以修改Makefile.dep中的HOST参数machine目录Nachos虚拟机模拟部分源代码threads目录Nachos线程管理部分源代码filesys目录Nachos文件系统管理部分源代码userprog目录Nachos用户程序部分源代码network目录Nachos网络管理部分源代码vm目录Nachos虚拟内存管理部分源代码te

22、st目录一些测试用应用程序bin目录包含有用户程序目标码变换的程序三、各个部分的编译运行Nachos的各个部分都可以独立编译运行,也可以同时编译各个部分。全部编译可以采用如下命令:/nachos-3.4$make当需要单独编译线程管理部分时,先进入threads目录,然后采用如下命令:/nachos-3.4/threads$make depend/nachos-3.4/threads$make nachos实际上,各部分目录下都有一个Makefile文件,内容大体相同,区别在于一些条件编译的参数。比如在单独编译线程管理部分时,文件管理部分就被屏蔽了,这样读者读者就可以专心于线程管理部分的调试。

23、四、应用程序的编译由于Linux指令集和R2/3000指令集不同,用户编写的应用程序用Linux系统中标准gcc编译后,不能直接在Nachos虚拟机环境下运行。所以需要采用交叉编译技术。所谓交叉编译技术是在一个操作系统下将源码编译成另一个操作系统的目标码,这里就是在Linux下通过gcc交叉编译版本将用户程序的源码编译成R2/3000指令集的目标码。在Linux中,没有缺省的交叉编译工具。读者可以到上海交通大学计算机系FTP服务器上下载,URL为:ftp:/该文件的解开需要有超级用户的权利,将解开至/usr/local/目录下:/#gzip -dc cross-compiler.tgz | t

24、ar xf -在编译用户程序时,用交叉编译器将源码编译成R2/3000指令集的目标代码,再经过一个简单的转换就可以在Nachos虚拟机上运行。注意,在读者实现虚拟存储之前,有些应用程序可能会因为使用过多的内存而不能运行。49第二章 机器模拟 第一节 概述第二章机器模拟第一节概述Nachos是建立在一个软件模拟的虚拟机上的。该虚拟机包括计算机的基本部分:如CPU、主存、寄存器、中断系统,还包括一些外部设备,如终端设备、网络以及磁盘系统。现代许多操作系统都是先在软件模拟的硬件上建立并调试,最后才在真正的硬件上运行。软件模拟的硬件可靠性比真实的硬件高的多,不会因为硬件故障而导致系统出错,因而便于调试

25、。模拟的硬件还可以监视程序对硬件的操作,并加以严格的限制,在程序误操作时报告详尽的出错信息。这些都是真实硬件难以做到的。用软件来模拟硬件另一个优点是充分利用了宿主机操作系统的软件资源,避免了编写复杂的硬件控制程序。更重要的是提高了程序的可移植性,只要在不同硬件上实现 Nachos 虚拟机就完成了 Nachos 的大部分移植工作。我们将 Nachos 移植到 Linux 上的工作就受益于这种设计。下面对 Nachos 的机器模拟部分作概要说明。Nachos是用C+语言中的类来表示各个对象的。其中Machine类用来模拟计算机主机。它提供的功能有:读写寄存器。读写主存、运行一条用户程序的汇编指令、

26、运行用户程序、单步调试用户程序、显示主存和寄存器状态、将虚拟内存地址转换为物理内存地址、陷入 Nachos 内核等等。Machine类实现方法是在宿主机上分配两块内存分别作为虚拟机的寄存器和物理内存。运行用户程序时,先将用户程序从 Nachos 文件系统中读出,写入模拟的物理内存中,然后调用指令模拟模块对每一条用户指令解释执行。将用户程序的读写内存要求,转变为对物理内存地址的读写。Machine类提供了单步调试用户程序的功能,执行一条指令后会自动停下来,让用户查看系统状态,不过这里的单步调试是汇编指令级的,需要读者对R2/3000指令比较熟悉。如果用户程序想使用操作系统提供的功能或者发出异常信

27、号时,Machine调用系统异常陷入功能,进入Nachos的核心部分。Interrupt类用来模拟硬件中断系统。在这个中断系统中,中断状态有开,关两种,中断类型有时钟中断、磁盘中断、控制台写中断、控制台读中断、网络发送中断以及网络接收中断。机器状态有用户态,核心态和空闲态。中断系统提供的功能有开/关中断,读/写机器状态,将一个即将发生中断放入中断队列,以及使机器时钟前进一步。在Interrupt类中有一个记录即将发生中断的队列,称为中断等待队列。中断等待队列中每个等待处理的中断包含中断类型、中断处理程序的地址及参数、中断应当发生的时间等信息。一般是由硬件设备模拟程序把将要发生的中断放入中断队列

28、。中断系统提供了一个模拟机器时钟,机器时钟在下列情况下前进(详见第二节对中断模块的分析):l 用户程序打开中断l 执行一条用户指令l 处理机没有进程正在运行机器时钟前进时,中断处理的过程如下图 2.1 所示:图2.1Nachos中断处理时机NYNY进行正文切换中断处理程序要求进行正文切换?开中断取出队列中一个应当发生的中断,调用这个中断的处理程序去处理中断中断队列中有应当发生的中断?关中断所以,在Nachos中只有在时钟前进时,才会检查是否有中断会发生,而Nachos模拟时钟前进的时机不是任意的,这样即使打开了中断,中断也不能在任意时刻发生。只有在模拟时钟前进的时候才能处理等待着的中断。通过以

29、后的叙述我们可以看到,在执行非用户代码的大部分时间里,系统不会被中断。这意味着不正确的同步代码可能在这个硬件模拟环境下工作正常,而实际上在真正的硬件上是无法正确运行的。在有些中断处理程序的最后可能要进行正文切换,可以通过调用 Interrupt 类的一个成员函数来要求时钟前进的时候进行正文切换。中断系统还提供关机的功能,当系统中没有正在运行的进程同时系统中没有除了时钟中断以外的其它中断时,Nachos结束运行。在这个中断系统基础上,Nachos模拟了各种硬件设备,这些设备都是异步设备,依靠中断来与主机通信。Timer类模拟定时器。定时器每隔X个时钟周期就向CPU发一个时钟中断。它是时间片管理必

30、不可少的硬件基础。它的实现方法是将一个即将发生的时钟中断放入中断队列,到了时钟中断应发生的时候,中断系统将处理这个中断,在中断处理的过程中又将下一个即将发生的时钟中断放入中断队列,这样每隔X个时钟周期,就有一个时钟中断发生。由于Nachos是一个软件模拟的系统,有很多的随机事件需要通过一定的控制来实现。所以系统中在计算下一个时钟中断应发生的时间时,还加入了一些随机值,使得中断发生的时间间隔不确定,这样就与现实的定时器更相似。Console类模拟的是控制台设备。当用户程序向控制台写一个字符时,写程序立即返回,过了给定的时钟周期后I/O操作完成,控制台向CPU发一个控制台写中断。但是控制台是否有用

31、户输入可供读取是随机的,所以控制台每隔给定的时钟周期向CPU发一个控制台读中断,周期性地发中断的方法与定时器的类似,即先计算下一个控制台读中断将发生的时间,然后将读中断放入中断队列,等待读中断的发生。读中断发生后,如果有用户输入的话,控制台读中断处理过程将控制台输入的字符放入字符缓冲区。当用户从控制台读字符时,把字符缓冲区的内容传给用户。控制台的读/写分别用两个文件来模拟。Disk类模拟了物理磁盘,它一次只能接受一个读写请求,当读写操作完成后向CPU发一个磁盘中断。该物理磁盘只有一个面,分为几个磁道,每道又分为几个扇区。每道的扇区数,每个扇区的存储容量都是固定的。磁盘的使用者可以读写指定的扇区

32、,读写单位是一个扇区。模拟磁盘用宿主机文件系统中一个文件来实现,当用户发出读写请求时,Nachos的处理过程如下:1. 从模拟文件中读出数据或向模拟文件写入数据。2. 计算磁盘操作需要的时间。磁盘操作时间 = 移动磁头寻道的时间 + 旋转到读写扇区的时间 + 数据传送的时间。3. 将一个磁盘读/写中断放入中断队列,因为中断是在操作完成后发生的。所以,中断发生时间 = 当前时间 + 磁盘操作时间。每个Nachos运行时是宿主机上的一个进程,如果在宿主机上运行多个Nachos进程,这些Nachos进程可以组成一个网络,而每个Nachos进程就是一个网络节点。Network类模拟了一个网络节点。这个

33、网络节点可以把报文发送到网络的其他节点上。报文的长度固定,Nachos模拟了在现实网络中时常发生的报文丢失的情况;但是报文中的内容不会在网络传送中被修改破坏。每个网络节点都有全网络唯一的“地址”,报文传送的起始节点、目的节点都是由这个“地址”表示。报文在网络中的传递是用通过Socket(套接口)来实现的。每个节点还有一个可靠性系数,用来模拟报文从这个节点发出后丢失的概率。Network的实现与控制台类似,每隔一定的时钟周期,就产生一个网络接收中断,网络接收中断处理过程是:1. 将下一个网络接收中断放入中断队列以实现中断的周期性发生。2. 如果报文缓冲区中已有报文,则返回。3. 读取套接口,如果

34、没有报文,则返回。4. 读取报文,把它放入报文缓冲区。5. 调用本节点自定义的接收处理函数。在现有实现中,报文缓冲区只能存放一个报文,有可能因为报文缓冲区满而造成报文丢失(上面第2行),可以多设几个报文缓冲区来减少丢失的可能性。Network类提供了让网络用户读取已经收到的报文的成员函数,当报文缓冲区为空时,它返回空,否则从报文缓冲区读出报文,并将报文缓冲区清空,返回刚读出的报文。报文发送的过程是:1. 将网络发送中断放入中断队列。2. 产生一个随机数。3. 如果这个随机数大于网络的可靠性系数,则不发送报文 (用来模拟报文丢失),否则通过套接口将报文发送出去。从以上的叙述中可以看出,中断系统成

35、为整个Nachos虚拟机的基础,其它的模拟硬件设备都是建立在中断系统之上的。在此之上,加上Machine类模拟的指令解释器,可以实现Nachos的线程管理、文件系统管理、虚拟内存、用户程序和网络管理等所有操作系统功能。图2.2展示了Nachos系统的整体结构。用 户 程 序线程管理网络协议文件系统虚拟内存终端设备时钟网络磁盘中 断 系 统指令解释和内存模拟图2.2Nachos系统的整体结构第二章 机器模拟 第二节 机器模拟的实现第二节机器模拟的实现1. Sysdep模块分析(文件sysdep.cc sysdep.h)Nachos的运行环境可以是多种操作系统,由于每种操作系统所提供的系统调用或函

36、数调用在形式和内容上可能有细微的差别。sysdep模块的作用是屏蔽掉这些差别。1.1 PoolFile 函数语法:bool PoolFile (int fd)参数:fd:文件描述符,也可以是一个套接字 (socket)功能:测试一个打开文件 fd 是否有内容可以读,如果有则返回TRUE,否则返回FALSE。当Nachos系统处于IDLE状态时,测试过程有一个延时,也就是在一定时间范围内如果有内容可读的话,同样返回TRUE。实现:通过 select 系统调用。返回:打开文件是否有内容供读取。1.2 OpenForWrite 函数语法:int OpenForWrite (char *name)参数

37、:name:文件名功能:为写操作打开一个文件。如果该文件不存在,产生该文件;如果该文件已经存在,则将该文件原有的内容删除。实现:通过 open 系统调用。返回:打开的文件描述符。1.3 OpenForReadWrite 函数语法:int OpenForReadWrite (char *name, bool crashOnError)参数:name:文件名crashOnError:crash标志功能:为读写操作打开一个文件。当 crashOnError 标志设置而文件不能读写打开时,系统出错退出。实现:通过 open 系统调用。返回:打开的文件描述符。1.4 Read 函数语法:void Rea

38、d (int fd, char *buffer, int nBytes)参数:fd:打开文件描述符buffer:读取内容的缓冲区nBytes:需要读取的字节数功能:从一个打开文件fd中读取nBytes的内容到buffer缓冲区。如果读取失败,系统退出。实现:通过 read系统调用。返回:无。注意:这和系统调用read不完全一样。read系统调用返回的是实际读出的字节数,而Read函数则必须读出nBytes,否则系统将退出。如果需要使用同read系统调用相对应的函数,请用ReadPartial。1.5 ReadPartial 函数语法:int ReadPartial (int fd, char

39、*buffer, int nBytes)参数:fd:打开文件描述符buffer:读取内容的缓冲区nBytes:需要读取的最大字节数功能:从一个打开文件fd中读取nBytes的内容到buffer缓冲区。实现:通过 read系统调用。返回:实际读出的字节数。1.6 WriteFile 函数语法:void WriteFile (int fd, char *buffer, int nBytes)参数:fd:打开文件描述符buffer:需要写的内容所在的缓冲区nBytes:需要写的内容最大字节数功能:将buffer缓冲区中的内容写nBytes到一个打开文件fd中。实现:通过 write系统调用。返回:无

40、。注意:这和系统调用write不完全一样。write系统调用返回的是实际写入的字节数,而WriteFile函数则必须写入nBytes,否则系统将退出。1.7 Lseek 函数语法:void Lseek (int fd, int offset, int whence)参数:fd:文件描述符offset:偏移量whence:指针移动的起始点功能:移动一个打开文件的读写指针,含义同lseek系统调用;出错则退出系统。实现:通过lseek 系统调用。返回:无。1.8 Tell 函数语法:int Tell (int fd)参数:fd:文件描述符功能:指出当前读写指针位置实现:通过lseek 系统调用。返

41、回:返回当前指针位置。1.9 Close 函数语法:void Close (int fd)参数:fd:文件描述符功能:关闭当前打开文件fd,如果出错则退出系统。实现:通过close系统调用。返回:无。1.10 Unlink 函数语法:bool Unlink (char *name)参数:name:文件名功能:删除文件。实现:通过unlink系统调用。返回:删除成功,返回TRUE;否则返回FALSE。1.11 OpenSocket 函数语法:int OpenSocket ()参数:无功能:申请一个socket。实现:通过socket系统调用。其中AF_UNIX参数说明使用UNIX内部协议。(Na

42、chos是用SOCKET文件来模拟网络节点,所以采用UNIX内部协议。向该文件读写内容分别代表从该节点读取内容和向该网络节点发送内容)SOCK_DGRAM参数说明采用无连接定长数据包型的数据链路。返回:申请到的socket ID。1.12 CloseSocket 函数语法:void CloseSocket (int sockID)参数:sockID:socket标识功能:释放一个socket。实现:通过close系统调用。返回:无。1.13 AssignNameToSocket 函数语法:void AssignNameToSocket(char *socketName, int sockID)

43、参数:socketName:socket文件名sockID:socket标识功能:将一个文件名和一个socket标识联系起来,于是将一个SOCKET文件同一个Nachos进程连接起来,使宿主机上该Nachos进程成为一个网络节点。实现:通过bind系统调用。返回:无。1.14 DeAssignNameToSocket 函数语法:void DeAssignNameToSocket(char *socketName)参数:socketName:socket文件名功能:将一个文件名删除,实际上是和相应的socket标识脱离关系。实现:通过unlink系统调用。返回:无。1.15 PoolSocket

44、 函数语法:bool PoolSocket (int sockID)参数:socketID:socket标识功能:查询一个socket是否有内容可以读取。实现:调用PoolFile。在UNIX中socket标识和普通的文件标识没有本质的区别,可以采用相同的方式操作;Nachos中的网络收发信息的模拟实际上是文件操作。返回:socket中有内容,返回TRUE;否则返回FALSE。1.16 ReadFromSocket 函数语法:void ReadFromSocket (int sockID, char *buffer, int packetSize)参数:socketID:socket标识buffer:读取内容的暂存空间packetSize:读取数据包的大小功能:从一个socket标识中读取packetSize大小的数据包,放在buffer缓冲中。实现:通过recvfrom系统调用。返回:无。1.17 SendToSocket 函数语法:void SendToSocket (int sockID, char *buffer, int packetSize, char *toName)参数:socketID

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服