【MIT 6.S081】2020, 实验记录(2),Lab: System calls

news2024/11/13 10:20:59

目录

    • Task
      • Task 1: System call tracing
        • 1.1 task 说明
        • 1.2 实现过程
        • 1.3 测试

这个实验尝试自己在 OS kernel 中添加 system call。

Task

Task 1: System call tracing

1.1 task 说明

这个 task 实现在 kernel 中添加一个 trace 的系统调用,当用户调用这个系统调用并指定想要追踪哪些系统调用后,这个进程在之后发生系统调用的时候会记录下这个系统调用的相关信息。

每个 system call 都有一个对应的 number,kernel 也是通过这个 number 来知道用户想要调用哪个 system call。比如 fork 的系统调用 number 是 1,在代码中有一个 SYS_fork 来代表这个 number。

当我们把 1 << SYS_fork 作为参数(参数名为 mask)传给 trace 后,就表示我们想要查看后面发生 fork 时的相关信息。

lab 已经事先实现好了一个 user/trace.c 程序来利用 trace 这个系统调用实现一个用户级的 trace 程序,用户可以在命令行中通过 trace 命令来调用这个程序。

1.2 实现过程
  1. 在 Makefile 的 UPROGS 中添加一个 $U/_trace
  2. user/user.h 中添加一个 trace 的 system call 的 prototype:
int trace(int);
  1. usys.pl 中添加一个 entry 用来生成 user/usys.S,即用户实际调用的 stub:
entry("trace");
  1. kernel/syscall.h 中为 trace 分配一个 system call number:
#define SYS_trace  22
  1. kernel/sysproc.c 中添加一个 sys_trace() 函数,用来实现读取用户在调用 system call 时传递的参数,同时将参数 mask 记录到这个进程中,也就是 struct proc 中,其声明在 kernel/proc.h 中,每个进程可以通过 myproc() 来获取当前进程的这个结构体信息:
  • 先在 kernel/proc.h 的 struct proc 中添加一个字段用来记录 trace mask:
// Per-process state
struct proc {
  ...
  char name[16];               // Process name (debugging)
  int trace_mask;              // Mask arguments for `trace` system call
};
  • 实现 sys_trace() 函数:
uint64
sys_trace(void)
{
  int mask;

  if (argint(0, &mask) < 0) {
    return -1;
  }
  myproc()->trace_mask = mask;
  return 0;
}
  1. 修改 kernel/proc.c 中的 fork() 函数实现,让其在产生子进程时,也将父进程的 trace mask 数据复制给子进程:
int
fork(void)
{
  ...
  np->sz = p->sz;
  np->trace_mask = p->trace_mask;  // 复制 trace mask

  np->parent = p;
  ...
}
  1. 修改 kernel/syscall.c 中函数 syscall() 的函数实现,这个函数用来根据 system call number 来调用真正的 system call,我们需要根据当前进程的 trace mask 来决定当一个 system call 完成后是否 print 这次调用的相关信息:
void
syscall(void)
{
  int num;
  struct proc *p = myproc();

  num = p->trapframe->a7;
  if(num > 0 && num < NELEM(syscalls) && syscalls[num]) {
    p->trapframe->a0 = syscalls[num]();
    // system call 完成后,根据 trace mask 来决定是否 print
    if ((p->trace_mask & (1 << num)) != 0) {
      printf("%d: syscall %s -> %d\n", p->pid, syscall_names[num], p->trapframe->a0);
    }
  } else {
    printf("%d %s: unknown sys call %d\n",
            p->pid, p->name, num);
    p->trapframe->a0 = -1;
  }
}

以上完成后,这个 task 就完成了,make qemu 测试一下,看看与 Lab 的要求是否一致:

$ trace 32 grep hello README
3: syscall read -> 1023
3: syscall read -> 966
3: syscall read -> 70
3: syscall read -> 0
$
$ trace 2147483647 grep hello README
4: syscall trace -> 0
4: syscall exec -> 3
4: syscall open -> 3
4: syscall read -> 1023
4: syscall read -> 966
4: syscall read -> 70
4: syscall read -> 0
4: syscall close -> 0
$
$ grep hello README
$
$ trace 2 usertests forkforkfork
usertests starting
test forkforkfork: 407: syscall fork -> 408
408: syscall fork -> 409
409: syscall fork -> 410
410: syscall fork -> 411
409: syscall fork -> 412
410: syscall fork -> 413
409: syscall fork -> 414
411: syscall fork -> 415
...
1.3 测试

输出与 Lab 要求一致:
task-1 截图

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

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

相关文章

Python语法进阶学习--模块和包

在学习python进阶知识中的面向对象之前,还要了解一下当中几个概念:包、模块、类和函数。 一.模块和包 模块和包:用来组织Python代码的。 包 > 含有 __init__.py文件的文件夹模块 > py文件类 > class 【面向对象学习】函数&#xff08;方法&#xff09;> def 以上均…

陀螺仪LSM6DSV16X与AI集成(5)----6D方向检测功能

陀螺仪LSM6DSV16X与AI集成.5--6D方向检测功能 概述视频教学样品申请源码下载生成STM32CUBEMX串口配置IIC配置CS和SA0设置串口重定向参考程序初始换管脚获取ID复位操作BDU设置6D方向检测功能配置选择滤波和角度阈值设置量程和速率获取所有中断源的状态发送相应信息演示 概述 陀…

计算机基础面试题 |18.精选计算机基础面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

大数据StarRocks(六) :Catalog

StarRocks 自 2.3 版本起支持 Catalog&#xff08;数据目录&#xff09;功能&#xff0c;实现在一套系统内同时维护内、外部数据&#xff0c;方便您轻松访问并查询存储在各类外部源的数据。 1. 基本概念 内部数据&#xff1a;指保存在 StarRocks 中的数据。 外部数据&#xf…

【QML COOK】- 003-处理鼠标事件

1. 编辑main.qml import QtQuickWindow {width: 800height: 800visible: truetitle: qsTr("Hello World")Image {id: backgroudanchors.fill: parentsource: "qrc:/Resources/Images/arrow.png"}MouseArea {anchors.fill: parentonClicked: backgroud.rot…

Python(30):非对称加密算法RSA的使用(openssl生成RSA公私钥对)

Python(30)&#xff1a;非对称加密算法RSA的使用(openssl生成RSA公私钥对) 1、openssl生成RSA公私钥对 1.1、生成RSA公私钥对命令 [rootloaclhost ~]# openssl OpenSSL> genrsa -out rsa_private_key.pem 1024 Generating RSA private key, 1024 bit long modulus .. ...…

微服务概述之单体架构

微服务概述 互联网始于 1969年美国的阿帕网&#xff08;ARPA&#xff09;&#xff0c;最开始的阿帕网只在美国军方使用。随着时间的推移&#xff0c;一些大学也开始加入建设&#xff0c;慢慢演化成了现在的因特网 &#xff08;Internet&#xff09;。随着计算机网络的普及&…

图像融合论文阅读:CrossFuse: 一种基于交叉注意机制的红外与可见光图像融合方法

article{li2024crossfuse, title{CrossFuse: A novel cross attention mechanism based infrared and visible image fusion approach}, author{Li, Hui and Wu, Xiao-Jun}, journal{Information Fusion}, volume{103}, pages{102147}, year{2024}, publisher{Elsevier} } 论文…

1.1map

unordered_map和map的使用几乎是一致的&#xff0c;只是头文件和定义不同 #include<iostream> #include<map>//使用map需要的头文件 #include<unordered_map>//使用unordered_map需要的头文件 #include<set>//使用set需要的头文件 #include<uno…

用通俗易懂的方式讲解:如何提升大模型 Agent 的能力?

大型语言模型&#xff08;LLM&#xff09;的出现带火了Agent。利用LLM理解人类意图、生成复杂计划并且能够自主行动的能力。Agent具有无与伦比的能力&#xff0c;能够做出类似于人类复杂性的决策和完成一些复杂的工作。 目前市面上已经出现非常多得Agent框架&#xff1a;XAgen…

如何使用PR制作抖音视频?抖音短视频创作素材剪辑模板PR项目工程文件

如何使用PR软件制作抖音视频作品&#xff1f;Premiere Pro 抖音短视频创作素材剪辑模板PR项目工程文件。 3种分辨率&#xff1a;10801920、10801350、10801080。 来自PR模板网&#xff1a;https://prmuban.com/37058.html

双向逆变器流程

逆变过程 反向充电过程 首先AC整流&#xff0c;然后经过LLC电路进行DC-DC转换&#xff0c;这样就可以给电池充电了。也就是市电通过上面的电路就可以存储到电池里面。能量存储到电池里面&#xff0c;后面需要用的时候&#xff0c;也可以通过一定电路把能量释放出来。这就是逆变…

20240107让Firefly的AIO-3399J开发板的Android11下配置为默认1080p录像

20240107让Firefly的AIO-3399J开发板的Android11下配置为默认1080p录像 2024/1/7 23:01 开发板&#xff1a;Firefly的AIO-3399J【RK3399】 SDK&#xff1a;rk3399-android-11-r20211216.tar.xz【Android11】 Android11.0.tar.bz2.aa【ToyBrick】 Android11.0.tar.bz2.ab Androi…

江科大-stm32-B站系统初识笔记P2

文章目录 一&#xff1a;ARM是什么二&#xff1a;关键字介绍 推荐视频&#xff1a;《 STM32入门教程-2023版 细致讲解 中文字幕》 一&#xff1a;ARM是什么 ①&#xff1a; ST – 意法半导体 M – Microelectronics 微电子 32 – 总线宽度 ARM架构: Cortex-A:Application 应用…

linux常见操作,and一些练习题加线上练习网站,无须配置linux.持续更新中。。。。

文章目录 cd命令相对路径特殊的路径表达符和cd一起使用pwdmore 查看文件内容支持翻页小技巧clear用户&#xff0c;用户权限 and 用户的切换如何创建用户 ls和通配符的使用利用通配符 *grep 过滤管道符 |如何学习Linux在线练习网站 https://www.lanqiao.cn/courses/1 cd命令 cd…

TrueNAS数据共享——SMB共享日志审计

日志审计对于事后溯源十分重要&#xff0c;所以使用TrueNAS共享时&#xff0c;开启Samba audit审计日志功能很有必要。Full_Audit 允许记录共享上的所有操作&#xff0c;如创建文件、删除文件、更改路径… 一、编辑SMB服务 1、进入smb服务编辑 服务--找到SMB--动作--高级选项…

Notepad++ v7.7.1 安装及添加插件

1、notepad_v7.7.1.zip npp.7.7.1.Installer.x64.exe npp.7.7.1.Installer.x86.exe notepad_v7.7.1.ziphttps://www.123pan.com/s/VTMXjv-X6H6v.html 2、notepad插件包_64bit_4.zip ComparePlugin ---->文件对比插件 ComparePlugin.dllNppFTP ---->FTP、FTPES和SFTP …

python自动化运维管理拓扑

目录 1、简介 2、实验环境 3、拓扑图 4、需求及其代码 4.1、测试连通性 4.2、远程登陆 4.3、配置loopback 4.4、监控内存使用率 4.5、自动化巡检内存使用率 4.6、自动化配置snmp服务 4.7、提取分析字符串 &#x1f343;作者介绍&#xff1a;双非本科大三网络工程专业…

记一次生产事故排查

背景&#xff1a;刚接手一个新工程&#xff0c;是一个给国内top级医院开发的老项目&#xff0c;因为历史原因&#xff0c;代码质量略低&#xff0c;测试难度略高。 上线很久的功能&#xff0c;最近一直频繁的爆发各种问题&#xff0c;经排查发现都是因为在业务过程中im聊天账号…

Hyperledger Fabric 生成组织身份解析

fabric 版本 2.4.1 Fabric 网络通过证书和密钥来管理和认证成员身份&#xff0c;经常需要生成证书文件。通常这些操作可以使用 PKI 服务&#xff08;如 Fabric-CA&#xff09;或者 OpenSSL 工具来实现&#xff08;针对单个证书的签发&#xff09;。为了方便批量管理组织证书&am…