在运行Linux的英特尔x86平台上,在C/C++中,如何告诉操作系统与硬件将值(如uint32)存储在一级/二级缓存中,而不是系统内存中?例如,假设出于安全或性能原因,我不想在DRAM中存储32位密钥(32位无符号整数),而只希望将其存储在处理器的缓存中。我该怎么做呢?我在Intel Xeon处理器上使用Fedora 16 (Linux 3.1和gcc 4.6.2)。
非常感谢您的帮助!
发布于 2012-02-16 03:52:24
我不认为您能够强制将变量存储在处理器的缓存中,但是您可以使用register关键字建议编译器将给定的变量分配到CPU寄存器中,声明如下:
register int i;发布于 2012-02-16 03:52:38
在x86 (或者据我所知的任何平台)上没有cpu指令可以让你强制CPU在L1/L2缓存中保留一些东西。更不用说向C/C++这样的高级语言公开如此低层次的细节了。说你需要这样做是为了“性能”,如果没有更多关于你所关注的性能的上下文,那么这是没有意义的。为什么你的程序如此依赖于只访问缓存中的数据。说你需要这个来保证安全,这似乎是一个糟糕的安全设计。在任何一种情况下,您都必须提供更多的详细信息,说明您在这里到底想要做什么。
发布于 2012-02-16 03:52:48
简而言之,你不能-这不是这些缓存的目的-它们从主内存馈送,以加快访问速度,或允许分支预测和流水线等高级技术。
有一些方法可以确保高速缓存用于某些数据,但它仍然驻留在ram中,并且在抢占式多任务操作系统中,您不能保证您的高速缓存内容不会通过任何两个指令之间的上下文切换而消失,除非是通过“停止世界”或低级原子操作,但它们通常用于非常、非常、非常短的指令序列,这些指令序列根本不能被中断,例如用于自旋锁的增量和提取,而不是一次性处理密码算法。
https://stackoverflow.com/questions/9300218
复制相似问题