我正在尝试向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代码,如果这会有任何帮助的话。
谢谢!
发布于 2019-02-24 04:13:21
这与系统调用的实现无关,因为proc全局变量是在恢复选定的"runnable“进程之前由调度程序设置的。
null的原因可能是因为从错误的上下文中调用此函数。期望从名为sys_mysysfunc的包装函数执行系统调用实现,该包装函数是由于由用户应用程序代码发起的系统调用而调用的。
请与我们分享您的整个实施流程,以获得更多帮助。
https://stackoverflow.com/questions/54814949
复制相似问题