我想写一个像
ucontext
这样的协程库来切换上下文,我想在协程退出时调用Scheduler::exit() func。我将 Scheduler::exit() 地址作为 rip
存储在协程堆栈中以实现此目的,并将 Scheduler 对象指针存储在 rip
(Scheduler::exit addrees) 上方的协程堆栈中,但我发现了 this pointer
那个程序集捕获的代码总是得到错误的值。
uco::Scheduler::exit():
push %rbp
mov %rsp,%rbp
mov %rdi,-0x8(%rbp)
nop
pop %rbp
ret
这是
Scheduler::exit
函数,我暂时没有在这个函数中写任何东西,只是为了检查这个函数是否可以捕获 Scheduler 对象的this pointer
。
我认为一切正常,直到
mov %rdi,-0x8(%rbp)
这条线。
下面
Scheduler::exit()
的调试信息,这是rbp
寄存器在mov %rdi,-0x8(%rbp)
之前的输出。 0x55555555a0c0 是我想要的 Sheduler 对象,-0x8(%rbp) 应该是M[R[rbp]-8](0x55555555a0c0)
吧?但是 %rdi 总是得到错误的值。
(gdb) x/40xb $rbp
0x55555556eeb8: 0xc8 0xee 0x56 0x55 0x55 0x55 0x00 0x00
0x55555556eec0: 0xc0 0xa0 0x55 0x55 0x55 0x55 0x00 0x00
0x55555556eec8: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x55555556eed0: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x55555556eed8: 0x21 0x00 0x00 0x00 0x00 0x00 0x00 0x00
卡在这上面一整天了。感谢您花费宝贵的时间。
所有代码只有大约 150 行。 https://github.com/Rainff9f58ff178/yuco/tree/dbc66289ea25d2ee29b5f5b9727d498a99ff00d7