如何添加一个系统调用来查找xv6中的进程数

How to add a system call to find the number of processes in xv6

我在proc.c文件中添加了这个函数

int getNumProc(void)
{
  struct proc *p;
  int count = 0;

  acquire(&ptable.lock);

  for(p = ptable.proc; p < &ptable.proc[NPROC]; p++)
  {
     if(p->state != UNUSED)
        count++;
  }

  release(&ptable.lock);

 return count;
}

我已对以下文件进行了所有必要的修改:

  1. defs.h
  2. 系统proc.c
  3. syscall.h
  4. usys.S
  5. syscall.c
  6. user.h

我还创建了一个名为totproc.c的用户程序来调用这个系统调用,并在Makefile相关地方添加了这个用户程序。当我在 XV6 shell 中键入 totproc 命令时,该命令会打印出有 3 个进程。但除了结果,它还会打印以下错误:

pid 4 totproc: trap 14 err 5 on cpu 1 eip 0xffffffff addr 0xffffffff--kill proc

这里可能有什么问题?如果让你写一个查找进程数的系统调用,你会怎么写?

你似乎走对了路,但看起来你错过了什么。

您收到的错误是在收到意外中断时产生的(在 trap.c 中)。具体来说,陷阱编号 14 是 T_PGFLT(根据 trap.h)。 这意味着当试图访问某个地址时,MMU 以页面错误中断响应,换句话说,您可能在某处发生了内存覆盖或访问冲突。

考虑与您共享用户 space 应用程序代码。

嗯,我想通了问题。事实证明,问题不在我的系统调用中,而是在进行系统调用的用户程序 totproc.c 中。我最初的 totproc.c 看起来像这样:

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

int main()
{
  printf(1 , "No. of Process: %d" , getNumProc());
  return 0;
}

正常工作的totproc.c如下:

#include "types.h"
#include "stat.h"
#include "user.h"
#include "fcntl.h"

int main()
{
  printf(1 , "No. of Process: %d" , getNumProc());
  exit();
}