MIT 6.s081 实验解析——labs2

系列文章目录

MIT 6.s081 实验解析——labs1
MIT 6.s081 实验解析——labs2


文章目录

  • 系列文章目录
  • 测试判断流程
    • System call tracing
    • sysinfo![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/ab9ca34f1fc64b6aa1df74613dc1a397.png)


测试判断流程

  1. 完成代码后将.c文件放入user文件夹中
  2. 在makefile文件的UPROGS处添加要测试的文件,如要添加的是sleep.c,则写为_sleep。
    在这里插入图片描述
  3. 重新编译xv6
make qemu
  1. 退出qemu,在文件夹下输入
./grade-lab-util <文件名>//以sleep为例
./grade-lab-util sleep

System call tracing

在这里插入图片描述

trace 32 grep hello README

以上述指令来说,这个实验想要实现的效果是,跟踪grep hello README过程中所有的系统调用,其中32为掩码,是要跟踪的系统调用种类,将32变为2进制,根据下图,在要跟踪的系统调用位置置1。在这里插入图片描述
所以先更改kernel/proc.h的进程结构体,新增掩码:

    struct proc {...int mask;};

为了实现进程间传递参数,需添加对mask的拷贝,在kernel/proc.c的fork定义中:

    intfork(void){...// Cause fork to return 0 in the child.np->trapframe->a0 = 0;np->mask = p->mask;...}

接下来就是要去完成系统调用 trace 的函数定义,在该系统调用会接收用户态传递的参数,并将其赋值给mask,我们将定义写在kernel/sysproc.c中:

    uint64sys_trace(void){int n;argint(0,&n);//接收参数myproc()->mask = n;//赋给maskreturn 0;}

为了在syscall中能调用sys_trace,我们需要将其函数入口地址存入数组static uint64 (*syscalls[])(void)中,在其末尾加入[SYS_trace] sys_trace,即可。
最后我们要在syscall调用完系统调用后,通过本进程的mask来确认这个系统调用是不是被追踪的,若是则输出相关信息,为了方便信息输出,我们为其定义一个字符串数组,修改的文件为kernel/syscall.c:

    char *str[]={[SYS_fork]    "syscall fork",[SYS_exit]    "syscall exit",[SYS_wait]    "syscall wait",[SYS_pipe]    "syscall pipe",[SYS_read]    "syscall read",[SYS_kill]    "syscall kill",[SYS_exec]    "syscall exec",[SYS_fstat]   "syscall fstat",[SYS_chdir]   "syscall chdir",[SYS_dup]     "syscall dup",[SYS_getpid]  "syscall getpid",[SYS_sbrk]    "syscall sbrk",[SYS_sleep]   "syscall sleep",[SYS_uptime]  "syscall uptime",[SYS_open]    "syscall open",[SYS_write]   "syscall write",[SYS_mknod]   "syscall mknod",[SYS_unlink]  "syscall unlink",[SYS_link]    "syscall link",[SYS_mkdir]   "syscall mkdir",[SYS_close]   "syscall close",[SYS_trace]   "syscall trace",};voidsyscall(void){int num;struct proc *p = myproc();num = p->trapframe->a7; //系统调用号if(num > 0 && num < NELEM(syscalls) && syscalls[num]) {// Use num to lookup the system call function for num, call it,// and store its return value in p->trapframe->a0p->trapframe->a0 = syscalls[num](); //系统调用的返回值if((p->mask >> num) & 1) //若该系统调用被跟踪printf("%d: %s -> %d\n",p->pid,str[num],p->trapframe->a0);//输出信息} else {printf("%d %s: unknown sys call %d\n",p->pid, p->name, num);p->trapframe->a0 = -1;}}

描述一下整个系统调用的流程:核心点就在于可以通过usys.pl文件里对系统调用的定义,使得可以在用户空间调用系统调用。
在这里插入图片描述
在用户空间的trace.c定义了trace调用,然后通过ECALL指令触发向内核态的切换,将对应的系统调用号和参数存入寄存器,切换至内核态之后由syscall函数对调用进行响应,然后调用对应的系统调用。处理完成之后将结果返还给用户空间,再切换回用户态,完成一次系统调用。

sysinfo在这里插入图片描述

整体流程和trace差不多,获取非unused的进程数,核心就是遍历进程结构体数组proc,并判断其元素的state。

    uint64 get_used_proc(){struct proc *p;uint64 n = 0;for(p = proc; p < &proc[NPROC]; p++) {if(p->state != UNUSED) n++;}return n;}

获取空闲内存,通过查看文件kernel/kalloc.c可知每个物理内存页的单位是PGSIZE=4096字节, 以一个单链表的形式管理空闲内存页,我们只需遍历该单链表获取空闲页数,每页计一个PGSIZE即可。

    uint64 get_free_memory(){uint64 n=0;struct run* r = kmem.freelist;while(r){r=r->next;n += PGSIZE;}return n;}

将这些信息填入sysinfo结构体,然后返还给用户空间。

    uint64 sys_sysinfo(){uint64 st;argaddr(0, &st);//获取从用户空间传入的指针。struct sysinfo p;//将信息存在结构体中p.nproc = get_used_proc();p.freemem = get_free_memory();if(copyout(myproc()->pagetable, st, (char *)&p, sizeof(p)) < 0)//拷贝回用户空间return -1;return 0;}

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

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

相关文章

【温故而知新】JavaScript的数组常用方法

一、概念 在JavaScript中&#xff0c;数组是一种数据结构&#xff0c;用于存储和操作有序的元素集合。这些元素可以是不同的数据类型&#xff0c;包括数字、字符串、布尔值、对象或函数等。 JavaScript中的数组具有以下特点&#xff1a; 动态长度&#xff1a;JavaScript的数…

MyBatis接口的方法上使用,定义对应的 SQL 操作

目录标题 一、Mapper&#xff1a;二、Select、Insert、Update、Delete&#xff1a;三、Results、Result&#xff1a;四、Param&#xff1a;五、# 和 $&#xff1a; MyBatis 是一款基于 Java 的持久层框架&#xff0c;它通过简化数据库操作来帮助开发者构建更好的数据库访问应用…

day08 反转字符串 反转字符串Ⅱ 替换数字 翻转字符串里的单词 右旋转字符串

题目1&#xff1a;344 反转字符串 题目链接&#xff1a;344 反转字符串 题意 字符串是数组的形式&#xff0c;使用O(1)的空间将字符串反转 双指针法 法一 代码 class Solution { public:void reverseString(vector<char>& s) {for(int i0,js.size()-1;i<s.s…

YoloV8改进策略:Shape-IoU,考虑边框形状与尺度的度量

摘要 本文尝试使用最新的Shape-IoU改进YoloV8,在我自己的数据集上实现了涨点。 论文:《Shape-IoU:考虑边框形状与尺度的度量》 https://arxiv.org/pdf/2312.17663.pdf 作为检测器定位分支的重要组成部分,边界框回归损失在目标检测任务中发挥着重要作用。现有的边界框回归…

2024年中国股市会发生怎样的格局变化?

&#xff08;1&#xff09; 本来桌面上坐了四个利益方&#xff1a; 主力 北上 游资 散户 &#xff08;1&#xff09; 主力有两种&#xff0c;一种是国家队&#xff0c;是压舱石&#xff0c;不能乱动&#xff0c;是稳定政府方投资的各种中特估金特估、科创专精特新。不能让政府的…

linux中最常用的网络命令

文章目录 linux中最常用的网络命令查看网络信息的原初 ifconfig默认无参数使用-s显示短列表配置IP地址修改MTU启动关闭网卡 网络中不中&#xff0c;先看ping行不行语法不加任何参数发送指定数目设定发送时间间隔组合使用 Linux ip命令显示网络设备设置IP地址启动关闭网卡统计方…

MIML-DA

图3呢&#xff1f;且作者未提供代码

C#编程-显示运算符重载

重载函数的概念也可以应用于运算符。在将C#运算符应用到用户定义的数据类型时,运算符重载为它们提供额外的能力。只可以重载预定义的C#运算符组。 运算符重载的必要性 大多数内置数据类型都有与它们相关的预定义运算符。例如:带有运算符+、-、*和/的C#数据类型int为数学运算…

【大数据】基于 Flink CDC 构建 MySQL 和 Postgres 的 Streaming ETL

基于 Flink CDC 构建 MySQL 和 Postgres 的 Streaming ETL 1.准备阶段1.1 准备教程所需要的组件1.2 下载 Flink 和所需要的依赖包1.3 准备数据1.3.1 在 MySQL 数据库中准备数据1.3.2 在 Postgres 数据库中准备数据 2.启动 Flink 集群和 Flink SQL CLI3.在 Flink SQL CLI 中使用…

STL标准库与泛型编程(侯捷)笔记1

STL标准库与泛型编程&#xff08;侯捷&#xff09; 本文是学习笔记&#xff0c;仅供个人学习使用。如有侵权&#xff0c;请联系删除。 参考链接 Youbute: 侯捷-STL标准库与泛型编程 B站: 侯捷 - STL Github:STL源码剖析中源码 https://github.com/SilverMaple/STLSourceCo…

Java流程控制的陷阱

文章目录 1. switch中break的作用2. switch支持的数据类型3. else隐含的条件4. 省略花括号的陷阱5. for循环的结构6. 使用标签跳出双层for循环 流程控制三种&#xff1a;顺序结构、分支结构、循环结构 分支机构两种&#xff1a;if语句、switch语句 循环结构&#xff1a;while循…

JumpServer一键安装脚本

JumpServer 一键安装命令如下&#xff1a; curl -sSL https://resource.fit2cloud.com/jumpserver/jumpserver/releases/latest/download/quick_start.sh | bash上述quick_start.sh脚本详细内容如下&#xff1a; #!/usr/bin/env bash #VERSIONv3.10.1 DOWNLOAD_URLhttps://re…

【APACHE】的认识和基础配置参数

#主页传送:江南的江 #每日鸡汤&#xff1a;人生没有如果和假设&#xff0c;只有后果和结果。生活有进有退&#xff0c;输什么也不能输心情。生活简单就是迷人的&#xff0c;学会简单其实就是不简单。要学会平静地接受现实&#xff0c;学会对自己说声顺其自然&#xff0c;学会坦…

MS4553S用于开漏模式和推拉模式的 2bit 双向电平转换器,可替代TXS0102/PCA9306等

产品简述 MS4553S 是一款双向电平转换器&#xff0c;可以用作混合电压的数字信 号系统中。其使用两个独立构架的电源供电&#xff0c; A 端供电电压范围是 1.65V 到 5.5V &#xff0c; B 端供电电压范围是 2.3V 到 5.5V 。可用在电压为 1.8V 、 2.5V 、 3.3V 和 5V 的信号转…

C++系列十四:结构体

C中的结构体 一、结构体的定义 在C中&#xff0c;结构体是一种自定义的数据类型&#xff0c;它允许我们将不同类型的数据组合在一起。结构体可以包含任意类型的数据&#xff0c;包括基本数据类型、指针、数组、其他结构体等。 定义结构体的语法如下&#xff1a; struct 结构…

目前最完整的WebRTC资源平台 —— 筑梦之路

webrtcwork.com 是一个非常好的网站&#xff0c;笔者从那里获得了很多有价值的学习资源&#xff0c;比如服务器端压力测试&#xff0c;商业WebRTC部署等资料。 地址&#xff1a;webrtcwork - Resources for those working with WebRTC 做个笔记

如何用UE5 的小白人替换成自己的 metahumen 数字人

1、用QuixelBridge 插件导入制作好的metahumen数字人 2、创建项目时如有选择第三人称游戏&#xff0c;在内容目录中找到第三人称游戏小白人的蓝图类&#xff0c;对其进行复制一个&#xff0c;重命名&#xff0c;我这里命名为BP_METAHUMEN&#xff0c; 并移到Metahumen目录下方便…

安全基础~信息搜集3

文章目录 知识补充APP信息搜集php开发学习理解漏洞 知识补充 端口渗透总结 python Crypto报错&#xff1a;https://blog.csdn.net/five3/article/details/86160683 APP信息搜集 1. AppInfoScanner 移动端(Android、iOS、WEB、H5、静态网站)信息收集扫描工具 使用教程 演示&…

第三十八周周报:文献阅读 +BILSTM+GRU+Seq2seq

目录 摘要 Abstract 文献阅读&#xff1a;耦合时间和非时间序列模型模拟城市洪涝区洪水深度 现有问题 提出方法 创新点 XGBoost和LSTM耦合模型 XGBoost算法 ​编辑 LSTM&#xff08;长短期记忆网络&#xff09; 耦合模型 研究实验 数据集 评估指标 研究目的 洪…

适合前后端开发的可视化编辑器(拖拽控件)

分享一个面向研发人群使用的前后端分离的低代码软件——JNPF。 JNPF与市面上其他的低代码&#xff08;轻流、宜搭、微搭、简道云、轻流、活字格等等&#xff09;&#xff0c;后者更倾向于非编程人员使用&#xff0c;让业务线人员自行构建应用程序。而 JNPF 这款低代码产品是面向…