0

§5.1.2.3.5

5 当抽象机的处理因接收到信号而中断时,不指定既不是无锁原子对象也不是 volatile sig_atomic_t 类型的对象的值,浮点环境的状态也是如此。处理程序修改的任何对象(既不是无锁原子对象也不是 volatile sig_atomic_t 类型)的值在处理程序退出时变得不确定,如果浮点环境的状态被处理程序修改且未恢复,则它的状态也是不确定的回到原来的状态。

(强调我的)

我认为这意味着,在硬件/软件中断的情况下,如果中断处理程序执行任何浮点计算(例如,在它的本地堆栈变量上),被中断的进程将处于不一致的状态,并且必须重新启动任何浮点计算正在进行中。是这样吗?有什么影响?如何“还原语境”?

4

2 回答 2

1

“浮点环境”是指浮点异常和舍入模式的设置,由fesetround().

您可以使用 保存当前的浮点环境fegetenv(),并使用 恢复它fesetenv()。如果您安装了一个执行浮点操作的信号处理程序,那么它应该这样做(例如,这可以确保它不会改变它中断的代码的当前引发的浮点异常集)。

于 2013-04-29T06:49:21.550 回答
0

我认为我们可以在侧内核中执行浮点运算。但是如果这个(你的代码)被kernel_fpu_begin()/kernel_fpu_end()包围,内核通过调用一些特定的函数来支持它。这些函数处理保存和恢复 fpu 上下文。此外,他们调用preempt_disable()/preempt_enable(),这意味着没有睡眠、页面错误等。

每当发生任何中断时,都会保存当前运行进程的控制寄存器和其他信息。&内核中断工作与当前运行的进程处于哪个状态无关紧要,因为该进程仅在完成当前指令周期后才会被中断。然后保存所有信息并发生上下文切换

在恢复上下文期间,被中断进程的存储控制信息在堆栈中恢复并执行下一条指令!!!

于 2013-04-29T06:57:30.503 回答