brpc中的bthread_jump_fcontext汇编函数到底发生了什么?
我们之前讲了brpc中的bthread创建,分配和切换。那么在切换过程中,brpc中的bthread_jump_fcontext汇编函数到底发生了什么?我们来非常具体地讲一讲。
函数签名
intptr_t bthread_jump_fcontext(bthread_fcontext_t * ofc, // %rdi: 输出参数,保存源上下文指针bthread_fcontext_t nfc, // %rsi: 输入参数,目标上下文指针intptr_t vp, // %rdx: 输入参数,传递给目标协程的值bool preserve_fpu = false // %rcx: 输入参数,是否保存浮点状态
);
汇编代码解析(带寄存器状态变化)
.text
.globl bthread_jump_fcontext
.type bthread_jump_fcontext,@function
.align 16
bthread_jump_fcontext:// ====================== 保存当前协程状态 ======================pushq %rbp ; 保存栈基址指针 → [rsp-8]pushq %rbx ; 保存被调用者保存寄存器 → [rsp-16]pushq %r15 ; 保存被调用者保存寄存器 → [rsp-24]pushq %r14 ; 保存被调用者保存寄存器 → [rsp-32]pushq %r13 ; 保存被调用者保存寄存器 → [rsp-40]pushq %r12 ; 保存被调用者保存寄存器 → [rsp-48]; 当前栈指针: rsp = 原始rsp - 48leaq -0x8(%rsp), %rsp ; rsp -= 8 → 预留8字节空间; 当前栈指针: rsp = 原始rsp - 56cmp $0, %rcx ; 检查 preserve_fpu 标志 (rcx)je 1f ; 如果 preserve_fpu == false 则跳转; === 保存浮点状态 (preserve_fpu == true) ===stmxcsr (%rsp) ; 保存 MXCSR 寄存器状态 → [rsp]fnstcw 0x4(%rsp); 保存 x87 FPU 控制字 → [rsp+4]1: ; 浮点状态保存完成点movq %rsp, (%rdi) ; 保存当前栈指针到 *ofc; [rdi] = rsp (源上下文的栈指针)// =============