在Linux内核中使用浮点寄存器和SIMD寄存器有什么要求?

安全之安全(security²)博客目录导读


问题:在Linux内核中使用浮点寄存器和SIMD寄存器有什么要求?

        操作系统内核调度用户和内核任务,应该保存和恢复它们的上下文。上下文涉及通用寄存器、浮点和SIMD (FPSIMD)寄存器以及必要的系统寄存器。

        Linux内核为FPSIMD寄存器实现了惰性上下文处理,因为这些寄存器有相当大的成本,而且并非所有软件应用程序和内核任务都使用FPSIMD寄存器。出于性能原因,在内核中,FPSIMD寄存器不像通用寄存器那样在每次上下文切换时都保留和恢复。

        在arm64 Linux内核空间中使用浮点寄存器和SIMD寄存器有什么要求?

答案

        在内核和用户空间中使用FPSIMD寄存器都有一些要求。如果不遵循这些要求,FPSIMD寄存器值可能会损坏。

        在Linux内核中,使用FPSIMD指令的内核函数必须调用kernel_neon_begin()和kernel_neon_end()对。内核上下文可以是soft IRQ上下文。

        如果用户上下文有效,kernel_neon_begin()将保存它,并在返回给用户时(通过执行ERET指令)恢复它。这些函数也禁用抢占,因此不需要__switch_to()来切换内核FPSIMD上下文。每次使用FPSIMD时,该函数必须调用kernel_neon_begin()。

注意:

1)如果内核在不支持FPSIMD的情况下编译,则必须显式地发出FPSIMD指令,通常在一些. s文件中。
2)Arm和arm64内核在保存和恢复用户任务上的FPSIMD寄存器文件方面有不同的实现。但是,两者都在必要时在内核空间中处理上下文。

参考:Documentation – Arm Developer

你可能感兴趣的:(ARM安全架构,Linux,浮点寄存器,SIMD,上下文,保存恢复)