操作系统小学期汇报 https://www.ypppt.com/ 目 录 1 任务描述 2 T a s k 1 3 T a s k 2 4 T a s k 3 5 T a s k 4 01 任务描述 基于xv6操作系统实现ps命令 任务2 添加信号 任务0 任务1 环境配置 实现进程相关的系统调用 任务3 任务4 实现虚拟文件系统 /proc 实现 ps 命令 任务0:相关环境配置 02 任务1 实现进程相关的系统调用 #1:getppid 步骤 • 在include/sysnum.h文件中,添加新系统 调用号的宏定义 • 在syscall.c文件中,添加功能函数的声明, 并更新系统调用表 • 在sysproc.c文件中,实现sys_getppid函 数的功能 • 在user.h文件中,添加新系统调用封装后的 函数声明。 • 在usys.pl文件末尾,添加新条目 • 添加测试代码 #2:times 实现思路 • 为每个进程维护一个tms结构体 • 在proc结构体中新增两个成员,分别表示进 程上次从用户态转为内核态和从内核态转为用 户态的时间 • 封装一个函数,用于返回当前时间,可以选择 使用r_time还是ticks • 在trap.c和proc.c等进程状态切换的位置, 更新这些成员 • 在 进 程 回 收 前 , 更 新 其 父 进 程 的 cstime和 ustime成员 #2:times 实现思路 • 为每个进程维护一个tms结构体 • 在proc结构体中新增两个成员,分别表示进 程上次从用户态转为内核态和从内核态转为用 户态的时间 • 封装一个函数,用于返回当前时间,可以选择 使用r_time还是ticks • 在trap.c和proc.c等进程状态切换的位置, 更新这些成员 • 在 进 程 回 收 前 , 更 新 其 父 进 程 的 cstime和 ustime成员 #2:times 实现思路 • 为每个进程维护一个tms结构体 • 在proc结构体中新增两个成员,分别表示进 程上次从用户态转为内核态和从内核态转为用 户态的时间 • 封装一个函数,用于返回当前时间,可以选择 使用r_time还是ticks • 在trap.c和proc.c等进程状态切换的位置, 更新这些成员 • 在 进 程 回 收 前 , 更 新 其 父 进 程 的 cstime和 ustime成员 #3:getmem 实 现 思 路 getmem() 以 KiB(1024字节)为单位返回进程的虚拟 内存大小。 03 任务2 任务2需要完善alarm、pause、signal、kill系统调用以实现 信号相关功能 系统调用alarm 在这部分我们将实现一个新的系统调用 unsigned int alarm(unsigned int seconds) ,它将在指定的时间之 后向当前进程发送 SIGALARM 信号,这里无需实现信号接收部分,也就是说发出 SIGALARM 信号仅仅 kill() 掉 进程。获取滴答数之前给当前进程上锁、获取滴答数之后释放锁。 系统调用pause 在这部分,需要实现系统调用 void pause()。pause 暂停当前进程, 直到接收到一个信号。 系统调用signal 这个复杂的函数原型表示 signal() 接受两个参数:sig 和 func ,func 指定接 收信号 sig 时的处理函数,这个函数必须以一个 int 作为参数并且其返回 类型为 void。 signal() 函数返回一个同类型的函数,这是 sig 信号的旧处理函数,或者以 下两个特殊值中的其中一个: 1. SIG_IGN 忽略此信号; 2. SIG_DFL 为默认操作,即终止进程。 在这一步中,只需要支持 SIG_IGN (=1, 忽略) 和 SIG_DFL (=0,默认操作, 即终止进程)。 如果第二个参数为一函数(非 SIG_DFL 或 SIG_ING ),那么收到信号 时就需要利用此函数来处理。 (信号处理函数只能运行在用户态) 系统调用signal 系统调用kill 到目前为止,我们只能通过 alarm 发出信号,但这一 系统调用只能用于在进程内发送与接收信号。 我们已经提到过利用 kill 可以在不同进程间发信号, 但 xv6 中已有的 kill 只能终止其他进程,而不能像我们 希望的那样,向其他进程发出信号。所以在这一部分, 我们需要将 kill(int pid) 扩展为 kill(int pid, int sig) ,使 得 kill()能够: 1. 向由 pid 指定的进程发送信号; 2. 发送任意信号,例如 SIGINT 和 SIGALARM 。 04 任务3 实现虚拟文件系统 /proc 实现思路 在 xv6 中,一个文件即为一个索引结点 inode , inode 中含有读写文件内容以及构成 inode 数据 的函数。这些 inode 函数将会调用硬件接口, 但事实上/proc 在磁盘上并不存在。 这里用32位文件分配表fat32来支持文件系统, 由于fat32不支持inode,这里定义结构体目录 项dirent来存储文件内容及其相关数据 实现思路 从分配表中读文件 初 始 化 文 件 分 配 表 写 入 分 配 表 05 任务4 基于之前完成的工作实现ps命令 实现思路 利用以上完成的各项任务来实现 ps 实现思路 sysproc中procps()函数获取各个程序的info,通过procps执行 proc_ps使用copyout2()将进程信息拷贝到内核。 系统中输入指令ps,执行sysproc中的procps,获取各个程序 info,procps执行proc_ps,把程序信息拷贝到内核,procinfo 中就是ps显示的内容。 感谢您的观看!