尝试向xv6添加系统调用时未定义“ proc”

时间:2019-02-21 19:38:23

标签: system clone call proc xv6

我正在尝试向xv6操作系统添加“克隆”系统调用。该调用将创建一个新的内核线程,该线程共享调用进程的地址空间。以下是我在proc.c中的代码

int clone(void(*fcn)(void*), void* arg, void* stack)
{
int i, pid;
struct proc *np;
int *myarg;
int *myret;

if((np = allocproc()) == 0)
  return -1;

np->pgdir = proc->pgdir;   //Here's where it tell's me proc is undefined
np->sz = proc->sz;
np->parent = proc;
*np->tf = *proc->tf;
np->stack = stack;

np->tf->eax = 0;

np->tf->eip = (int)fcn;

myret = stack + 4096 - 2 * sizeof(int *);
*myret = 0xFFFFFFFF;

myarg = stack + 4096 - sizeof(int *);
*myarg = (int)arg;

np->tf->esp = (int)stack +  PGSIZE - 2 * sizeof(int *);
np->tf->ebp = np->tf->esp;

np->isthread = 1;

for(i = 0; i < NOFILE; i++)
  if(proc->ofile[i])
    np->ofile[i] = filedup(proc->ofile[i]);
np->cwd = idup(proc->cwd);

safestrcpy(np->name, proc->name, sizeof(proc->name));

pid = np->pid;

acquire(&ptable.lock);
np->state = RUNNABLE;
release(&ptable.lock);

return pid;

}

我发现的大多数实现都是这样,但是,每当我尝试使它告诉我'proc'是未定义的。我见过的大多数clone实现看起来都差不多,它们都使用proc。如果有任何帮助,我也很乐意分享我的sysproc.c代码。

谢谢!

1 个答案:

答案 0 :(得分:0)

这与您的系统调用的实现没有关系,因为调度程序正好在恢复选定的“可运行”进程之前设置proc全局变量。

为null的原因可能是因为从错误的上下文中调用了此函数。 预期将通过名为sys_mysysfunc的包装函数执行系统调用实现,该包装函数由于用户应用程序代码引发的系统调用错误而导致syscall函数调用。

请与我们分享您的整个实施流程,以寻求更多帮助。