将C/C++变量存储在处理器缓存中而不是系统内存中

Ste*_*hon 6 c caching cache-control

在运行Linux的Intel x86平台上,在C/C++中,如何告诉操作系统和硬件在L1/L2缓存中存储值(例如uint32),而不是在系统内存中?例如,假设出于安全性或性能原因,我不想在DRAM中存储32位密钥(32位无符号整数),而是希望仅将其存储在处理器的缓存中.我怎样才能做到这一点?我在Intel Xeon处理器上使用Fedora 16(Linux 3.1和gcc 4.6.2).

非常感谢您的帮助!

che*_*tan 6

x86(或者我所知道的任何平台)上都没有cpu指令可以强制CPU保留L1/L2缓存中的某些内容.更不用说将这种极低级别的细节暴露给更高级别的语言,如C/C++.如果没有更多关于你正在考虑什么样的表现的背景,说你需要为"表现"这样做是没有意义的.为什么您的程序如此严格依赖于仅在缓存中访问数据.说你需要这个用于安全性似乎是糟糕的安全设计.在任何一种情况下,您都必须提供更多详细信息,说明您在这里尝试做什么.


Win*_*n32 5

我认为您不能强制将变量存储在处理器的缓存中,但是您可以使用register关键字向编译器建议应该将给定的变量分配到 CPU 寄存器中,声明如下:

register int i;
Run Code Online (Sandbox Code Playgroud)


小智 5

简短的回答,你不能 - 这不是那些缓存的用途 - 它们来自主存储器,加速访问,或允许分支预测和流水线等高级技术.

有一些方法可以确保缓存用于某些数据,但它仍然存在于ram中,并且在一个先发制人的多任务操作系统中,您无法保证您的缓存内容不会被任何两个之间的上下文切换所淹没指令,除了"停止世界"或低级原子操作,但它们通常用于非常非常非常短的指令序列,这些指令简单地不能被中断,例如自旋锁的增量和获取,而不是一个处理加密算法走.