为什么我能够在 Linux 内核模块内执行浮点运算?

2023-12-03

我在 x86 CentOS 6.3(内核 v2.6.32)系统上运行。

我将以下函数编译到一个简单的字符驱动程序模块中作为实验,以了解 Linux 内核对浮点运算的反应。

static unsigned floatstuff(void){
    float x = 3.14;
    x *= 2.5;
    return x;
}

...

printk(KERN_INFO "x: %u", x);

代码已编译(这不是预期的),所以我插入了模块并检查了日志dmesg。日志显示:x: 7.

这看起来很奇怪;我以为你不能在 Linux 内核中执行浮点运算——保存一些异常,例如kernel_fpu_begin()。模块是如何进行浮点运算的?

这是因为我使用的是 x86 处理器吗?


我以为你不能在Linux内核中执行浮点运算

你不能safely: 无法使用kernel_fpu_begin() / kernel_fpu_end()并不意味着 FPU 指令会出错(至少在 x86 上不会)。

相反,它会默默地破坏用户空间的 FPU 状态。这不好;不要那样做。

编译器不知道什么kernel_fpu_begin()意味着,因此它无法检查/警告在 FPU 开始区域之外编译为 FPU 指令的代码。

可能有一种调试模式,内核会在外部禁用 SSE、x87 和 MMX 指令kernel_fpu_begin / end区域,但这会比较慢并且默认情况下不会这样做。

不过,这是可能的:设置CR0::TS = 1使 x87 指令出现故障,因此可以进行惰性 FPU 上下文切换,并且还有用于 SSE 和 AVX 的其他位。


many有缺陷的内核代码导致严重问题的方法。这只是众多之一。在 C 中,您几乎总是知道何时使用浮点(除非拼写错误导致1.常量或实际编译上下文中的某些内容)。


为什么 FP 架构状态与整数不同?

Linux 在每次进入/退出内核时都必须保存/恢复整数状态。所有代码都需要使用整数寄存器(除了以 FPU 计算结尾的巨大直线块)jmp代替ret (ret修改rsp).)

但内核代码通常会避免 FPU,因此 Linux 在系统调用进入时不保存 FPU 状态,仅在实际上下文切换到不同的上下文之前保存用户空间过程或kernel_fpu_begin。否则,返回到同一内核上的同一用户空间进程是很常见的,因此不需要恢复 FPU 状态,因为内核没有触及它。 (如果内核任务确实修改了 FPU 状态,这就是发生损坏的地方。我认为这是双向的:用户空间也可能损坏yourFPU 状态)。

整数状态相当小,只有 16 个 64 位寄存器 + RFLAGS 和段寄存器。即使没有 AVX,FPU 状态也会大两倍以上:8 个 80 位 x87 寄存器,以及 16 个 XMM 或 YMM,或 32 个 ZMM 寄存器(+ MXCSR 和 x87 状态 + 控制字)。还有MPXbnd0-4寄存器集中在“FPU”中。此时“FPU 状态”仅表示所有非整数寄存器。在我的天湖上,dmesg says x86/fpu: Enabled xstate features 0x1f, context size is 960 bytes, using 'compacted' format.

See 了解Linux内核中FPU的使用;现代 Linux 默认情况下不会为上下文切换执行惰性 FPU 上下文切换(仅适用于内核/用户转换)。 (但那篇文章解释了 Lazy 是什么。)

大多数进程使用 SSE 在编译器生成的代码中复制/清零小内存块,并且大多数库 string/memcpy/memset 实现使用 SSE/SSE2。此外,硬件支持的优化保存/恢复现在已经成为一件事(xsaveopt/ xrstor),因此,如果某些/所有 FP 寄存器实际上尚未使用,“急切的”FPU 保存/恢复实际上可能会做更少的工作。例如仅保存 YMM 寄存器的低 128b(如果它们被清零)vzeroupper所以CPU知道它们是干净的。 (并在保存格式中仅用一位来标记这一事实。)

通过“急切”的上下文切换,FPU 指令始终保持启用状态,因此不良的内核代码可能随时损坏它们。

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

为什么我能够在 Linux 内核模块内执行浮点运算? 的相关文章

  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 用于 FTP 的文件系统观察器

    我怎样才能实现FileSystemWatcherFTP 位置 在 C 中 这个想法是 每当 FTP 位置添加任何内容时 我都希望将其复制到我的本地计算机 任何想法都会有所帮助 这是我之前问题的后续使用 NET 进行选择性 FTP 下载 ht
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • Linux 中 m 标志和 o 标志将存储在哪里

    我想知道最近收到的路由器通告的 m 标志和 o 标志的值 从内核源代码中我知道存储了 m 标志和 o 标志 Remember the managed otherconf flags from most recently received R
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • Mono 应用程序在非阻塞套接字发送时冻结

    我在 debian 9 上的 mono 下运行一个服务器应用程序 大约有 1000 2000 个客户端连接 并且应用程序经常冻结 CPU 使用率达到 100 我执行 kill QUIT pid 来获取线程堆栈转储 但它总是卡在这个位置

随机推荐

  • Jersey REST 服务上的用户身份验证

    我正在开发一个 REST 应用程序 它使用 Jersey 框架 我想知道如何控制用户身份验证 我查了很多地方 找到最接近的文章是这样的 http weblogs java net blog 2008 03 07 authentication
  • 当 RecyclerView 正在计算布局或尝试从 recyclerview 中删除项目时滚动时,无法调用此方法

    我正在尝试从 recyclerview 中删除我的项目 但我总是收到错误 java lang IllegalStateException 无法调用此方法 RecyclerView 正在计算布局或滚动 我正在使用notify datasetc
  • DataTable Wrapper 或如何将 UI 与业务逻辑解耦

    我正在使用 Web 表单 C Asp net 众所周知 在这个模型中 UI和业务逻辑经常是混合在一起的 如何有效地将它们分开呢 我想使用的例子是 我有一个 GridView 和一个 DataTable GridView 绑定到 DataTa
  • 引用类型作为参数

    所以我深入阅读 Jon Skeet 的 C 并遇到了一些误解 比如引用类型总是通过 ref 传递 所以我决定自己做一个小实验 正如您在下面的代码中看到的 我有一个简单的 Car 类 其中一个属性在调用构造函数时初始化为 500 我还有 Nu
  • 在多个图中添加单独的箭头

    我想在用 ggplot 和 faceting 生成的 2 个图中添加箭头 问题 如何避免两个图中的箭头重复 我想为每个图添加单独的箭头 这是一个例子 library ggplot2 data frame with fake data xdf
  • Ruby 三元运算符结构

    puts bool true false 是正确的 但是 bool puts true puts false 不是 有人可以向我解释这是为什么吗 边注 bool puts true puts false 效果也很好 当您不在方法调用上添加括
  • Rails:如何将 i18n 与 Rails 4 枚举一起使用

    Rails 4 活动记录枚举很棒 但是使用 i18n 进行翻译的正确模式是什么 从Rails 5开始 所有模型都将继承自ApplicationRecord class User lt ApplicationRecord enum statu
  • SVG 未在 Windows Phone 8 Phonegap 应用程序中显示

    似乎无法找到任何答案 使用 Phonegap 并使用 SVG 图像开发 HTML5 应用程序 从 Adob e Illustrator 的 另存为 中保存它们 然后像 HTML 中的普通图像一样使用它们 img src img the im
  • 组合框中的热跟踪列表项选择

    我有一个组合框 当用户仅通过鼠标悬停来更改选择时 我需要拦截选择的更改without点击 这是为了显示有关用户将鼠标悬停在其上的项目的补充信息 CBN SELCHANGE不会完成这项工作 因为只有当用户有actually通过单击组合框项目之
  • git stash pop 和 git stash apply 之间的区别

    我一直在使用git stash pop很长一段时间 我最近了解到git stash apply命令 当我尝试它时 它的工作原理似乎与git stash pop 有什么区别git stash pop and git stash apply g
  • 快速识别用户在编辑 NSTextField 时是否按下了箭头键

    我有很多 NSTextField 我想知道用户在编辑其中之一时是否按下了方向键之一 功能 override func keyDown theEvent NSEvent switch theEvent character case NSRig
  • 如何使用 AndEngine 通过滑动来投掷/投掷球?

    我在屏幕上有一个球精灵 当我触摸并滑动该精灵时 它必须沿特定的滑动方向移动 我给那个球添加了物理原理 我想做类似的事情扔纸 谁能帮我吗 提前致谢 您需要重写 Sprite 的 onAreaTouched 方法 如下所示 您可以从 pScen
  • 条件面板上的动画

    我想在我的条件面板上添加一些动画 我找到了这里提供的解决方案 闪亮条件面板的动画 过渡 我真的很喜欢这个解决方案 但我有一个问题 检查以下示例 library shiny library shinyjs library shinydashb
  • 如何获取当前日期或/和时间(以秒为单位)

    如何使用 Javascript 获取当前日期或 和时间 以秒为单位 var seconds new Date getTime 1000 将为您提供自 1970 年 1 月 1 日午夜以来的秒数 参考
  • Apache2、PHP:创建自动ntlm登录页面

    我有 Apache2 和 PyAuthenNTLM2 模块 请参阅https github com Legrandin PyAuthenNTLM2 该 Apache 模块将 Windows 用户名放入 SERVER REMOTE USER
  • Outlook.com HTML 电子邮件中条件注释的可靠解决方案

    我在这里和其他地方看到了设置条件评论以与 Outlook com 一起使用的推荐方法 但由于下面详细介绍的另一个已知问题 我收到了空白电子邮件 参考下面的两个代码示例 我想看看是否有人有解决此问题的可靠方法 第一个例子 上面的代码会导致 O
  • Python 字节字符串在字典中打印不正确

    考虑一个列表包含字节数据 即 x03 x00 x32 temp b for c in field data temp c print x ord c 上面的代码正确地将所有字节连接到 temp 字节字符串文字 中 但是当我将其添加到字典元素
  • 点点参数的范围

    我对点 点 点参数的范围有疑问 考虑以下函数 foo foo lt function x require classInt intvl classIntervals x return intvl 该函数非常适合以下调用 x runif 10
  • Java File.renameTo(File) 不起作用

    我正在尝试列出目录的内容 并重命名某些文件 public void run String dirName try File parDir new File dirName File dirContents parDir listFiles
  • 为什么我能够在 Linux 内核模块内执行浮点运算?

    我在 x86 CentOS 6 3 内核 v2 6 32 系统上运行 我将以下函数编译到一个简单的字符驱动程序模块中作为实验 以了解 Linux 内核对浮点运算的反应 static unsigned floatstuff void floa