如何添加一个系统调用来查找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;
}
我已对以下文件进行了所有必要的修改:
- defs.h
- 系统proc.c
- syscall.h
- usys.S
- syscall.c
- 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();
}
我在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;
}
我已对以下文件进行了所有必要的修改:
- defs.h
- 系统proc.c
- syscall.h
- usys.S
- syscall.c
- 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();
}