我正在尝试向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'是未定义的。我见过的克隆的大多数实现看起来几乎相同,所有这些实现都使用了proc。我很乐意分享我的sysproc.c代码,如果这会有任何帮助。
谢谢!
这与系统调用的实现无关,因为在恢复选定的“可运行”进程之前,调度程序正在设置proc全局变量。
null的原因可能是因为从错误的上下文调用此函数。系统调用实现应该从名为sys_mysysfunc的包装函数执行,该函数由于用户应用程序代码启动的系统调用而导致调用syscall函数。
请与我们分享您的整个实施流程以获得更多帮助。