在 kernel_fpu_end 之前调用 kernel_fpu_begin 两次

2023-12-07

我正在使用kernel_fpu_begin and kernel_fpu_end功能于asm/i387.h保护 Linux 内核模块内一些简单浮点运算的 FPU 寄存器状态。

我很好奇调用的行为kernel_fpu_begin之前函数两次kernel_fpu_end函数,反之亦然。例如:

#include <asm/i387.h>

double foo(unsigned num){
    kernel_fpu_begin();

    double x = 3.14;
    x += num;

    kernel_fpu_end();

    return x;
}

...

kernel_fpu_begin();

double y = 1.23;
unsigned z = 42;
y -= foo(z);

kernel_fpu_end();

In the foo函数,我称之为kernel_fpu_begin and kernel_fpu_end; but kernel_fpu_begin在调用之前已经被调用foo。这会导致未定义的行为吗?

此外,我是否应该打电话给kernel_fpu_end在 - 的里面foo功能?我返回一个double之后kernel_fpu_end调用,这意味着访问浮点寄存器是不安全的,对吗?

我最初的猜测是不使用kernel_fpu_begin and kernel_fpu_end内部调用foo功能;但如果foo返回了double投射到unsigned相反——程序员不知道如何使用kernel_fpu_begin and kernel_fpu_end在外面foo?


简短回答:不,嵌套是不正确的kernel_fpu_begin()调用,这将导致用户空间 FPU 状态损坏。

中等答案:这行不通,因为kernel_fpu_begin()使用当前线程的struct task_struct保存 FPU 状态(task_struct有一个依赖于体系结构的成员thread,并且在 x86 上,thread.fpu保存线程的 FPU 状态),并执行第二个kernel_fpu_begin()将覆盖原来保存的状态。然后做kernel_fpu_end()最终将恢复错误的 FPU 状态。

长答案:正如您所看到的实际实施<asm/i387.h>,细节有点棘手。在较旧的内核(如您查看的 3.2 源代码)中,FPU 处理始终是“惰性的”——内核希望避免在真正需要之前重新加载 FPU 的开销,因为线程可能会运行并再次被调度无需实际使用 FPU 或需要其 FPU 状态。所以kernel_fpu_end()只是设置了TS标志,这会导致FPU的下一次访问陷入陷阱并导致FPU状态被重新加载。希望我们实际上没有足够多的时间使用 FPU,从而整体上更便宜。

然而,如果您查看较新的内核(我相信是 3.7 或更新版本),您会发现实际上还有第二条代码路径可以实现所有这些功能——“渴望”FPU。这是因为较新的 CPU 具有“优化的”XSAVEOPT 指令,并且较新的用户空间更频繁地使用 FPU(对于 memcpy 中的 SSE 等)。 XSAVEOPT / XRSTOR 的成本较低,并且惰性优化实际上避免 FPU 重新加载的机会也较小,因此在新 CPU 上使用新内核时,kernel_fpu_end()只需继续并恢复 FPU 状态即可。 (

然而,在“lazy”和“eager”FPU 模式下,FPU 中仍然只有一个插槽。task_struct保存FPU状态,所以嵌套kernel_fpu_begin()最终会破坏用户空间的 FPU 状态。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 kernel_fpu_end 之前调用 kernel_fpu_begin 两次 的相关文章

  • 在两个 .cpp 文件之间定义全局变量 [重复]

    这个问题在这里已经有答案了 如何在 A cpp 和 B cpp 之间共享 全球化 bool 变量 其中它们都不包含其他 h 文件 他们有其他联合头文件 但彼此没有 我可以在这些共享标头中定义全局变量吗 Thanks 我可以在这些共享标头中定
  • ProtoBuf-net AsReference 需要 Activator.CreateInstance 中的公共构造函数吗?

    在我的两门课程中 看起来像这样 最少 using System using System Collections Generic using System Collections using System ComponentModel us
  • .NET Windows 服务中调用 C# 的 wait 的 I/O 回调是否可以不阻塞?

    我知道在 ASP NET 中 当使用 wait 时工作线程会返回到池中 而 I O 发生在后台 这对于可扩展性非常有用 我的 Windows 服务是一个套接字服务器 它使用 Begin End 样式的异步套接字 I O 混合我的魔法 我知道
  • 在Linux中执行jar文件[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我创建了一个可执行的 Java jar 文件 也就是说 我将 java 程序正确打包到 jar 文件中 包括 META INF MANIFEST 文件
  • 何时对向量进行归一化?

    我正在学习 XNA 并且在几乎所有的教育套件中都可以找到http creators xna com en US http creators xna com en US 我总是看到向量上对 Normalize 的调用 我知道归一化基本上将向量
  • C/C++ 中随机数生成器的实现[重复]

    这个问题在这里已经有答案了 我对 C 中随机数生成器的实现有点困惑 它也与 C 中的明显不同 如果我理解正确 对 srand seed 的调用会以某种方式初始化可通过 rand 访问的隐藏变量 种子 该变量又将函数指向预先生成的序列 例如例
  • C++:获取注册表值仅给出第一个字符[重复]

    这个问题在这里已经有答案了 我试图从注册表中获取字符串值 但我只得到第一个字母 HKEY hKey char gamePath MAX PATH if RegOpenKeyEx HKEY CURRENT USER L Software Bl
  • C# ConfigurationManager 从 app.config 检索错误的连接字符串

    我有一个简单的 WinForms 应用程序 它最终将成为一个游戏 现在 我正在研究它的数据访问层 但遇到了障碍 我创建了一个单独的项目 名为DataAccess在其中 我创建了一个本地 mdfSQL Server 数据库文件 我还创建了一个
  • 将占位符文本添加到文本框

    我正在寻找一种将占位符文本添加到文本框的方法 就像在 html5 中使用文本框一样 IE 如果文本框没有文本 则会添加文本Enter some text here 当用户单击它时 占位符文本消失并允许用户输入自己的文本 如果文本框失去焦点并
  • CMake 警告:无法为目标生成安全的链接器搜索路径

    在为 pcl 项目运行 CMake 时 我收到一条警告消息 Configuring done CMake Warning at CMakeLists txt 12 add executable Cannot generate a safe
  • C++ 模板参数类型推断

    我有一个这样的C 模板 template
  • Windows 程序如何临时更改其时区?

    我写了一个函数来返回time t与给定日期的午夜相对应的值 当给定日期没有午夜时 它返回最早可用的时间 例如 当埃及进入夏令时时 这种情况就可能发生 今年 时间更改于 4 月 29 日晚上午夜生效 因此时钟直接从 23 59 转到 01 0
  • Type_traits *_v 变量模板实用程序顺序无法编译

    看过了这个答案 https stackoverflow com a 31763111 7151494 我试图想出一个变量模板从中获取代码的实用程序 template
  • 使用对象列表构建树

    我有一个带有属性 id 和parent id 的对象列表 我想建造一棵树来连接那些孩子和父母 1 个父对象可以有多个子对象 并且有一个对象将成为所有对象的祖先 实现该功能最快的算法是什么 我使用 C 作为编程语言 但其他语言也可以 像这样的
  • 打破条件变量死锁

    我遇到这样的情况 线程 1 正在等待条件变量 A 该变量应该由线程 2 唤醒 现在线程 2 正在等待条件变量 B 该变量应该由线程 1 唤醒 在我使用的场景中条件变量 我无法避免这样的死锁情况 我检测到循环 死锁 并终止死锁参与者的线程之一
  • 为什么我的 ITexthandler 不工作?我正在尝试将 XML 解析为 ITextSharp 文档

    我正在使用 Visual Developer 2010 MVC 3 c 我正在尝试将 XML 解析为 iTextSharp 文档 如下所示 ITextHandler textHandler new ITextHandler doc text
  • 函数模板重载解析期间的 MSVC 与 Clang/GCC 错误,其中一个函数模板包含参数包

    当我使用参数包时 我注意到这样一种情况 如下所示 在 gcc 和 clang 中编译得很好 但在 msvc 中却不行 template
  • fscanf 和 EOF 中的否定扫描集

    我的文件中有一个以逗号分隔的字符串列表 姓名 1 姓名 2 姓名 3 我想跳过所有逗号来阅读这些名字 我写了以下循环 while true if fscanf file my string 1 break 然而 它总是比预期多执行一次 给定
  • 使 C# 编译器相信执行将在成员返回后停止

    我认为目前这是不可能的 或者这是否是一个好主意 但这是我刚才正在考虑的事情 我使用 MSTest 对我的 C 项目进行单元测试 在我的一项测试中 我执行以下操作 MyClass instance try instance getValue
  • 获取大于某个数字的元素个数

    我正在尝试解决以下问题 数字被插入到容器中 每次插入数字时 我需要知道容器中有多少元素大于或等于当前插入的数字 我相信这两个操作都可以以对数复杂度完成 我的问题 C 库中有标准容器可以解决这个问题吗 我知道std multiset可以在对数

随机推荐

  • 从多个 iframe 打印预览?

    我在一个页面中有几个 iframe 我想在打印预览中将所有 iframe 内容显示为 iframe 的快照 我用了window print 对于单个 iframe 来说 它工作得很好 但是我该如何为多个框架做呢 您需要将所有帧一一聚焦并合并
  • AttributeError:“NoneType”对象没有属性“dtype”

    我正在尝试使用张量流实现一个简单的神经网络 这是一个二元分类问题 X train 的形状 batch size 70 和 Y train batch size 2 我正在使用 csv 读取数据 这是我的代码 我在 python 3 6 0
  • __file__ 变量的含义/作用是什么?

    import os A os path join os path dirname file B os path dirname os path realpath file C os path abspath os path dirname
  • Rails 表单数据未保存到数据库

    我是 Rails 新手 正在尝试制作一个简单的网站来开始学习 但是 当我提交表单时 数据不会保存到数据库中 我真的不确定出了什么问题 我已经尝试弄清楚了一段时间了 如果我在 Rails 控制台中创建一条记录并保存它 该记录就会成功显示在数据
  • R 中的 gsub() 不会替换 '.' (点)

    我想替换中的点 2014 06 09 to 2014 06 09 我在用gsub 为它发挥作用 如果 x lt 2014 06 09 gsub 2 x 1 014 06 09 但当我尝试时 gsub x 1 代替 2014 06 09 cl
  • CSS:如何禁用字体的字距调整?

    如何禁用字体的字距调整 See the 字距调整概念 at 维基百科 字距调整不受字母间距控制 并且没有font kerning对于 CSS1 或 CSS2 新规范 CSS3 尚未被批准为标准 W3C 建议 但建议使用一个属性font ke
  • 为什么我不能在没有 的情况下使用

    假设有一个 servlet 其中包含代码 protected void doGet HttpServletRequest req HttpServletResponse resp throws ServletException IOExce
  • 最适合用于 MS SQL 的 uniqueidentifier 字段类型的 Coldfusion cfsqltype 是什么?

    从 Coldfusion 8 连接到 MS SQL 2008 数据源时 我应该使用什么 Coldfusion cfsqltype 将 SQL 列设置为 uniqueidentifier
  • 实体框架格式化 DateTime SQL 参数,不带毫秒以实现乐观并发

    我正在尝试在实体框架中使用具有乐观并发性的 DateTime LastModifiedDate 列 可能会将其升级到 DateTime2 我已将并发模式设置为固定 但是 当我检索实体 更改列并尝试保存时 出现并发异常 存储的LastModi
  • 如何在C#中搜索数据库中的字符串

    这是用于进行搜索的代码 private void button1 Click object sender EventArgs e string connectionString Tyre Properties Settings Defaul
  • 访问服务上的 WCF 客户端身份

    经过几个 WCF 教程后 我可以开发一个 WCF 客户端 服务器应用程序 服务和客户端应用程序都是 Windows 窗体应用程序 我可以通过指定用户名和密码来使用每个客户端调用服务 我的 WCF 服务应用程序还显示所有连接的客户端及其用户名
  • 使用 ggplot2 创建一个指示线段长度的条形图

    我想用ggplot2绘制一些风速和风向数据 所以我编码如下 library dplyr library ggplot2 data lt data frame long 1 4 lat 2 wd x cos 1 4 wd y sin 1 4
  • 如何使用 Maven 在命令行中启动应用程序

    我想在执行后在命令行中运行Android应用程序android deploy maven goal Maven 是否有一些命令可以在安装后运行应用程序 Thanks 姆舍纳克我找到了 Maven 的完整解决方案 首先你需要在 POM 中添加
  • Firefox 和 IE 中的 css 正在渲染旧的 css 文件...chrome 可以很好地显示新的 css

    由于某种原因 我无法在 firefox 或 ie 浏览器中使用新的 css 我使用 php 将所有 css 合并到一个文件中 然后像这样输出 PHP 文件 header Content type text css readfile layo
  • libpng png 的大小

    我的程序从不确定长度的数据流中读取 当它读取 PNG 文件时 它需要存储它以供以后使用 而不是对其进行解码 libpng 是否提供任何函数来提供 PNG 的大小 以便它知道要存储多少字节 如果没有 我是否必须编写自己的 PNG 块解析器来跳
  • 使用 pgu 在 pygame 中制作弹出窗口

    我正在尝试向我用 pygame 编写的游戏添加一些 gui 元素 带有按钮的对话框 我四处寻找一个像样的 GUI 工具包 最后得到了pgu 不管怎样 我试图让它弹出一个对话框 它确实 有点 但它没有关闭 这是我的代码的简化版本 仅显示我关心
  • 带标签的按钮

    如何获取带有特定标签的按钮 id 喜欢然后将其转换为 UIButton 并更改 alpha UIButton button UIButton self view viewWithTag tag button alpha 0 5
  • gem install debugger -v '1.5.0' 失败

    我正在尝试做bundle在 Mavericks 的大型项目中 尽管这是 rbenv 的全新安装 但一些 gem 已损坏或我的环境出现问题 gem install debugger v 1 5 0 Building native extens
  • 是否可以在不刷新整个页面的情况下加载页面内容

    实际上我想刷新页面内容而不通过 JavaScript 或 j Query 刷新整个页面 并且我将整个项目放入 Php 或 javaScript 所以我面临此类问题 Note i want to refresh my page content
  • 在 kernel_fpu_end 之前调用 kernel_fpu_begin 两次

    我正在使用kernel fpu begin and kernel fpu end功能于asm i387 h保护 Linux 内核模块内一些简单浮点运算的 FPU 寄存器状态 我很好奇调用的行为kernel fpu begin之前函数两次ke