系统调用Open基本流程
(1)通过寄存器r4获得文件名指针
(2)使用文件名指针通过已经实现ReadMem函数获得文件名 (3)通过已经实现得Open函数打开文件 (4)返回值(打开文件数据结构)写入寄存器r2 (5)通过函数PC_advance更新PC
系统调用Close定义
void Close(OpenFileId id); 系统调用Close基本流程
(1)通过寄存器r4获得打开文件数据结构 (2)通过打开文件数据结构析构函数关闭文件 (3)通过函数PC_advance更新PC
系统调用Read定义
int Read(char *buffer, int size, OpenFileId id); 系统调用Read基本流程
(1)通过寄存器r4获得缓冲区指针,通过寄存器r5获得数据长度,通过寄存器r6获得打开文件数据结构
(2)通过已经实现得Read函数读取文件相关内容,记录实际读出字节数 (3)通过已经实现得WriteMem函数将文件内容写入缓冲区
(4)返回值(实际读出字节数)写入寄存器r2 (5)通过函数PC_advance更新PC
系统调用Write定义
void Write(char *buffer, int size, OpenFileId id); 系统调用Write基本流程
(1)通过寄存器r4获得缓冲区指针,通过寄存器r5获得数据长度,通过寄存器r6获得打开文件数据结构
(2)通过已经实现得ReadMem函数获得缓冲区数据 (3)通过已经实现得Write函数将缓冲区内容写入文件 (4)通过函数PC_advance更新PC
Exercise 3 编写用户程序
编写并运行用户程序,调用练习2中所写系统调用,测试其正确性。 用户程序基本思路
创建文件write、txt(系统调用Create)
打开文件read、txt(已经存在,内容hello_world)(系统调用Open) 打开文件write、txt(系统调用Open)
读入文件read、txt内容,记录读入字节数(系统调用Read) 内容写入文件write、txt(系统调用Write) 关闭文件read、txt(系统调用Close) 关闭文件write、txt(系统调用Close)
用户程序得添加 修改test/MakeFile
all: halt shell matmult sort test1 test1、o: test1、c
$(CC) $(CFLAGS) -c test1、c
test1: test1、o start、o
$(LD) $(LDFLAGS) start、o test1、o -o test1、coff 、、/bin/coff2noff test1、coff test1
用户程序得执行
检查userprog文件夹,出现文件write、txt
可以发现,相关内容顺利写入,符合实际 三、执行用户程序相关得系统调用 Exercise 4 系统调用实现
实现如下系统调用:Exec,Fork,Yield,Join,Exit。Syscall、h文件中有这些系统调用基本说明。 系统调用Exec定义
SpaceId Exec(char *name); 系统调用Exec基本流程
(1)通过寄存器r4获得文件名指针
(2)建立线程,通过函数exec_func执行用户程序 (3)返回值(线程ID)写入寄存器r2 (4)通过函数PC_advance更新PC 函数exec_func基本流程
(1)使用文件名指针通过已经实现ReadMem函数获得文件名 (2)通过已经实现得Open函数打开文件
(3)通过已经实现得AddrSpace得构造函数初始化地址空间 (4)通过已经实现得InitRegisters函数初始化寄存器 (5)通过已经实现得RestoreState函数装载页表 (6)通过已经实现得Run函数运行用户程序 重要部分可以仿照StartProcess函数实现
系统调用Fork定义
void Fork(void (*func)()); 系统调用Fork基本流程
(1)通过寄存器r4获得函数位置 (2)复制当前进程地址空间
注意到AddrSpace得构造函数需要打开文件作为输入,所以增加线程属性,记录当前线程对应打开文件得名称,实现Fork函数时,需要逐页复制页表内容 (3)建立线程,执行函数fork_func (4)通过函数PC_advance更新PC
函数Fork_func基本流程 (1)设置当前线程地址空间
(2)通过已经实现得InitRegisters函数初始化寄存器 (3)通过已经实现得RestoreState函数装载页表 (4)设置当前线程PC