MIT 6s081 lab2:system calls

这篇具有很好参考价值的文章主要介绍了MIT 6s081 lab2: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获取空闲的内存数量文章来源地址https://www.toymoban.com/news/detail-802354.html

// 根据全局进程数组中进程状态不为
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 sysinfo

  if(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 memory
  sinfo.freemem = get_free_memory();

  // collect the number of processes
  sinfo.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

到了这里,关于MIT 6s081 lab2:system calls的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • mit s0681 lab2 Trace系统调用实现

    实验一 实现一个用户级别的程序,功能为,指定系统调用后,跟踪程序的系统调用情况 分析实验 实验目标为实现一个程序去跟踪指定程序的系统调用。因此目标有两个 实现一个程序 跟踪目标程序的系统调用 实现1,就需要在用户这边实现一个trace的相关程序,接收监控的

    2024年02月11日
    浏览(34)
  • MIT 6.S081 Lab Three

    本文为 MIT 6.S081 2020 操作系统 实验三解析。 MIT 6.S081课程前置基础参考: 基于RISC-V搭建操作系统系列 在本实验中,您将探索页表并对其进行修改,以简化将数据从用户空间复制到内核空间的函数。 开始编码之前,请阅读xv6手册的第3章和相关文件: * kernel/memlayout.h* ,它捕获了

    2024年02月09日
    浏览(44)
  • 【MIT 6.S081】Lab7: Multithreading

    本Lab比较简单,就是为xv6添加一个用户级的多线程功能,然后熟悉一下Linux下多线程编程。 笔者用时约2h 这一部分的代码不涉及内核代码,所以也比较简单,根据提示修改 user/uthread.c 中的代码即可。仿照内核中进程转换函数 swtch 的实现即可。首先,添加一个 context 上下文结

    2023年04月09日
    浏览(34)
  • 「实验记录」MIT 6.824 Raft Lab2C Persist

    MIT-6.824 2020 课程官网 Lab2: Raft 实验主页 simviso 精品付费翻译 MIT 6.824 课程 Paper - Raft extended version source code 的 Gitee 地址 Lab2C: Persist 的 Gitee 地址 课程官网提供的 Lab 代码下载地址,我没有访问成功,于是我从 Github 其他用户那里 clone 到干净的源码,有需要可以访问我的 Gitee 获取

    2024年02月08日
    浏览(75)
  • 「实验记录」MIT 6.824 Raft Lab2A Leader Election

    MIT-6.824 2020 课程官网 Lab2: Raft 实验主页 simviso 精品付费翻译 MIT 6.824 课程 source code 的 Gitee 地址 Lab2A: Leader Election 的 Gitee 地址 课程官网提供的 Lab 代码下载地址,我没有访问成功,于是我从 Github 其他用户那里 clone 到干净的源码,有需要可以访问我的 Gitee 获取 提出 Raft 的主要

    2024年02月05日
    浏览(36)
  • MIT6.S081 - Lab1: Xv6 and Unix utilities

    可以参考 user/echo.c , user/grep.c 和 user/rm.c 文件 如果用户忘记传递参数, sleep 应该打印一条错误消息 命令行参数传递时为字符串,可以使用 atoi 函数将字符串转为数字 使用系统调用 sleep ,有关实现 sleep 系统调用的内核代码参考 kernel/sysproc.c (查找 sys_sleep ),关于可以从用户程序

    2024年04月16日
    浏览(58)
  • MIT 6.S081 Operating System/Fall 2020 macOS搭建risc-v与xv6开发调试环境

    电脑型号:Apple M2 Pro 2023 操作系统:macOS Ventura 13.4 所以我的电脑是arm64架构的M2芯片 执行安装脚本 /bin/zsh -c \\\"$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)\\\" 镜像选哪个都无所谓,我选择的是阿里巴巴 查看安装是否成功 brew --version 执行brew的安装脚本 这步需要先安装

    2024年02月08日
    浏览(54)
  • MIT 6.S081学习笔记(第〇章)

    本文涉及 xv6 《第零章 操作系统接口》相关,主要对涉及的进程、I/O、文件描述符、管道、文件等内容产生个人理解,不具有官方权威解释; 文章的目录与书中的目录没有严格的相关性; 文中会有问题 (Question) 字段,这来源于对 xv6 book 的扩展; 文中涉及的代码均能在macOS

    2024年02月09日
    浏览(48)
  • lab2 bomblab

    通过下面这个文件可以发现,read_line函数的结果rax放入了rdi寄存器,也就是作为phase_1函数的第一个参数,然后调用了phase_1函数 在phase_1函数中,又将0x402400放入esi寄存器,调用了strings_not_equal函数。 此时rdi寄存器存的是readline函数的结果,esi寄存器存的是一个地址,分别作为

    2024年02月15日
    浏览(34)
  • MIT6.S081学习笔记--lec 1

    abstract H/W 抽象化硬件 multiplex 多路复用 isolation 隔离性 sharing 共享(进程通信,数据共享) security / access control 安全性/权限控制 performance 性能/内核开销 range of applications 多应用场景 操作系统应该提供的功能:1. 多进程支持 2. 进程间隔离 3. 受控制的进程间通信 xv6 :一种在本

    2024年02月16日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包