在 xv6 中访问当前 运行 个进程?
Access current running processes in xv6?
所以我正在尝试想出一种可能的方法来访问 xv6 中当前 运行 进程的列表。我的想法是获得对 ptable 的访问权,这样我就可以遍历它并为所有 运行 增加一个计数器。但是,如果我正在为它进行系统调用(所以写信给 sysproc.c),我就无法访问 ptable,因为它看起来(对我来说,我还在四处寻找) 专用于 proc.c
我是否可以访问 table 来循环查找 运行 个进程,或者我是否应该考虑另一种方法?
编辑:在头文件中创建一个计数器变量,并且每次创建进程时递增它,一旦进程退出递减它会更容易吗?
However, if I'm making a system call for it (so writing to sysproc.c), I don't have access to the ptable as it seems (to me, I'm still poking around) to be exclusive to proc.c
你是对的。您无权在 sysproc.c 内访问它。
您大概可以访问整个 xv6 源代码,这意味着您可以在 proc.c(而不是 sysproc.c)中添加一个函数来迭代此 ptable 并执行操作。
Is there anyway I can access the table to loop through and find running processes, or is there another approach I should be considering?
直接在 proc.c 之外访问它是行不通的。幸运的是,调用访问 ptable 的 proc.c 函数将起作用 。如果您查看 sysproc.c,它会调用写在 proc.c 中的函数,这些函数使用 ptable.
例如,您可以查看 'exit' 函数并查看相关代码在 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 中的退出函数能够循环遍历 proc.c 中实例化的进程 table。
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 系统调用的完整实现,它从 proc.c 调用 exit(),它在某一时刻与 ptable.
如果您计划遍历 ptable,您需要考虑编写一个您的系统调用可以调用的函数来执行它需要做的任何事情,这就是我包含退出系统调用的原因举个例子。
希望这对您的理解有所帮助!
所以我正在尝试想出一种可能的方法来访问 xv6 中当前 运行 进程的列表。我的想法是获得对 ptable 的访问权,这样我就可以遍历它并为所有 运行 增加一个计数器。但是,如果我正在为它进行系统调用(所以写信给 sysproc.c),我就无法访问 ptable,因为它看起来(对我来说,我还在四处寻找) 专用于 proc.c
我是否可以访问 table 来循环查找 运行 个进程,或者我是否应该考虑另一种方法?
编辑:在头文件中创建一个计数器变量,并且每次创建进程时递增它,一旦进程退出递减它会更容易吗?
However, if I'm making a system call for it (so writing to sysproc.c), I don't have access to the ptable as it seems (to me, I'm still poking around) to be exclusive to proc.c
你是对的。您无权在 sysproc.c 内访问它。 您大概可以访问整个 xv6 源代码,这意味着您可以在 proc.c(而不是 sysproc.c)中添加一个函数来迭代此 ptable 并执行操作。
Is there anyway I can access the table to loop through and find running processes, or is there another approach I should be considering?
直接在 proc.c 之外访问它是行不通的。幸运的是,调用访问 ptable 的 proc.c 函数将起作用 。如果您查看 sysproc.c,它会调用写在 proc.c 中的函数,这些函数使用 ptable.
例如,您可以查看 'exit' 函数并查看相关代码在 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 中的退出函数能够循环遍历 proc.c 中实例化的进程 table。
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 系统调用的完整实现,它从 proc.c 调用 exit(),它在某一时刻与 ptable.
如果您计划遍历 ptable,您需要考虑编写一个您的系统调用可以调用的函数来执行它需要做的任何事情,这就是我包含退出系统调用的原因举个例子。
希望这对您的理解有所帮助!