如何使用x86中的CPUID指令接收L1,L2和L3高速缓存大小

Tom*_*iuk 6 x86 caching cpuid

我在准备汇编程序x86项目时遇到了一个问题,该程序的主题是编写一个获取L1数据,L1代码,L2和L3缓存大小的程序.

我试图在英特尔文档和互联网上找到一些东西,但我失败了.

主要问题是:对于AMD处理器,只需将EAX寄存器设置为80000005h和80000006h值,并从ECX和EDX寄存器获取所需数据,但在Intel情况下,我只能获取L2的此信息.

我该怎么做才能获得英特尔处理器的L1和L3缓存大小?

Fiz*_*izz 4

Marat Dukhan 基本上给了你正确的答案。对于较新的 Intel 处理器,即过去 5-6 年制造的处理器,最佳解决方案是枚举 cpuid leaf 4,这意味着您调用 cpuid 几次,首先使用 EAX=4 和 ECX=0,然后使用 EAX= 4且ECX=1等等。这不仅会返回有关缓存大小和类型的信息,还会告诉您这些缓存如何连接到 CPU 内核和超线程/SMT 单元。算法和示例代码在https://software.intel.com/en-us/articles/intel-64-architecture-processor-topology-enumeration/中给出,更具体地在标题为“缓存拓扑枚举”的部分中给出。

  • 我还建议研究 glibc 或其他 libc 实现对“getconf LEVEL2_CACHE_SIZE”的作用。glibc 源点显示在:https://superuser.com/questions/55776/how-to-find-the-l2-cache-size-in-linux/1298808#1298808 (3认同)