linux控制协程参数,Linux高性能网络:协程系列06-协程实现之切换-Go语言中文社区...

目录

6.协程实现之切换

问题:协程的上下文如何切换?切换代码如何实现?

首先来回顾一下x86_64寄存器的相关知识。x86_64 的寄存器有16个64位寄存器,分别是:%rax, %rbx, %rcx, %esi, %edi, %rbp, %rsp, %r8, %r9, %r10, %r11, %r12,

%r13, %r14, %r15。

%rax 作为函数返回值使用的。

%rsp 栈指针寄存器,指向栈顶

%rdi, %rsi, %rdx, %rcx, %r8, %r9 用作函数参数,依次对应第1参数,第2参数。。。

%rbx, %rbp, %r12, %r13, %r14, %r15 用作数据存储,遵循调用者使用规则,换句话说,就是随便用。调用子函数之前要备份它,以防它被修改

%r10, %r11 用作数据存储,就是使用前要先保存原值。

上下文切换,就是将CPU的寄存器暂时保存,再将即将运行的协程的上下文寄存器,分别mov到相对应的寄存器上。此时上下文完成切换。如下图所示:

2ba8dc82972bcd55e35a8115ffe24fe2.png

协程切换之CPU寄存器操作图

切换_switch函数定义:

int _switch(nty_cpu_ctx *new_ctx, nty_cpu_ctx *cur_ctx);

参数1:即将运行协程的上下文,寄存器列表

参数2:正在运行协程的上下文,寄存器列表

我们nty_cpu_ctx结构体的定义,为了兼容x86,结构体项命令采用的是x86的寄存器名字命名。

typedef struct _nty_cpu_ctx {

void *esp; //

void *ebp;

void *eip;

void *edi;

void *esi;

void *ebx;

void *r1;

void *r2;

void *r3;

void *r4;

void *r5;

} nty_cpu_ctx;

_switch返回后,执行即将运行协程的上下文。是实现上下文的切换

0: __asm__ (

1: " .text n"

2: " .p2align 4,,15 n"

3: ".globl _switch n"

4: ".globl __switch n"

5: "_switch: n"

6: "__switch: n"

7: " movq %rsp, 0(%rsi) # save stack_pointer n"

8: " movq %rbp, 8(%rsi) # save frame_pointer n"

9: " movq (%rsp), %rax # save insn_pointer n"

10: " movq %rax, 16(%rsi) n"

11: " movq %rbx, 24(%rsi) # save rbx,r12-r15 n"

12: " movq %r12, 32(%rsi) n"

13: " movq %r13, 40(%rsi) n"

14: " movq %r14, 48(%rsi) n"

15: " movq %r15, 56(%rsi) n"

16: " movq 56(%rdi), %r15 n"

17: " movq 48(%rdi), %r14 n"

18: " movq 40(%rdi), %r13 # restore rbx,r12-r15 n"

19: " movq 32(%rdi), %r12 n"

20: " movq 24(%rdi), %rbx n"

21: " movq 8(%rdi), %rbp # restore frame_pointer n"

22: " movq 0(%rdi), %rsp # restore stack_pointer n"

23: " movq 16(%rdi), %rax # restore insn_pointer n"

24: " movq %rax, (%rsp) n"

25: " ret n"

26: );

按照x86_64的寄存器定义,%rdi保存第一个参数的值,即new_ctx的值,%rsi保存第二个参数的值,即保存cur_ctx的值。X86_64每个寄存器是64bit,8byte。

Movq %rsp, 0(%rsi) 保存在栈指针到cur_ctx实例的rsp项

Movq %rbp, 8(%rsi)

Movq (%rsp), %rax #将栈顶地址里面的值存储到rax寄存器中。Ret后出栈,执行栈顶

Movq %rbp, 8(%rsi) #后续的指令都是用来保存CPU的寄存器到new_ctx的每一项中

Movq 8(%rdi), %rbp #将new_ctx的值

Movq 16(%rdi), %rax #将指令指针rip的值存储到rax中

Movq %rax, (%rsp) # 将存储的rip值的rax寄存器赋值给栈指针的地址的值。

Ret # 出栈,回到栈指针,执行rip指向的指令。

上下文环境的切换完成。

更多分享

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/254406.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

陶瓷气体放电管参数含义详解

​很多客户反应,不太明白陶瓷气体放电管产品手册中的参数含义。不可否认,电路保护器件产品规格书手册用的语言大部分都是英文,没有一定的英文基础,还真消化不了。有时候,就算能看得懂,但是面对枯燥无味的参…

ARM寄存器及功能介绍/R0-R15寄存器

1、ARM 寄存器组介绍 ARM 处理器一般共有 37 个寄存器,其中包括: (1) 31 个通用寄存器,包括 PC(程序计数器)在内,都是 32 位的寄存器。 (2) 6 个状态寄存器…

x64 汇编 参数传递

参数传递在不同的系统上是不一样的 称作 calling convention 调用约定 windows rcx,rdx,r8,r9 用来存储整数或指针参数,按照从左到右的顺序 xmm0,1,2,3 用来存储浮点参数 其余参数会压入栈中。 linux 当参数在 6 个以内,参数从左到右依次放入寄存器:…

汇编和c语言函数的参数,C函数与汇编函数之间参数及返回值传递方法

AAPCS对ARM结构的一些标准做了定义,在这里我们只重点介绍函数调用部分,如图8所示,AAPCS为ARM的R0~R15寄存器做了定义,明确了它们在函数中的职责: 图 8 AAPCS关于ARM寄存器的定义 一、函数调用时的规则如下: 1、 父函数与子函数间的入口参数依次通过R0~R3这4个寄存器传递。…

台式计算机配置参数,整机配置参数以及性能测试_台式电脑评测-中关村在线

我们首先来看一看同方E500的硬件配置情况。 根据AIDA64所示,同方E500搭载了i5-7400处理器、8GB内存、128GB建兴固态硬盘以及1TB西部数据机械硬盘。这个配置对于商务办公机来讲是非常合理的,在性能与成本之间得到了最佳的平衡。那么具体性能表现又是如何呢?我们来继续往下看。…

此计算机核心参数,买电脑如何选CPU?这三个参数一定要看!

原标题:买电脑如何选CPU?这三个参数一定要看! CPU是电脑中的核心,也可以说是电脑的大脑,一直以来CPU与GPU那个重要都是争论不休的话题,四月份升级九代酷睿处理器的机械师笔记本拥有怎样的升级体验呢?高性能玩家该通过…

5G NR首版标准R15解读

5G定义了增强型移动宽带(eMBB)、超可靠低延迟通信(URLLC)、大规模机器类型通信(mMTC) 三大场景。针对这三大场景,在2018年6月已完成的3GPP R15标准不仅定义了5G NR(新无线&#xff0…

oppo r15 android 8,抢不到小米8,就用OPPO R15吧

抢不到小米8,就用OPPO R15吧 2018-06-09 17:10:13 17点赞 21收藏 49评论 最近小米8好像很热门,于是,突然就想买个了,反正都是刘海屏千篇一律的手机,还是10年前好,手机款式都是百花齐放,各有各特…

6.S081——补充材料——RISC-V架构中的异常与中断详解

0.briefly speaking 我在阅读Xv6源码过程中对很多概念感到困惑,想到也许会有其他人对此秉持同样的困惑,所以我将我的研究和学习过程总结下来并编篡成如下的博客。本篇博客想对RISC-V标准中有关中断和异常的概念进行一个梳理,考虑RISC-V标准的…

android微信逆向工程,iOS逆向 - 微信自动添加好友

相关源码:Github地址 一、前言 本篇主要实现在微信上自动添加好友,从而熟悉 iOS 逆向分析的过程。 二、 工具 2.1 MacBook 软件 制作 Tweak 的工具 端口转发,可以让我们通过usb连接手机进行ssh、lldb调试等。主要使用python-client目录下的文件 dump 目标…

免费查询微信好友还在不在了~

最近一周经常被一些人发一些检测好友的消息,目测这东西好像是有条件收费的,然后就想想python是不是能写个免费版的好友检测。 具体可以看看运行结果: 编写脚本会用到以下几个模块 coloramacoloredlogshumanfriendlylxmlqrcoderequestssixrequ…

如何找回删除的微信好友?

如何找回删除的微信好友? 本篇主要是说朋友圈无互动过,也没有任何标签和其他特殊标记,不知道微信号,手机号的微信好友,误删之后如何通过恢复数据方式恢复好友的办法。百度之后主要有如下几种方法:1.朋友圈有…

在Centos Stream 9上Docker的实操教程(四) - Docker腾讯云远程仓库和本地私有仓库

在Centos Stream 9上Docker的实操教程 - Docker腾讯云远程仓库和本地私有仓库 本地镜像发布到腾讯云注册开通腾讯云初始化个人版服务创建仓库推送拉取镜像 私有仓库结语 本地镜像发布到腾讯云 由于官方的docker hub访问由于网络原因,可能会比较慢,博主推…

html输入框 多出的字隐藏,input 输入框获得/失去焦点时隐藏/显示文字(jquery版)

input 输入框获得和失去焦点时隐藏或者显示文字我们先看下效果图 输入框默认状态: 输入框获取焦点状态: 大家可以看效果图的搜索输入框,默认显示着“用户名/Email”的提示,当这个 input 输入框获得焦点时,就自动清空等待用户输入&#xff0c…

【C++】函数高级 - 默认参数,占位参数,函数重载基本语法,函数重载注意事项

No.Contents1【C】基础知识 - HelloWorld,注释,变量,常量,关键字,标识符2【C】数据类型 - 整型,sizeof,实型,字符型,转义字符,字符串类型,布尔类型…

LeetCode 560 和为 K 的子数组

LeetCode 560 和为 K 的子数组 来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/subarray-sum-equals-k/description 博主Github:https://github.com/GDUT-Rp/LeetCode 题目: 给你一个整数数组 …

chatgpt赋能python:Python中的画图——创建漂亮的可视化图像

Python中的画图——创建漂亮的可视化图像 Python是一个高度可编程的语言,因此它非常适合用于创建各种类型的可视化。 在本文中,我们将介绍Python中的画图。我们将讨论如何使用Python和一些流行的数据可视化库来创建漂亮的可视化图像。我们还将探讨如何…

【Linux】Linux文件权限的理解

目录 一、Shell是什么? 1、Shell承担用户和内核间的翻译工作 2、拒绝用户非法请求,保护内核 3、派生子进程执行用户指令 二、用户切换与提权 1、普通用户与root用户的切换 2、普通用户指令短暂提权 三、文件权限的理解 1、文件权限角色的权限文…

Linux文件的rwx含义,Linux文件权限rwx简单了解

Ⅰ 了解Linux下的文件权限 如上图所示,ll命令详细展示当前目录下的文件或者子目录信息 红框标注的即为此文件或者目录的权限 【第一行文件10.c的权限以-开头,用来说明这是一个文件;第四行code目录的权限以字母d开头,用来标注code是目录】 关于文件权限,我们要先了解有那些…

Linux文件权限管理命令

今天继续给大家介绍Linux基本知识,本文主要内容是介绍Linux文件权限相关命令。 一、chown命令修改文件属主 在Linux系统中,chown命令可以更改文件的属主和属组,chown命令使用示例如下: chown user.user target chown user:user…