duduru

6.S081 System calls

系统调用执行过程

在这里插入图片描述

系统调用添加步骤

在这里插入图片描述

System call tracing

在这里插入图片描述

sysproc.c

uint64
sys_trace(void)
{
  int n;
  if (argint(0, &n) < 0)
    return -1;

  myproc()->trace_mask = n;
  return n;
}

proc.c

int fork(void)
{
  ...
  np->trace_mask = p->trace_mask;
}

syscall.c

void syscall(void)
{
  ...
  if (num > 0 && num < NELEM(syscalls) && syscalls[num])
  {
    p->tf->a0 = syscalls[num]();
    if (p->trace_mask > 0 && (p->trace_mask & (1 << num)))
    {
      printf("%d : syscall %s -> %d\n", p->pid, syscall_names[num], p->tf->a0);
    }
  }
  else
  {
    printf("%d %s: unknown sys call %d\n",
           p->pid, p->name, num);
    p->tf->a0 = -1;
  }
}

user/trace.c

#include "kernel/types.h"
#include "kernel/stat.h"
#include "user/user.h"

int main(int argc, char *argv[])
{
    if (argc < 3 || argv[1][0] == '0')
    {
        printf("args error.\r\n");
        exit(0);
    }

    if (trace(atoi(argv[1])) < 1)
    {
        printf("trace error.\r\n");
        exit(0);
    }

    exec(argv[2], &argv[2]);
    return 0;
}

Sysinfo

在这里插入图片描述
sysinfo.h

struct sysinfo
{
    int num_freemem;
    int num_unusedproc;
};

kalloc.c

int get_free_mem(void)
{
  struct run *r;

  acquire(&kmem.lock);
  r = kmem.freelist;
  int num = 0;
  while (r)
  {
    num++;
    r = r->next;
  }
  release(&kmem.lock);
  return num * PGSIZE;
}

proc.c

int get_proc_unused(void)
{
  struct proc *p;
  int num = 0;
  for (p = proc; p < &proc[NPROC]; p++)
  {
    acquire(&p->lock);
    if (p->state == UNUSED)
    {
      num++;
    }
    release(&p->lock);
  }
  return num;
}

sysproc.c

uint64
sys_sysinfo(void)
{
  struct sysinfo info;
  uint64 addr;
  if (argaddr(0, &addr) < 0)
  {
    return -1;
  }
  info.num_freemem = get_free_mem();
  info.num_unusedproc = get_proc_unused();
  if (copyout(myproc()->pagetable, addr, (char *)&info, sizeof(info)) < 0)
  {
    return -1;
  }
  return 0;
}

sysinfo.c

#include "kernel/types.h"
#include "kernel/stat.h"
#include "user/user.h"
#include "kernel/sysinfo.h"

int main(void)
{
    struct sysinfo info;
    if (sysinfo((char *)&info) < 0)
    {
        printf("sysinfo error.\r\n");
        exit(0);
    }

    printf("free mem:%d\r\nunused process:%d\r\n", info.num_freemem, info.num_unusedproc);
    exit(0);
}

posted on 2023-10-16 17:07  duduru  阅读(0)  评论(0)    收藏  举报  来源

导航