MIT 6s081 lab 2:system calls

Lab2 : system calls

作业地址:Lab: System calls (mit.edu)

  • Add $U/_trace to UPROGS in Makefile
  • add a prototype for the system call to user/user.h, a stub to user/usys.pl, and a syscall number to kernel/syscall.h. The Makefile invokes the perl script user/usys.pl
  • Add a sys_trace() function in kernel/sysproc.c that implements the new system call by remembering its argument in a new variable in the proc structure (see kernel/proc.h). The functions to retrieve system call arguments from user space are in kernel/syscall.c, and you can see examples of their use in kernel/sysproc.c.
  • Modify fork() (see kernel/proc.c) to copy the trace mask from the parent to the child process.

1、在用户层声明接口

2、在内核中,把用户调用的参数读入,然后传给进程结构体的参数

3、在fork中,把父进程的参数拷贝给子进程

4、在syscall统一的接口中(通过确定系统调用的编号,作为函数指针数组中的索引,进而调用到具体的函数,函数调用的参数从进程的参数中获取argint函数

system call tracing(moderate)

用trace的mask对系统调用进行跟踪,打印进程号,系统调用名,和系统调用返回值

先定义系统调用号

/* kernel/syscall.h add call number */
#define SYS_trace  22
#define SYS_sysinfo 23

用数组存储系统调用号和函数指针的映射,用于后续调用

/* kernel/syscall.c add */
static uint64 (*syscalls[])(void) = {
[SYS_fork]    sys_fork,
[SYS_exit]    sys_exit,
[SYS_wait]    sys_wait,
[SYS_pipe]    sys_pipe,
[SYS_read]    sys_read,
[SYS_kill]    sys_kill,
[SYS_exec]    sys_exec,
[SYS_fstat]   sys_fstat,
[SYS_chdir]   sys_chdir,
[SYS_dup]     sys_dup,
[SYS_getpid]  sys_getpid,
[SYS_sbrk]    sys_sbrk,
[SYS_sleep]   sys_sleep,
[SYS_uptime]  sys_uptime,
[SYS_open]    sys_open,
[SYS_write]   sys_write,
[SYS_mknod]   sys_mknod,
[SYS_unlink]  sys_unlink,
[SYS_link]    sys_link,
[SYS_mkdir]   sys_mkdir,
[SYS_close]   sys_close,[SYS_trace]   sys_trace,
[SYS_sysinfo] sys_sysinfo,
};static char* syscalls_name[] = {
[SYS_fork]    "fork",
[SYS_exit]    "exit",
[SYS_wait]    "wait",
[SYS_pipe]    "pipe",
[SYS_read]    "read",
[SYS_kill]    "kill",
[SYS_exec]    "exec",
[SYS_fstat]   "fstat",
[SYS_chdir]   "chdir",
[SYS_dup]     "dup",
[SYS_getpid]  "getpid",
[SYS_sbrk]    "sbrk",
[SYS_sleep]   "sleep",
[SYS_uptime]  "uptime",
[SYS_open]    "open",
[SYS_write]   "write",
[SYS_mknod]   "mknod",
[SYS_unlink]  "unlink",
[SYS_link]    "link",
[SYS_mkdir]   "mkdir",
[SYS_close]   "close",[SYS_trace]   "trace",
[SYS_sysinfo] "sys_sysinfo",
};
void
syscall(void)
{int num;struct proc *p = myproc();num = p->trapframe->a7; // 读取系统调用号if(num > 0 && num < NELEM(syscalls) && syscalls[num]) {/* printf the system call debug message */p->trapframe->a0 = syscalls[num]();  //记录返回值if(p->mask & (1 << num)){printf("%d: syscall %s -> %d\n", p->pid, syscalls_name[num],p->trapframe->a0); // 打印trace信息}} else {printf("%d %s: unknown sys call %d\n",p->pid, p->name, num);p->trapframe->a0 = -1;}
}

Sysinfo (moderate)

用sysinfo系统调用,记录当前的进程数量和空闲内存

定义工具方法get_nproc获取进程数量,get_free_memory获取空闲的内存数量

// 根据全局进程数组中进程状态不为
int get_nproc(void)
{// struct proc proc[NPROC]; // 全局进程数组int num = 0;for(int i = 0; i < NPROC; i++) {acquire(&(proc[i].lock));if(proc[i].state != UNUSED)num++;release(&(proc[i].lock));}return num;
}
// 空闲内存是采用链表进行维护的,链表的每个节点代表一个页的空间,最后一个空闲页的next必然为NULL
int get_free_memory(void)
{struct run *r;acquire(&kmem.lock);int num = 0;/* freelist开始计算一直链表访问,直到内存终点 */r = kmem.freelist;while(r){num += PGSIZE;r = r->next;}release(&kmem.lock);return num;
}
uint64
sys_sysinfo(void)
{/* learn sys_fstat() and filestat() to copyout */uint64 addr; // user pointer to struct sysinfoif(argaddr(0, &addr) < 0) // 读取从用户空间传入的结构体指针参数的地址return -1;// addr is a user virtual address, pointing to a struct sinfo.struct proc *p = myproc();struct sysinfo sinfo;// collect the amount of free memorysinfo.freemem = get_free_memory();// collect the number of processessinfo.nproc = get_nproc();if(copyout(p->pagetable, addr, (char *)&sinfo, sizeof(sinfo)) < 0)return -1;return 0;
}

提交

make grade
$ make qemu-gdb
trace 32 grep: OK (2.8s) 
== Test trace all grep == 
$ make qemu-gdb
trace all grep: OK (0.6s) 
== Test trace nothing == 
$ make qemu-gdb
trace nothing: OK (0.9s) 
== Test trace children == 
$ make qemu-gdb
trace children: OK (9.1s) 
== Test sysinfotest == 
$ make qemu-gdb
sysinfotest: OK (1.4s) 
== Test time == 
time: OK 
Score: 35/35

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/624547.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024年1月上旬值得一读的技术文档精选

2024年1月上旬值得一读的技术文档精选 2024.1.15版权声明&#xff1a;本文为博主chszs的原创文章&#xff0c;未经博主允许不得转载。 1、RISC-V开放架构设计之道(v1.0.0) 2023 年 12 月 13 日发布的一本开源书&#xff0c;这本恰逢其时的书简明扼要地介绍了简洁、免费、开放…

力扣刷题第一天 删除排序链表中的重复元素 II

各位小伙伴们好&#xff0c;2024年到来了&#xff0c;我突然发现我好像错过了很多&#xff0c;我的才华和能力远不足以支撑我的梦想&#xff0c;我下定决心要开始为自己努力了&#xff01;希望明天的我是一个更好的我&#xff01;希望小伙伴都有一个美好的明天哦&#xff01; 示…

chrome 307状态码

问题&#xff1a;不知道什么原因导致http请求chrome始终307跳转到https,这个307的跳转非常恶心的地方是客户端缓存行为&#xff0c;并且非普通的f12下面清除缓存可以去掉 解决办法&#xff1a;使用chrome的清除浏览数据&#xff0c;通过这个方式清除&#xff0c;才能解决。 问…

精品基于Uniapp+springboot车辆充电桩缴费管理系统管理系统App-地图

《[含文档PPT源码等]精品基于Uniappspringboot充电桩管理系统App》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;Java 后台框架&#xff1a;springboot、ssm 安…

element + table 每两行对比相同值列合并

在开始之前先要明确几个概念&#xff1a; 保持不变&#xff1a;{ rowspan: 1, colspan: 1 } 删除一个单元格&#xff1a;{ rowspan: 0, colspan: 0 } 合并一个单元格&#xff1a;{ rowspan: 2, colspan: 1 } <template><div><el-table:data"tableData&quo…

Appium 自动化测试

1.Appium介绍 1&#xff0c;appium是开源的移动端自动化测试框架&#xff1b; 2&#xff0c;appium可以测试原生的、混合的、以及移动端的web项目&#xff1b; 3&#xff0c;appium可以测试ios&#xff0c;android应用&#xff08;当然了&#xff0c;还有firefoxos&#xff09;…

web自动化实现登录的几种方式

目录 前言 一、pythonunittest框架实现登录功能 二、pythonselenium实现登录功能 三、pythonrequests库实现登录功能 前言 今天主要想介绍python语言不同的自动化测试框架的结合方式来模拟登录功能。想了解自动化测试框架的同学不要错过哦&#xff01; 一、pythonunittest框…

Windows 下 QT开发环境的搭建:

下载QT:Index of /archive/qt/5.14 下载Cmake :CMake - Upgrade Your Software Build System (1)QT在windows,C, 打包exe&#xff1a; step1:window上安装QT软件&#xff1a; Windows下的QT系统开发环境搭建_qt windows-CSDN博客. step2:新建一个界面工程&#xff1a; (1)打…

【css】渐变效果

css渐变效果 使用 CSS 渐变可以在两种颜色间制造出平滑的渐变效果。 用它代替图片&#xff0c;可以加快页面的载入时间、减小带宽占用。同时&#xff0c;因为渐变是由浏览器直接生成的&#xff0c;它在页面缩放时的效果比图片更好&#xff0c;因此你可以更加灵活、便捷的调整页…

postgresql16 物理复制与逻辑复制的实现和对比

本文面向想要练习 PostgreSQL 中数据库复制基础知识但可能无法访问远程服务器的初学者。我认为学习新技术时&#xff0c;在自己的机器上运行示例以巩固概念是至关重要的。对于副本来说&#xff0c;这可能很困难&#xff0c;因为许多可用的资源假设用户具有一定的 PostgreSQL 经…

find_shape_model

*形状匹配 find_shape_model (ImageEmphasize, ModelID, -0.39, 0.78, 0.5, 1, 0.5, least_squares, [4,-2], 0.9, Row, Column, Angle, Score) *创建一个初始化矩阵 hom_mat2d_identity (HomMat2D) *从点和角度计算刚性仿射变换&#xff0c;找出模板和卡尺工具…

网页屏幕适配通透了

一&#xff0c;如果设计尺寸固定 那就按照固定尺寸开发 一般都是1920*1080 二&#xff0c;需要适配多种像素屏幕&#xff08;大屏可视化&#xff09; 可使用媒体查询设置多套css样式或者使用自适应单位&#xff0c;%&#xff0c;vw&#xff0c;vh 最好解决方案rem&#xff…

JavaScript 之 位运算

一、简介 ​ JavaScript的位运算符是将进行运算的数字&#xff08;八进制、十进制、十六进制等&#xff09;转换为32位的二进制串&#xff0c;超过 32 位的数字会丢弃其最高有效位&#xff0c;只保留后32位二进制串。然后再对每一位进行运算。但运算后得出的结果&#xff0c;会…

Python 元类 metaclass 详解

元类&#xff08;metaclass&#xff09;是 Python 中一个高级且相对较少使用的概念。元类可以被视为类的类&#xff0c;它控制类的创建过程。 一、基本概念 在 Python 中&#xff0c;一切皆对象。为了避免混淆&#xff0c;我们约定两个术语&#xff1a; 类实例&#xff1a;当…

IPv6路由综合运用

一、基础配置: SWA: sw1(config)#host swA swA(config)#ipv6 ena swA(config)# vlan 100 swA(config-vlan100)#int vlan 100 swA(config-if-vlan100)#ipv6 ena swA(config-vlan100)#ip add 172.16.1.1 255.255.255.252 swA(config-if-vlan100)#int e1/0/24 swA(conf…

教育科学杂志教育科学杂志社教育科学编辑部2023年第12期部分目录

“思政教育联合思维导图”教学模式在肝病感染控制护理临床教学中的应用 黄雪霞;陈海涵;蒋雅文 中职语文教学中厚植爱国主义情怀的要点分析 苏琴 职业素养视角下中职计算机专业课程教学改革实践 李石 产教融合背景下高职院校产业学院建设模式的实践探索 郭洋 《工程制图与CAD》课…

数据结构学习 jz31 栈的压入、弹出序列

关键词&#xff1a;模拟 栈 不太熟&#xff0c;调了好一阵子。 题目&#xff1a;https://leetcode.cn/problems/zhan-de-ya-ru-dan-chu-xu-lie-lcof/ 思路&#xff1a; 主要是利用一个辅助栈&#xff0c;来模拟这个过程&#xff0c;如果过程不行就返回失败。 int sig 0;如…

Java研学-分页查询

一 分页概述 1 介绍 将大量数据分段显示&#xff0c;避免一次性加载造成的内存溢出风险 2 真假分页 ① 真分页   一次性查询出所有数据存到内存&#xff0c;翻页从内存中获取数据&#xff0c;性能高但易造成内存溢出 ② 假分页   每次翻页从数据库中查询数据&#xff0c…

解决计算机中vcruntime140.dll错误!六种方法教你修复

什么是vcruntime140.dll文件呢&#xff1f;为什么会出现丢失的情况&#xff1f;如何解决这个问题呢&#xff1f;本文将为您详细介绍vcruntime140.dll文件的作用、丢失原因以及6个快速解决方法。 一、vcruntime140.dll是什么文件&#xff1f; vcruntime140.dll是Visual C Redi…