在使用ASENI指令访问之前,我们为什么要检查irq_fpu_usable

时间:2014-07-18 09:20:33

标签: linux-kernel x86 kernel x86-64

在内核中,我们在使用任何AESNI x86 asm相关之前检查irq_fpu_usable 指令。  对应的内核代码。  文件:arch / x86 / crypto / aesni-intel_glue.c

static int ablk_encrypt(struct ablkcipher_request *req)
{
  ...
    if (!irq_fpu_usable() { 
         Dont use AESNI instruction. 
    } else {
         USe AESNI instruction. 
    }
}
  1. 我们为什么要检查FPU是否可以使用AESNI指令?
  2. AESNI intructions是否会使用FPU?

2 个答案:

答案 0 :(得分:3)

AES-NI使用XMM寄存器,它们是FPU状态的一部分。

答案 1 :(得分:2)

一般情况下,内核在保存和恢复状态时会尝试保持懒惰,因为它在内核和用户空间之间反弹,因为它是一项相当昂贵的活动。现代SIMD类型指令尤其如此,它可以添加相当数量的寄存器来保存。因此,它会跟踪用户空间何时使用它们,以便在需要时可以保存/恢复其状态。

irq_fpu_usable()的情况实际上是检查它是否在一个中断状态,在需要时懒惰地完成保存状态。但是,如果内核在内核空间中获取IRQ,则只有在内核尚未使用FPU时才能安全地执行此操作。