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

目录

    • 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 截图

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大模型学习

大模型的参数量和显存占用估算 现在业界的大语言模型都是基于transformer模型的&#xff0c;模型结构主要有两大类&#xff1a;encoder-decoder&#xff08;代表模型是T5&#xff09;和decoder-only&#xff0c;具体的&#xff0c;decoder-only结构又可以分为Causal LM&#x…

【Linux Shell】10. 函数

文章目录 【 1. 函数的定义 】【 2. 函数参数 】 【 1. 函数的定义 】 所有函数在使用前必须定义 。这意味着必须将函数放在脚本开始部分&#xff0c;直至shell解释器首次发现它时&#xff0c;才可以使用。 调用函数仅使用其函数名即可 。 函数返回值在调用该函数后通过 $? 来…

一文搞定JMM核心原理

公众号《鲁大猿》&#xff0c;寻精品资料&#xff0c;帮你构建Java全栈知识体系 www.jiagoujishu.cn &#xff08;架构技术.cn&#xff09; JMM引入 从堆栈说起 JVM内部使用的Java内存模型在线程栈和堆之间划分内存。 此图从逻辑角度说明了Java内存模型&#xff1a; # 堆栈里…

消除代码冗长神器 - Lombok | @EqualsAndHashCode/@ToString注解详解

🤷 场景 Java 中所有对象的父类都是 Object 类,而 Object 类中会有默认的 equals/hashCode/toString 方法,但是有时候,这些方法需要子类去 Override。 😎 IDE 解决方案 很多 IDE 中内置了生成 equals、hashCode、toString 的功能,下面以 IDEA 为例。在类中,按 Alt …

[Kubernetes]5. k8s集群StatefulSet详解,以及数据持久化(SC PV PVC)

前面通过deployment结合service来部署无状态的应用,下面来讲解通过satefulSet结合service来部署有状态的应用 一.StatefulSet详解 1.有状态和无状态区别 无状态: 无状态(stateless)、牲畜(cattle)、无名(nameless)、可丢弃(disposable) 有状态: 有状态(stateful)、宠物(pet)…

系列九、Feign

一、Feign 1.1、Java中如何实现跨接口调用 &#xff08;1&#xff09; Httpclient Httpclient是Apache Jakarta Comon下的子项目&#xff0c;用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包&#xff0c;并且它支持HTTP协议的最新版本和建议。HttpC…

医院手麻系统商业项目源码,采用mysql+laravel+vue2框架开发,支持二开

手术麻醉系统源码&#xff0c;手麻系统源码 手术麻醉信息管理系统是数字化手段应用于手术过程中的重要组成部分&#xff0c;用数字形式获取并存储手术相关信息&#xff0c;既便捷又高效。既然是管理系统&#xff0c;那就是一整套流程&#xff0c;管理患者手术、麻醉的申请、审批…

linux安装codeserver实现云端开发

先看图 下载安装包 https://github.com/coder/code-server/releases 找到code-server-版本号-linux-amd64.tar.gz&#xff0c;我这里是code-server-4.16.1-linux-amd64.tar.gz 1、使用acrm用户登录目标服务器 2、切换root用户&#xff0c;创建 vscode 用户&#xff0c;并设…

学起来!一键转发朋友圈,告别手动复制粘贴

关于朋友圈运营&#xff0c;你还在不同账号来回切换、一个个复制粘贴文案和保存图片吗? 今天分享一个能一键转发朋友圈的神器&#xff0c;帮助你提高效率。 快速转发 在此页面展示所登录微信号的朋友圈&#xff0c;只需单击“转发”&#xff0c;就会自动复制这条朋友圈内容&a…

【花艺电商】SpringBoot集成MyBatis-Plus、Swagger2、SpringSecurity、OAuth2等技术整合开发

目录 一、功能介绍 1. 说明 2. 功能实现 3. 技术应用 二、技术详述 1.MyBatis-Plus 主要体现 项目应用 2.SpringSecurity 应用作用 三、页面展示 1. 登入 2. 主页 3. 详情 4. 购物车 5. 订单 6. 沙箱支付 每篇一获 一、功能介绍 1. 说明 这个项目主要使用了…

C++-模板与容器

1、模板 模板可以让类或者函数支持一种通用类型&#xff0c;这种通用类型在实际运行过程中可以使用任何数据类型。因此程序员可以写出一些与类型无关的代码。这种编程方式也叫“泛型编程”。 通常有两种形式&#xff1a; 函数模板类模板 1.1 函数模板 //模板类型声明 template&…

WSL使用Ubuntu 20.04版本运行py-bottom-up-attention的记录,及其可能错误的解决方法

文章目录 1. 切换linux的镜像2. 安装gcc3. 查看显卡驱动4. 安装gcc版本5. wsl安装cuda 10.16. 新建虚拟环境8. 安装依赖包9. 运行代码错误运行的所有历史命令如下 WSL使用Ubuntu 20.04版本运行py-bottom-up-attention的记录&#xff0c;及其可能错误的解决方法 github代码地址…

【产品应用】一体化伺服电机在管道检测机器人中的应用

一体化伺服电机在管道检测机器人的应用正日益受到关注。管道检测机器人是一种能够在管道内部进行检测和维护的智能化设备&#xff0c;它可以检测管道的内部结构、泄漏、腐蚀等问题&#xff0c;以确保管道的安全和稳定运行。而一体化伺服电机作为机器人的动力源&#xff0c;对于…

java基于SSM的二手交易平台设计与开发论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本二手交易平台就是在这样的大环境下诞生&#xff0c;其可以帮助使用者在短时间内处理完毕庞大的数据信息&am…

【OpenMP】 2.1 简单示例

1、C中的OMP显示构造 OpenMP在C/C中通常以编译指令的方式进行使用&#xff0c;一个指令和一个结构化块组成构造。 #pragma omp parallel [clause[[,]clause]... ]#pragma omp parallel private(x) {//并行代码 } 示例代码: #include <iostream> #include <omp.h&g…

复试 || 就业day05(2024.01.08)项目一

文章目录 前言代码模拟梯度下降构建函数与导函数函数的可视化求这个方程的最小值&#xff08;直接求导&#xff09;求方程最小值&#xff08;不令方程导为0&#xff09;【梯度下降】eta0.1eta 0.2eta 50eta 0.01画出eta0.1时的梯度下降x的变化过程 总结 前言 &#x1f4ab;你…

【EI会议征稿通知】第六届信息科学、电气与自动化工程国际学术会议(ISEAE 2024)

第六届信息科学、电气与自动化工程国际学术会议&#xff08;ISEAE 2024&#xff09; 2024 6th International Conference on Information Science, Electrical and Automation Engineering 第六届信息科学、电气与自动化工程国际学术会议&#xff08;ISEAE 2024&#xff09;定…

在Windows上使用VScode阅读kernel源码

有一说一&#xff0c;在Windows上使用Source Inside阅读kernel源码真的很舒服&#xff0c;但是有时候带着轻薄本出去&#xff0c;又不想往轻薄本上安装很多的软件&#xff0c;就使用VS code临时阅读kernel源码。如果不能进行跳转&#xff0c;阅读kernel源码就很难受&#xff0c…

使用使用maven后jstl标签库无法使用

创建maven项目后配置了jstl标签库的依赖&#xff0c;但是一直不行&#xff0c;jsp页面还是原样给我输出&#xff0c;然后去网上找了许多办法&#xff0c;类似于配置文件之类的&#xff0c;结果发现对我并没有什么用&#xff0c;还是原样输出 然后就各种查找&#xff0c;发现了一…

安卓上使用免费的地图OpenStreetMap

前一段使用了微信的地图&#xff0c;非常的好用。但是存在的问题是海外无法使用&#xff0c;出国就不能用了&#xff1b; 其实国内三家&#xff1a;百度&#xff0c;高德&#xff0c;微信都是一样的问题&#xff0c;当涉及到商业使用的时候需要付费&#xff1b; 国外除了谷歌…