XV6:ptable初始化

Ala*_*din 4 c proc xv6

我说的是:

struct {
struct spinlock lock;
struct proc proc[NPROC];
} ptable;
Run Code Online (Sandbox Code Playgroud)

它驻留在 proc.c 文件中。

有人可以解释它在哪里初始化吗?因为,在 proc.c 中,我从未见过向其中添加了某些东西(进程)。

更准确地说,假设我正在查看调度程序代码:

void
scheduler(void)
{
 struct proc *p;
 for(;;){
 // Enable interrupts on this processor.
 sti();
 // Loop over process table looking for process to run.
 acquire(&ptable.lock);
 for(p = ptable.proc; p < &ptable.proc[NPROC]; p++){
  if(p?>state != RUNNABLE)
  continue;
  // Switch to chosen process. It is the process’s job
  // to release ptable.lock and then reacquire it
  // before jumping back to us.
  proc = p;
  switchuvm(p);
  p?>state = RUNNING;
  swtch(&cpu?>scheduler, proc?>context);
  switchkvm();
  // Process is done running for now.
  // It should have changed its p?>state before coming back.
  proc = 0;
  }
 release(&ptable.lock);
 }
}
Run Code Online (Sandbox Code Playgroud)

在:

for(p = ptable.proc; p < &ptable.proc[NPROC]; p++){
Run Code Online (Sandbox Code Playgroud)

您可以看到我们正在循环遍历 ptable 中的每个进程。我的问题是,他们是如何到达那里的?谢谢!

Dor*_*hen 5

它已初始化。

struct {
struct spinlock lock;
struct proc proc[NPROC];
} ptable;
Run Code Online (Sandbox Code Playgroud)

上面的代码定义了一个结构体(没有名称)并初始化ptable为该类型的一个结构体。也许您对这种语法感到困惑:

struct ptable {
struct spinlock lock;
struct proc proc[NPROC];
};
Run Code Online (Sandbox Code Playgroud)

这里我们只定义了一个结构名称ptable,没有初始化。


小智 5

你不会在 xv6 的代码中找到初始化。这是为什么。

C 将 proc 的 int 和 enum 变量初始化为 0。ptable实现时,struct proc proc[NPROC];创建一个包含 64 个进程的数组,这些进程的字段由语言初始化为 0。0 恰好是 UNUSED 枚举的值。

allocproc 通过 ptable.proc 循环查找 state=UNUSED,然后将它找到的第一个初始化为所有需要的值。所以不需要显式初始化数组中的结构。