c - 浮点异常的陷阱是如何生成的?

标签 c gcc glibc riscv fenv

我想知道当启用陷阱时,glibc 库中的哪些代码和文件负责生成浮点异常陷阱。

目前,RISC-V 的 GCC 不捕获浮点异常。我有兴趣添加此功能。因此,我正在研究如何在 x86 的 GCC 中实现此功能。

我知道我们可以按照[问题]中的描述捕获信号 ( Trapping floating-point overflow in C ),但我想了解有关其工作原理的更多详细信息。

我浏览了 glibc/math 中的文件,据我所知,这些文件以某种形式负责生成陷阱,例如

fenv.h
feenablxcpt.c
fegetexpect.c
feupdateenv.c

以及许多其他以fe开头的文件。

所有这些文件也存在于 RISC-V 的 glibc 中。我无法 弄清楚 x86 的 glibc 如何生成陷阱。

最佳答案

这些traps通常由硬件本身生成,位于 instruction set architecture (ISA)级别。特别是在 x86-64 上。

I want to know which code and files in the glibc library are responsible for generating traps for floating point exceptions when traps are enabled.

所以没有这样的文件。然而,operating system kernel (尤其是 Linux 上的 signal(7) -s...)正在将陷阱转换为其他内容。

请阅读Operating Systems: Three Easy Pieces了解更多。并研究x86-64详细说明设置。

一个更熟悉的例子是整数除以零。在大多数硬件上,这会产生一个机器陷阱(或机器 exception ),由内核处理。在某些硬件(IIRC, PowerPC )上,它给出 -1 作为结果并设置状态寄存器中的某些位。进一步的机器代码可以测试该位。我相信GCC在某些情况下,编译器会optimizations禁用,在每次划分后生成这样的测试。但并不需要这样做。

C 语言(读 n1570 ,实际上是 C11 标准)定义了 undefined behavior 的概念尽可能快速、简单地处理此类情况。阅读拉特纳的 What every C programmer should know about undefined behavior博客。

既然你提到RISC-V ,阅读 RISC上个世纪的哲学,并意识到设计out-of-ordersuper-scalar处理器需要大量的工程工作。我的猜测是,如果您在 x86-64 上投入与英特尔(或者在较小程度上 AMD)一样多的研发资金(这意味着数百亿美元或欧元)到 RISC-V 芯片上,您可以获得可比的成果当前 x86-64 处理器的性能。请注意,SPARC 或 PowerPC(或者可能是 ARM)芯片是类似 RISC 的,它们最好的处理器在性能上几乎可以与英特尔芯片相媲美,但研发投资可能比英特尔在其微处理器上的投入少十倍。

关于c - 浮点异常的陷阱是如何生成的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56746968/

相关文章:

c - 如何让我的 C 程序允许用户创建自己的文件名?

c - 将头文件包含到静态库中

c - 错误代码+GCC 5.4优化导致死循环

gcc - 如何将部分映射到 ELF 输出文件中的段?

c - fallocate 和 ftruncate 有什么区别

c - gets() 函数和输入中的 '\0' 零字节

C - 使用 argv 命令

c - 如何在 CANbus RX/TX FIFO 起始地址寄存器 (ATSAME51) 的特定地址处初始化数组?

c++ - 编译时已知数组大小 : passed compilation using g++ but not for icpc

c - 直接从 FILE 缓冲区读取