我想编写一些能够在 PowerPC 上查询处理器属性的 C 代码,就像在 x86 上使用 cpuid 一样。我关注品牌、型号、步进、SIMD 宽度、可用操作等信息,以便在出现问题之前可以在运行时确认代码正在兼容平台上使用。
是否有在 PowerPC 上执行此操作的通用机制?如果是这样,在哪里可以读到它?
请注意,PowerPC 没有像 x86 这样的几十个扩展/功能。需要读取可能依赖于内核的特定特权寄存器。
我在 Linux 上进行了检查,您可以访问 PVR,内核中有一个陷阱来管理它。
如果支持 Altivec,则读取 /proc/cpuinfo 可以返回内存和 L2 缓存大小……但这并不是很方便。
这里描述了一个更好的解决方案: http ://www.freehackers.org/thomas/2011/05/13/how-to-detect-altivec-availability-on-linuxppc-at-runtime/
它使用 /proc/self/auxv 的内容,该内容提供“在执行时传递给进程的 ELF 解释器信息”。
该示例是关于 Altivec 的,但您可以获得其他功能(包括“asm/cputable.h”中列出):32 位或 64 位 cpu、Altivec、SPE、FPU、MMU、4xx MAC...
最后,您将找到有关缓存的信息(大小、行大小、关联性……),查看以下文件:/sys/devices/system/cpu/cpu0/cache
PowerPC 没有与 CPUID 指令类似的指令。最接近的方法是读取 PVR(处理器版本寄存器)。不过,这是一个主管特权的 SPR。但是,某些操作系统,例如 FreeBSD,会为用户空间进程捕获并执行它。
PVR 是只读的,对于任何给定的处理器型号和版本都应该是唯一的。鉴于此,您可以确定给定 CPU 提供了哪些功能。