1

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

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

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

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

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

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

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

4

1 回答 1

3

这些陷阱通常由硬件本身指令集架构(ISA) 级别生成。特别是在 x86-64 上。

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

所以没有这样的文件。但是,操作系统 内核(尤其是 Linux 上的signal(7) -s ...)正在将陷阱转换为其他内容。

请阅读操作系统:三个简单的部分了解更多信息。并详细研究x86-64指令集。

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

C 语言(阅读n1570,实际上是 C11 标准)定义了未定义行为的概念,以尽可能快速和简单地处理此类情况。阅读 Lattner 的关于未定义行为的博客每个 C 程序员都应该了解的内容。

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

于 2019-06-25T04:52:44.527 回答