在一般的用户线程上下文切换实现中(如setjmp/longjmp
和function return
方式),我们保存和恢复被调用者保存的寄存器,但golang仅在以下位置保存和恢复%rsp
,%rip
和%rbp
: gobuf。
以x86_64为例,golang用runtime.gosave保存goroutine上下文,并用runtime.gogo恢复goroutine上下文。
那么,为什么golang用这种方式呢?预先感谢您提供的任何帮助。
在一般的用户线程上下文切换实现中(如setjmp / longjmp和函数返回方式),我们保存并恢复被调用者保存的寄存器,但是golang仅保存并恢复%rsp,%rip和%rbp ...
显然,GoLang仍然使用效率低下的调用约定,其中唯一保留调用(又称为非易失性)的寄存器是RSP和RBP。