我想在x86 / x86_64上使用禁止的未alignment内存访问来模拟系统。 有一些debugging工具或特殊模式来做到这一点?
在使用为SPARC或某些其他类似CPUdevise的软件(C / C ++)时,我想在多个x86 / x86_64 PC上运行许多(CPU密集型)testing。 但是我对Sparc的访问是有限的。
据我所知,Sparc总是在内存读取和写入中检查alignment是自然的(从任何地址读取一个字节,但只有在地址被4整除时才允许读取一个4字节的字)。
可能是Valgrind或PIN有这样的模式? 还是特殊模式的编译器? 我正在寻找Linux非商业工具,但也允许Windows工具。
或者可能是EFLAGS中有秘密的CPU标志?
这是棘手的,我没有亲自做过,但我认为你可以这样做:
x86_64 CPU(特别是我检查过英特尔Corei7,但我猜别人也有)有一个性能计数器MISALIGN_MEM_REF计数器错位的内存引用。
所以首先,你可以运行你的程序,使用Linux下的“perf”工具来计算你的代码已经完成的错位访问次数。
一个更棘手和有趣的黑客将编写一个内核模块,编程性能计数器产生溢出中断,并让它溢出第一个未对齐的加载/存储。 在内核模块中响应这个中断,但发送一个信号给你的进程。
实际上,这将把x86_64变成一个不支持未对齐访问的内核。
这不会是简单的 – 除了你的代码,系统库也使用未对齐的访问,所以将它们与你自己的代码分开将是棘手的。
我刚刚读过的问题未对齐的内存访问总是会导致总线错误? 其中链接到维基百科文章Segmentation Fault 。
在文章中,有一个非常不寻常的英特尔处理器标志 AC又名对齐检查的提醒。
以下是如何启用它(从分段错误 ):
#if defined(__GNUC__) # if defined(__i386__) /* Enable Alignment Checking on x86 */ __asm__("pushf\norl $0x40000,(%esp)\npopf"); # elif defined(__x86_64__) /* Enable Alignment Checking on x86_64 */ __asm__("pushf\norl $0x40000,(%rsp)\npopf"); # endif #endif
一旦启用它就像在/proc/cpu/alignment
ARM对齐设置一样工作,请参阅答案如何捕获未对齐的内存访问? 举些例子。
此外,如果您使用GCC,我建议您启用-Wcast-align
警告。 在针对严格的对齐要求(例如ARM)构建目标时,GCC将报告可能导致未对齐内存访问的位置。
也许你可以通过所有对齐的动作编译成SSE。 使用movaps
进行未对齐的访问是非法的,可能会在其他体系结构上表现为非法的未对齐访问。