gpt4 book ai didi

xv6 - 在 xv6 中访问当前正在运行的进程?

转载 作者:行者123 更新时间:2023-12-04 17:46:36 26 4
gpt4 key购买 nike

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

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

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

最佳答案

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 中的 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,您需要考虑编写一个 syscall 可以调用的函数来执行它需要执行的任何操作,这就是我将退出 syscall 作为示例的原因。

Source code for xv6

希望这对您的理解有所帮助!

关于xv6 - 在 xv6 中访问当前正在运行的进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32571672/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com