如何在XV6中实现系统调用

问题描述 投票:0回答:1

我有这个作业:

实现一个系统调用,返回有关当前进程的信息(例如其进程 ID 和状态)。想想谁负责分配包含以下内容的内存 处理将返回的信息以及如何在使用后再次释放它(如果需要 被释放)。

但我坚持让系统调用产生任何有意义的输出......

这是我的内核空间中的代码,在sysproc.c中实现:

uint64
sys_getprocinfo(struct proc* user_pi)
{
  struct proc *curproc = myproc();
  struct proc pi;

  acquire(&curproc->lock);
  pi.pid = curproc->pid;
  pi.state = curproc->state;
  release(&curproc->lock);

  if(copyout(curproc->pagetable, (uint64)user_pi, (char*)&pi, sizeof(pi)) < 0)
        return -1;

  return 0;
}

以及user/getproc.c中的用户空间程序

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


//blueprint for proc info strukturen
struct proc {
        int pid;
        int state;
        //evt annet?
};

//state nr tilsvarer nr i array her:
//enum procstate { UNUSED, USED, SLEEPING, RUNNABLE, RUNNING, ZOMBIE}

int main(void)

{
  //info blir av typen proc info over
  struct proc pi;
  //kaller syscallet med &info som argument
  int result = getprocinfo(&pi);

  if (result < 0) {
        printf("Error: Not able to access process information!\n");
  } else {
        printf("Process ID: %d, Process state: %d\n", pi.pid, pi.state);
  }

  exit(0);

}

当我使用 make qemu 运行 XV6 时,我只收到此消息:错误:无法访问进程信息!。我无法让它产生任何过程。请帮忙!!

operating-system kernel system-calls xv6 userspace
1个回答
0
投票

我相信你使用 xv6-riscv 风格?

您的代码中有几个问题:

  • sys_getprocinfo
    原型应该是
    int64 sys_getprocinfo(void)
    :系统调用没有参数,必须使用
    argaddr(int, uint64 *);
  • 获取参数
  • pi
    是在
    sys_getprocinfo
    本地定义的,但您可以在
    copyout(...)
  • 中将其用作用户指针
  • 您有两个
    struct proc
    定义:一个在
    proc.h
    的内核中,一个在您的
    getproc.c
    文件中。它们是不相容的。您应该在内核中声明一个具有不同名称的新结构。
© www.soinside.com 2019 - 2024. All rights reserved.