在Nachos中,每个扇区的大小为128个字节。每个inode占用一个扇区,共有30个直接索引。所以Nachos中最大的文件大小不能超过3840个字节。
没有构造函数,可以在为一个新文件分配数据块的时候或者从磁盘加载时进行初始化。 D. filehdr.cc:
和真实的文件系统不同的是,nachos没有在文件头中记录文件的permission、ownership、最后一次修改日期等信息。
1) Allocate:通过文件大小初始化文件头,并根据文件大小申请磁盘空间。 2) Deallocate:将一个文件占用的数据空间释放(未释放文件头占用空间)。 3) FetchFrom:从磁盘读出文件头的内容。 4) WriteBack:把文件头的修改内容写回磁盘。
5) ByteToSector:文件逻辑地址向物理地址的转换,返回文件中某个字节保存的山
区号。
E. directory.h:
目录是一张表,将字符形式的文件名与实际文件的文件头相对应。这样用户就能方便地通过文件名来访问文件。这里的互斥由caller保证。
每个条目是一个 pairs
Nachos中的目录结构非常简单,它只有一级目录,也就是只有根目录;而且根目录的大小是固定的,整个文件系统中只能存放有限个文件。 F. directory.cc:
1) Directory:构造函数初始化一个目录。,size限制了目录中可存放的文件的最大
数目。
2) ~ Directory:释放数据结构,即目录表table。 3) FetchFrom:从磁盘读目录的内容。 4) WriteBack:把对目录的任何修改写磁盘。
5) FindIndex:根据文件名返回文件头在目录表中的位置。 6) Find:在目录中根据文件名返回文件头存放的扇区编号。 7) Add/Remove:在目录中加入/删除一个文件。 G. openfile.h:
该模块定义了一个打开文件控制结构。当用户打开了一个文件时,系统即为其产生一个打开文件控制结构,以后用户对该文件的访问都可以通过该结构。打开文件控制结构中的对文件操作的方法同UNIX操作系统中的系统调用。
针对FileSystem结构中的两套实现,这里的打开文件控制结构对应的同样有两套实现 H. openfile.cc:
1) OpenFile:打开一个nachos文件进行读写操作,文件打开时把文件头加载到内存。 2) ~OpenFile:关闭nachos文件,释放内存中的数据结构。 3) Seek:改变打开的文件的当前位置,即下一个读写开始的位置。
4) Read/Write:从文件的当前位置 seekPosition 读写文件的一部分,返回实际读
写的字节数。同时,会改变文件内部的当前位置 seekPosition。
5) ReadAt/WriteAt:从传进来的参数的位置开始进行读写,返回实际读写的字节数,
不会改变文件的当前位置 seekPosition。
这里不能保证文件的读写请求是起始或者结束于偶数字节扇区,但是磁盘只知道如何一次写入一块扇区,因此:
对于ReadAt,每次将从position开始的扇区内容读入一个临时的缓冲区,然后
只复制需要的部分数据到into缓冲区;对于WriteAt,首先读入所有需要写入的扇区,将首尾扇区不能修改的内容读入到一个临时缓冲区,然后拷贝from缓冲区需要的数据到临时缓冲区,最后再将临时缓冲区的数据写入磁盘。
I. Synchdisk.h:
Nachos模拟的磁盘是异步设备。当发出访问磁盘的请求后立刻返回,当从磁盘读出或写入数据结束后,发出磁盘中断,说明一次磁盘访问真正结束。
Nachos是一个多线程的系统,如果多个线程同时对磁盘进行访问,会引起系统的混乱。所以必须限制:同时只能有一个线程访问磁盘,且当发出磁盘访问请求后,必须等待访问的真正结束。这两个限制就是实现同步磁盘的目的。
这个类提供了一个抽象,即任何一个独立的线程发出请求,等会等待直到操作结束才会返回。 J. Synchdisk.cc:
1) DiskRequestDone:磁盘中断时调用的处理函数,这里调用disk的成员函数
RequestDone。
2) ReadSector:读一个磁盘扇区到一个缓冲区,直到数据读完才返回一次。执行过
程如下: ? ? ? ?
加锁(一次只允许一个磁盘I/O) 对磁盘进行读访问请求 等待磁盘中断 释放锁(访问结束)
3) WriteSector:类比ReadSector。
4) RequestDone:磁盘中断的处理函数,唤醒任一等待磁盘请求结束的线程。 K.
7. /nachos-3.4/code/test/:
A. start.s:
在test目录下的start.s模块中描述了具体的系统调用过程,以Halt系统调用为例:
.globl Halt
.ent
Halt
//在r2寄存器中存放系统调用的类别码SC_Halt,
Halt:
addiu $2,$0,SC_Halt syscall j
8.
$31 Halt
.end
即Halt系统调用
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库nachos代码阅读--xq(4)在线全文阅读。
相关推荐: