在switch_to()函数最后三行中有
movl 4(%eax), %esp pushl 0(%eax) # push eip
esp从当前进程的内核栈切换到了next进程的内核栈,然后在新的内核栈中压栈forkret的函数地址
现在内核栈中是这样分布的:
| trapframe|
: trapframe:
: trapframe:
| trapframe|
| eip |<--esp
然后ret返回到forkret(),接着forkret()调用forkrets汇编函数,在forkrets中内核栈是这样的
| trapframe|
: trapframe:
: trapframe:
| trapframe|
| arg |
| eip |<--esp
然后forkrets直接esp+4就跳转到__trapret开始popal,但是esp+4后应该是arg,而不是紧接着trapframe。
我不知道是哪里想错了,请指点。