【MIT 6.S081】Lab2: system calls

本Lab包括两个简单系统调用的实现,进一步熟悉系统调用接口。
笔者用时约1.5h

概述

根据文档说明,当我们添加一个系统调用时,比如第一个任务是添加一个trace,需要进行以下操作:

  • 首先将系统调用的原型添加到user/user.h中,比如trace函数接收一个参数作为掩码,其函数原型如下图所示。

在这里插入图片描述

  • 然后添加一个存根到user/usys.pl中,如下图所示。

在这里插入图片描述

  • 将系统调用编号添加到kernel/syscall.h中,如下图所示。

在这里插入图片描述

  • kernel/sysproc.c中添加相关的系统调用函数即可,如sys_trace函数,实现对应的功能即可。

在这里插入图片描述

Tracing

该部分需要我们实现一个系统调用追踪功能,需要一个参数mask进行系统调用掩码设置(每一位表示是否追踪该编号的系统调用,比如第1位为1,则表示想要追踪系统调用编号为1的系统调用,即fork,系统调用编号定义在syscall.h文件中),跟踪所设置的系统调用,输出进程编号、系统调用名称和返回值等信息。

按照概述中的描述添加好必要的变量之后与函数声明之后,需要实现kernel/sysproc.c中的sys_trace函数。
首先,需要获取用户空间中的参数mask,参考kernel/sysproc.c中其他函数的实现(比如sys_exit函数),不难看出使用argint函数即可获取整形参数。
获取到参数之后,需要在进程状态结构体中(定义在kernel/proc.c中)多维护一个字段,即当前的追踪掩码,并修改fork函数(定义在kernel/proc.c中)使得子进程也继承这个掩码。
最后,在syscall函数(定义在kernel/syscall.c中)即将返回时,根据掩码判断当前系统调用的编号是否被追踪,如果被追踪则输出相关信息即可(需要添加一个系统调用名称数组方便输出)。

Sysinfo

这一部分需要我们实现一个能够收集系统活跃进程数nprocstate字段不为UNUSED的进程数)和系统剩余内存空间字节数freemem的系统调用。

同样按照概述所说在各个文件中添加信息,然后开始实现sys_sysinfo函数。
首先,利用预先定义好的结构体sysinfo(定义在kernel/sysinfo.h中)获取空闲内存量和进程数。
获取空闲内存量需要在kernel/kalloc.c中添加一个函数,通过将结构体指针作为参数,访问其中定义的kmem结构体中维护的一个链表(链表中每一个节点都表示4096个字节的空间),并计算空闲内存,赋值给结构体指针指向的freemem进行空闲内存量的返回。
获取进程数需要在kernel/proc.c中添加一个函数,也是通过将结构体指针作为参数,遍历系统中维护的进程数组,计算活跃进程数并赋值给指针指向的nproc进行返回即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值