【问题标题】:How disrupting are interrupts to the context? How does one restore it?中断对上下文的破坏性如何?如何恢复它?
【发布时间】:2013-04-29 06:42:47
【问题描述】:

§5.1.2.3.5

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

(强调我的)

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

【问题讨论】:

  • 你能详细说明你的问题吗!!!

标签: c language-lawyer


【解决方案1】:

“浮点环境”是指浮点异常和舍入模式的设置,由fesetround()等函数修改。

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-15
      • 1970-01-01
      • 1970-01-01
      • 2021-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多