6

所以我试图想出一种可能的方法来访问 xv6 中当前正在运行的进程列表。我的想法是获得对 ptable 的访问权限,因此我可以循环遍历它并为所有正在运行的程序增加一个计数器。但是,如果我正在对其进行系统调用(因此写入 sysproc.c),我无法访问 ptable,因为它似乎(对我来说,我仍在四处寻找)是 proc 独有的。 C

无论如何我可以访问表以循环并查找正在运行的进程,还是我应该考虑另一种方法?

编辑:在头文件中创建一个计数器变量会更容易吗,每次创建进程时都会增加它,一旦进程退出就会减少它?

4

1 回答 1

10

但是,如果我正在对其进行系统调用(因此写入 sysproc.c),我无法访问 ptable,因为它似乎(对我来说,我仍在四处寻找)是 proc 独有的。 C

你是对的。您无法在 sysproc.c 中访问它。您大概可以访问整个 xv6 源代码,这意味着您可以在 proc.c(而不是 sysproc.c)中添加一个函数来迭代这个 ptable 并做一些事情。

无论如何我可以访问表以循环并查找正在运行的进程,还是我应该考虑另一种方法?

在 proc.c 之外直接访问它是行不通的。幸运的是,调用访问 ptable 的 proc.c 函数将起作用。如果您查看 sysproc.c,它会调用编写在 proc.c 内部的函数,这些函数确实使用了 ptable。

例如,您可以查看“退出”函数并查看相关代码在 xv6 中的位置,以了解使用 ptable 的系统调用如何工作:

proc.c: //Implementation of exit function
...
2353 void
2354 exit(void)
2355 {
...
2379 for(p = ptable.proc; p < &ptable.proc[NPROC]; p++){
...
2391 }

proc.c 中的 exit 函数能够循环遍历在 proc.c 中实例化的进程表。

defs.h:
...
0357 // proc.c
0358 struct proc* copyproc(struct proc*);
0359 void exit(void);
0360 int fork(void);
...

defs.h 文件包含退出函数的前向声明。

sysproc.c: //Implementation of a syscall 'exit' 
...
3414 int
3415 sys_exit(void)
3416 {
3417 exit();
3418 return 0; // not reached
3419 }

sys_exit 函数 sysproc.c 包含 exit syscall 的完整实现,它从 proc.c 调用 exit(),它在某一点上对 ptable 进行交互。

如果您计划对 ptable 进行迭代,则需要考虑编写一个您的系统调用可以调用的函数来执行它需要做的任何事情,这就是为什么我将 exit 系统调用作为示例包含在内的原因。

xv6 的源代码

希望这有助于您的理解!

于 2015-09-19T19:31:48.993 回答