C 中断对上下文的破坏程度如何?如何恢复它?
5当抽象机器的处理被 接收到一个信号,即既不是无锁对象的值 未指定volatile sig_原子类型的原子对象或, 浮点环境的状态也是如此。任何 由处理程序修改的对象,该对象既不是无锁原子 volatile sig_atomic_t类型的对象nor在以下情况下变得不确定: 处理程序将退出,浮点环境的状态也将退出 如果处理程序对其进行了修改,但未将其恢复为原始状态 说明。 (强调矿山) 我认为这意味着,在硬件/软件中断的情况下,如果中断处理程序执行任何浮点计算(例如,在其本地堆栈变量上),中断的进程将处于不一致的状态,并且必须重新启动正在进行的任何浮点计算。是这样吗?其含义是什么?如何“恢复上下文”?浮点环境指的是设置浮点异常和舍入模式,由诸如C 中断对上下文的破坏程度如何?如何恢复它?,c,language-lawyer,C,Language Lawyer,5当抽象机器的处理被 接收到一个信号,即既不是无锁对象的值 未指定volatile sig_原子类型的原子对象或, 浮点环境的状态也是如此。任何 由处理程序修改的对象,该对象既不是无锁原子 volatile sig_atomic_t类型的对象nor在以下情况下变得不确定: 处理程序将退出,浮点环境的状态也将退出 如果处理程序对其进行了修改,但未将其恢复为原始状态 说明。 (强调矿山) 我认为这意味着,在硬件/软件中断的情况下,如果中断处理程序执行任何浮点计算(例如,在其本地堆栈变量上),中断的进
fesetround()
之类的函数修改
您可以使用
fegetenv()
保存当前浮点环境,并使用fesetenv()
还原它。如果您安装了一个执行浮点操作的信号处理程序,那么它应该这样做(例如,这确保它不会改变它中断的代码当前引发的浮点异常集)。我认为我们可以在内核中执行浮点操作。但是,如果这个(您的代码)被kernel\u fpu\u begin()/kernel\u fpu\u end()包围,那么内核通过调用一些特定函数来支持它。这些函数用于保存和恢复fpu上下文。此外,它们调用抢占禁用()/preempt启用(),这意味着没有睡眠、页面错误等
当任何中断发生时,当前运行进程的控制寄存器和其他信息被保存内核中断工作—当前运行进程处于何种状态并不重要,因为进程只有在完成当前指令周期后才会中断。然后保存所有信息并进行上下文切换
在恢复上下文的过程中,中断进程的存储控制信息被恢复到堆栈中&执行下一条指令 你会详细阐述你的问题吗!!!