当前位置: 首页 > 知识库问答 >
问题:

SYSCALL/SYSRET指令如何跨x86 CPUs执行?

曹振
2023-03-14

< code>SYSCALL和< code>SYSRET(及其32位的英特尔对应产品< code>SYSENTER和< code>SYSEXIT)通常被描述为比调用门或软件中断“更快”地进入和退出x86处理器中的管理模式,但这一说法背后的确切数字在很大程度上仍未得到证实。特别是,我能找到的所有英特尔或AMD优化指南都没有提到这些指令。所以:

  • SYSCALLSYSRET 在最近的 Intel 64 微体系结构中执行了多少个周期(估计)?这可以通过直接实验来衡量,但是有相当多的不同CPU需要测试。

根据这个数字的数量级,更详细的问题可能是相关的:

  • 它们是否会导致管道完全失速或任何其他类型的失速
  • 如果有的话,它们如何与分支预测(例如,返回堆栈缓冲区)和提取逻辑交互
  • 延迟、数据依赖性和序列化如何

假设用户空间端有64位代码,没有额外的地址空间开关(写入CR3),如果重要的话,甚至可以匹配SYSCALLSYSRET对。

共有1个答案

沙星波
2023-03-14

我也很好奇,所以我写了一些基本的裸机代码来对其进行基准测试:只是一个循环,在一个循环中调用系统调用1000000次,而系统调用处理程序只运行sysret,其他什么都没有。在我的Ryzen 7 3700X上,呼叫返回的平均周期为78个。

显然,这是一个人工基准,因为一个真正的系统调用处理器可能需要做一些事情,比如交换堆栈和执行幽灵缓解。但它给出了一个数量级的概念,这个数量级小于缓存未命中。

 类似资料:
  • 问题内容: 我正在寻找写两个角度指令,一个父指令和一个子指令,以创建可排序和可克隆的小部件。预期的标记是: 但是,子指令似乎在父元素之前,某个元素可用之前执行(子元素由父元素添加): 如您所见,我尝试设置优先级,但我认为由于它们位于不同的元素上,因此无法正常工作。 如何让父母先执行? 问题答案: 推理 以相反的顺序执行,这意味着子指令将在父指令之前(即深度优先)被调用。由于某种原因,这是默认行为(

  • 描述 (Description) 此函数调用指定为列表的第一个元素的系统调用,将其余元素作为参数传递给系统调用。 如果给定的参数是数字,则参数将作为int传递。 如果不是,则传递指向字符串值的指针。 语法 (Syntax) 以下是此函数的简单语法 - syscall EXPR, LIST 返回值 (Return Value) 系统调用失败时返回-1,成功时系统函数返回值。 例子 (Example

  • import "syscall" Package syscall contains an interface to the low-level operating system primitives. The details vary depending on the underlying system, and by default, godoc will display the syscall

  • 我对指令流水线有些怀疑。 我有一个集会

  • 问题内容: 浏览器不允许跨站点AJAX调用(这是安全限制)。有没有可能的解决方案? 编辑 我只控制来电者的网站 问题答案: 如果您控制双方,那么会有很多选择。例如JSONP,或修改远程网站的标头响应。 不幸的是 ,只有在远程网站支持的情况下,JSONP才有效。您 不能 将JSONP调用强制到尚不支持它的网站。 但是,正如您所说,您只能控制源网站。出于明显的原因,您无法绕过此限制来入侵浏览器。您确实

  • 2. Shell如何执行命令 2.1. 执行交互式命令 用户在命令行输入命令后,一般情况下Shell会fork并exec该命令,但是Shell的内建命令例外,执行内建命令相当于调用Shell进程中的一个函数,并不创建新的进程。以前学过的cd、alias、umask、exit等命令即是内建命令,凡是用which命令查不到程序文件所在位置的命令都是内建命令,内建命令没有单独的man手册,要在man手册