>>654
((struct pt_regs *) (THREAD_SIZE + (unsigned long) p)) - 1;
これって親のtask_structからレジスタ情報を取得してるってこと?

で、
struct_cpy(childregs, regs);
親プロセスの現レジスタを子スレッドのレジスタにコピーして、

childregs->eax = 0;
childregs->esp = esp;
子スレッドのスタックを初期化して、

p->thread.esp = (unsigned long) childregs;
p->thread.esp0 = (unsigned long) (childregs+1);
親のスレッドスタックに生成するスレッドとその次のスレッドを設定して、

p->thread.eip = (unsigned long) ret_from_fork;
親スレッドの実行開始ポインタにcloneの戻り値を設定して、

savesegment(fs,p->thread.fs);
savesegment(gs,p->thread.gs);
親スレッドのセグメントレジスタを子スレッドに設定して、

unlazy_fpu(current);
struct_cpy(&p->thread.i387, ¤t->thread.i387);
ここらがよくわからんが。

ってこと?