但是,如果我正在为它进行系统调用(因此写入 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 进行迭代,您可能需要考虑编写一个您的系统调用可以调用的函数来执行它需要做的任何事情,这就是我将退出系统调用作为示例的原因。
Source code for xv6
希望这有助于您的理解!