当前位置: 首页 > news >正文

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 (源上下文的栈指针)// =============
http://www.dtcms.com/a/272890.html

相关文章:

  • three2.0
  • 鸿蒙开发文档
  • C语言易错点整理(一)
  • 开源无线硬件系列射频收发器模块 RFMC6000
  • 亚马逊运营中出单词反查功能的深度应用
  • 【fitz+PIL】PDF图片文字颜色加深
  • Jenkins邮件通知终极指南:Email Extension Plugin高级配置
  • 电机试验平台的千年进化史
  • 对S32K144做的VCU安装快速开发Simulink库及VCU例程介绍
  • [架构之美]虚拟机Ubuntu密码重置
  • java(2025/7/10)
  • (单调队列优化)洛谷P2627 USACO11OPEN Mowing the Lawn / P3572 POI2014 Little Bird 题解
  • 《数据库》 MySQL库表操作
  • 磐维数据库panweidb集中式集群配置VIP【添加、删除和修改】
  • Chromium 引擎启用 Skia Graphite后性能飙升
  • websocket的客户端(发送接收json的消息)
  • vue3 td 标签优化时间显示
  • 穿梭时空的智慧向导:Deepoc具身智能如何赋予导览机器人“人情味”
  • 如何自动计算照片中光伏板数量:基于开源项目的自动识别光伏板计数解决方案
  • C++初阶-仿函数
  • 利萨如图形详解:原理与Python动态绘制
  • 数据库常见元数据表
  • .NET Framework 安装失败及异常情况 常用处理方法
  • 【前端】【Echarts】【Liquidfill 水球图】深入理解 ECharts Liquidfill 水球图:从入门到进阶
  • 解决飞牛 NAS 安装 OpenResty时的端口被占用问题!(如何解决飞牛Nas 80 443 端口被占用的问题)
  • C++ 模板参数展开
  • AI测试革命:从智能缺陷检测到自愈式测试框架的工业实践
  • 谷粒商城高级篇
  • 用GNU Radio生成Frank信号
  • Redisson 的分布式锁