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 - 48

    leaq  -0x8(%rsp), %rsp  ; rsp -= 8 → 预留8字节空间
                     ; 当前栈指针: rsp = 原始rsp - 56

    cmp  $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 (源上下文的栈指针)

    // =============

你可能感兴趣的:(brpc中的bthread_jump_fcontext汇编函数到底发生了什么?)