在内核中,我们在使用任何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.
}
}
答案 0 :(得分:3)
AES-NI使用XMM寄存器,它们是FPU状态的一部分。
答案 1 :(得分:2)
一般情况下,内核在保存和恢复状态时会尝试保持懒惰,因为它在内核和用户空间之间反弹,因为它是一项相当昂贵的活动。现代SIMD类型指令尤其如此,它可以添加相当数量的寄存器来保存。因此,它会跟踪用户空间何时使用它们,以便在需要时可以保存/恢复其状态。
irq_fpu_usable()的情况实际上是检查它是否在一个中断状态,在需要时懒惰地完成保存状态。但是,如果内核在内核空间中获取IRQ,则只有在内核尚未使用FPU时才能安全地执行此操作。