这是我参与「第五届青训营 」笔记创作活动的第十五天,今天继续学习xv6操作系统课程。今天主要内容是完成Lab2实验内容。
trace
题目描述:在本作业中,您将添加一个系统调用跟踪功能,该功能可能会在以后调试实验时对您有所帮助。您将创建一个新的trace系统调用来控制跟踪。它应该有一个参数,这个参数是一个整数“掩码”(mask),它的比特位指定要跟踪的系统调用。例如,要跟踪fork系统调用,程序调用trace(1 << SYS_fork),其中SYS_fork是kernel/syscall.h中的系统调用编号。如果在掩码中设置了系统调用的编号,则必须修改xv6内核,以便在每个系统调用即将返回时打印出一行。该行应该包含进程id、系统调用的名称和返回值;您不需要打印系统调用参数。trace系统调用应启用对调用它的进程及其随后派生的任何子进程的跟踪,但不应影响其他进程。
实现:根据提示直接依次修改 user/user.h、user/usys.pl、kernel/syscall.h、user/usys.pl 和 kernel/sysproc.c即可,主要是用于熟悉一个系统调用命令的编译生成过程
Sysinfo
题目描述:在这个作业中,您将添加一个系统调用sysinfo,它收集有关正在运行的系统的信息。系统调用采用一个参数:一个指向struct sysinfo的指针(参见kernel/sysinfo.h)。内核应该填写这个结构的字段:freemem字段应该设置为空闲内存的字节数,nproc字段应该设置为state字段不为UNUSED的进程数。我们提供了一个测试程序sysinfotest;如果输出“sysinfotest: OK”则通过。
实现:依旧以上面的流程进行sys_sysinfo系统调用命令的添加,以及还要实现进程数和空余内存的统计。进程数可以直接遍历进程数组找到所有状态不为UNUSED的进程即可,而内存则需要通过一个全局计数器在分配和使用内存时动态更新,则可直接获取,或者采用遍历链表的方式也行。
实验收获
本实验主要是学习了用户命令与系统调用命令的区别以及实现,能在实验的过程中了解到系统命令的创建过程及调用过程。