/ Lesson  

NachosProject2笔记

UserKernel 继承自 ThreadedKernel。
整个需要装入的进程是一个 machine.CoffSection 类型的对象
对 java 文件操作进行包装,向上提供为 StubFileSystem 的接口。

用户进程是通过UserProcess.load 方法将程序载入内存的。而每个可执行文件用一个 Coff 对象包装。对传入的每个文件名, load 方法先根据文件名读取该文件,然后将文件作为构造方法参数构造一个 Coff 对象,在 Coff 对象中,会对文件进行一个整体的解析,获取代码段
( CoffSection)数目、程序入口等信息,并构造代码段。然后 load方法会获取该程序的每段代码段,统计页的数目和参数的数目,参数会占一页内存,进而将代码段和参数按页载入内存。

在 test 目录 stdio.h 中,可以看到 typedef int FILE,说明 c 代码中的 FILE 是该文件的
标识符。
对于创建文件、打开文件、关闭文件、读取文件以及删除文件,在 handleSyscall 方
法中模仿 halt 的写法,依赖 syscall.h 中各个系统调用的参数值,分别书写
handleFileCreate、 handleFileOpen、 handleFileClose、 handleFileRead、 handleFileUnlink
方法,传入对应的参数,通过 ThreadedKernel.fileSystem(第 9 条提示)可以调用到
系统已经实现的 StubFileSystem,进行各类文件操作。
对于文件的创建及打开,会返回整型文件描述符,不存在返回-1。可向 open 方法
中传入一个文件名,检查返回是否是-1 进而确定文件是否存在。文件读写都要传入
文件标识符、缓冲区数组、读取/写入的字节数,会返回实际读写的字节数。关闭
和删除传入的参数不同,但都是通过返回 0 来表示操作成功, -1 表示错误发生。

从当前进程中取用FileDesc,从内存中取用FilenamePtr