当前位置: 首页 > 面试题库 >

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

子车征
2023-03-14
问题内容

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

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

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

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

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


问题答案:

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

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

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

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

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

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



 类似资料:
  • 我想模拟x86/x86_64上禁止未对齐内存访问的系统。是否有一些调试工具或特殊模式来执行此操作? 当使用为SPARC或其他类似CPU设计的软件(C/C)时,我想在几台x86/x86_64PC上运行许多(CPU密集型)测试。但是我对Sparc的访问是有限的。 正如我所知,Sparc总是检查内存读写的对齐是否正常(从任何地址读取一个字节,但仅当地址可被4整除时才允许读取一个4字节的字)。 可能是Va

  • 一般有两种类型的SIMD指令: A、 使用对齐内存地址的,如果地址在操作数大小边界上未对齐,则会引发一般保护(#GP)异常: B.以及那些与未对齐的内存地址一起工作的,不会引发此类异常: 但我只是好奇,为什么我要开枪打自己的脚,并使用第一组的对齐内存指令呢?

  • 问题内容: 我正在开发一个宠物的开源项目,该项目实现了一些流密码算法,并且只有在ARM处理器上运行该bug时,我才遇到问题。我什至尝试在qemu下的x86中运行ARM二进制文件,但该错误并未在那里触发。 该错误的具体机制仍然难以捉摸,但是我最好的选择是相信它是由程序中未对齐的内存访问尝试引起的,这是qemu实现的,但被开发板中的真正ARM处理器默默忽略了。 因此,由于该问题很难诊断,所以我想知道是

  • 也许我误解了什么,但x86中的未对齐访问似乎带来了安全问题,例如返回地址完整性问题。 > 为什么x86设计器首先允许未对齐的访问?(性能是我能想到的唯一好处。) 如果x86设计人员允许这种未对齐的访问问题,他们应该知道如何解决它,不是吗?是否可以使用静态技术或清理技术检测未对齐的访问?

  • 我总是听说未对齐的访问是不好的,因为它们要么会导致运行时错误并使程序崩溃,要么会减慢内存访问速度。但是我找不到任何关于它们会减慢多少速度的实际数据。 假设我在x86上并且有一些(但未知的)未对齐访问份额——实际上可能的最糟糕的减速是什么,以及如何在不消除所有未对齐访问并比较两个版本代码的运行时间的情况下估计它?

  • 在回答中,我说过长期以来(在x86/x86_64上)未对齐的访问速度几乎与对齐的访问速度相同。我没有任何数字来支持这个说法,所以我为它创建了一个基准。 你看到这个基准有什么缺陷吗?你能改进它吗(我的意思是,增加GB/秒,以便更好地反映真相)?