一尘不染

禁止在x86 / x86_64上进行未对齐的内存访问

linux

我想用x86 / x86_64上禁止的未对齐内存访问来模拟系统。有一些调试工具或特殊模式可以做到这一点吗?

当使用为SPARC或其他类似CPU设计的软件(C / C ++)时,我想在几台x86 / x86_64
PC上运行许多(CPU密集型)测试。但是我对Sparc的访问受到限制。

据我所知,Sparc总是检查内存读写的对齐是否自然(从任何地址读取一个字节,但仅当地址被4整除时才读取4字节的字)。

可能是Valgrind或PIN具有这种模式?还是特殊模式的编译器?我正在搜索Linux非商业工具,但Windows工具也允许。

还是在EFLAGS中有秘密的CPU标志?


阅读 327

收藏
2020-06-07

共1个答案

一尘不染

这很棘手,我还没有亲自完成,但是我认为您可以通过以下方式做到:

x86_64 CPU(特别是我已经检查过Intel
Corei7,但我猜还有其他CPU)具有性能计数器MISALIGN_MEM_REF,用于计数器未对齐的内存引用。

因此,首先,您可以在Linux下运行程序并使用“ perf”工具来获取您的代码已完成的未对齐访问次数的计数。

一个更加棘手和有趣的技巧是编写一个内核模块,该模块对性能计数器进行编程,以在溢出时生成中断,并使它在第一个未对齐的加载/存储中溢出。在内核模块中响应此中断,但向进程发送信号。

实际上,这会将x86_64变成不支持未对齐访问的内核。

不过,这不会很简单-除了代码之外,系统库还使用未对齐的访问,因此将它们与您自己的代码分开将非常棘手。

2020-06-07