システムコール "clone()"を使用してxv6でスレッドを作成したいが、スレッドを作成したい場合はスタックの作成について混乱している。 ebp、esp、eipなどの対応するレジスタポインタを作成します。しかし、私はこれらのレジスタポインタの値を設定する方法を知らない。ここでxv6でスレッドを作成する際にポインタを登録する
は(クローンのコードです)私たちは、このようなレジスタポインタの値を設定する必要がある理由xv6で、私にはわからない.......
int clone(void(*fcn)(void*), void *arg, void*stack){
int i, pid;
struct proc *np;
int *ustack = stack + PGSIZE - sizeof(void*);
//allocate process.
if((np=allocproc()) == 0)
return -1;
//copy process state from p
np->pgdir = proc->pgdir;
np->sz = proc->sz;
np->parent = 0;
np->pthread = proc;
*np->tf = *proc->tf;
np->ustack = stack;
//initialize stack variables
//void *stackArg, *stackRet;
//stackRet = stack + PGSIZE -2*sizeof(void*);
//*(uint *)stackRet = 0xffffffff;
//stackArg = stack + PGSIZE -sizeof(void*);
//*(uint *)stackArg = (uint)arg;
*ustack = (int) arg;
*(ustack - 1) = 0xffffffff;
*(ustack - 2) = 0xffffffff;
//Set stack pinter register
np->tf->eax = 0;
np->tf->esp = (int) ustack - sizeof(void*);
np->tf->ebp = np->tf->esp;
np->tf->eip = (int)fcn;
for(i = 0; i < NOFILE; i++) {
if(proc->ofile[i])
np->ofile[i] = filedup(proc->ofile[i]);
}
np->cwd = idup(proc->cwd);
np->state = RUNNABLE;
safestrcpy(np->name, proc->name, sizeof(proc->name));
pid = np->pid;
return pid;
}
'クローンを()は必要ありません' Linux-(と明らかにxv6-)固有のものです。 xv6にpthreadがある場合は、代わりにそのインターフェイスを使用することを強くお勧めします。 –