当前位置: 首页 > news >正文

【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进行返回即可。

http://www.lryc.cn/news/40756.html

相关文章:

  • 设计模式之单例模式~
  • top终端详解
  • 解决一个偶现的503 bug,花了俺不少时间
  • 什么是栈,如何实现?
  • 在我的MacBook上捣鼓ESP8266
  • 【深度强化学习】(8) iPPO 模型解析,附Pytorch完整代码
  • 77.qt qml-QianWindow-V1版本界面讲解
  • RHCE学习日记二
  • Dubbo原理简介
  • JavaSE基础总结
  • 5G(NR)信道带宽和发射带宽---频率资源
  • 基于Spring Boot的酒店管理系统
  • Ae:混合模式
  • JS中的变量
  • Hadoop运行模块
  • Web自动化——前端基础知识(二)
  • NAS系列 硬件组装
  • IDAFrida
  • 通过百度文心一言大模型作画尝鲜,感受国产ChatGPT的“狂飙”
  • Nacos 注册中心 - 健康检查机制源码
  • Transformer在计算机视觉中的应用-VIT、TNT模型
  • 快速入门Zookeeper技术.黑马教程
  • 网易C++实习一面
  • 进程和线程的区别和联系
  • Java学习笔记——集合
  • 差分运放公式推导-运算放大器
  • 金丹二层 —— 字符串长度求解的四种方法
  • 深入剖析Linux——进程信号
  • API-Server的监听器Controller的List分页失效
  • jupyter notebook 进阶使用:nbextensions,终极避坑