Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 中断对上下文的破坏程度如何?如何恢复它?_C_Language Lawyer - Fatal编程技术网

C 中断对上下文的破坏程度如何?如何恢复它?

C 中断对上下文的破坏程度如何?如何恢复它?,c,language-lawyer,C,Language Lawyer,5当抽象机器的处理被 接收到一个信号,即既不是无锁对象的值 未指定volatile sig_原子类型的原子对象或, 浮点环境的状态也是如此。任何 由处理程序修改的对象,该对象既不是无锁原子 volatile sig_atomic_t类型的对象nor在以下情况下变得不确定: 处理程序将退出,浮点环境的状态也将退出 如果处理程序对其进行了修改,但未将其恢复为原始状态 说明。 (强调矿山) 我认为这意味着,在硬件/软件中断的情况下,如果中断处理程序执行任何浮点计算(例如,在其本地堆栈变量上),中断的进

5当抽象机器的处理被 接收到一个信号,即既不是无锁对象的值 未指定volatile sig_原子类型的原子对象或, 浮点环境的状态也是如此。任何 由处理程序修改的对象,该对象既不是无锁原子 volatile sig_atomic_t类型的对象nor在以下情况下变得不确定: 处理程序将退出,浮点环境的状态也将退出 如果处理程序对其进行了修改,但未将其恢复为原始状态 说明。

(强调矿山)

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

浮点环境指的是设置浮点异常和舍入模式,由诸如
fesetround()
之类的函数修改


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

我认为我们可以在内核中执行浮点操作。但是,如果这个(您的代码)被kernel\u fpu\u begin()/kernel\u fpu\u end()包围,那么内核通过调用一些特定函数来支持它。这些函数用于保存和恢复fpu上下文。此外,它们调用抢占禁用()/preempt启用(),这意味着没有睡眠、页面错误等

当任何中断发生时,当前运行进程的控制寄存器和其他信息被保存内核中断工作—当前运行进程处于何种状态并不重要,因为进程只有在完成当前指令周期后才会中断。然后保存所有信息并进行上下文切换


在恢复上下文的过程中,中断进程的存储控制信息被恢复到堆栈中&执行下一条指令

你会详细阐述你的问题吗!!!