gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:27:39 25 4
gpt4 key购买 nike

我想在 x86/x86_64 上模拟禁止未对齐内存访问的系统。是否有一些调试工具或特殊模式可以执行此操作?

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

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

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

或者 EFLAGS 中可能有 secret CPU 标志?

最佳答案

我刚刚阅读了问题 Does unaligned memory access always cause bus errors?链接到维基百科文章Segmentation Fault .

在这篇文章中,有一个非常不常见的精彩提醒 Intel processor flags AC 又名对齐检查。

下面是启用它的方法(来自维基百科的 Bus Error example,其中 red-zone clobber bug 已针对 x86-64 System V 进行了修复,因此这在 Linux 和 MacOS 上是安全的,而 converted from Basic asm 在函数内部绝不是一个好主意:您希望根据内存访问对 AC 进行更改。

#if defined(__GNUC__)
# if defined(__i386__)
/* Enable Alignment Checking on x86 */
__asm__("pushf\n orl $0x40000,(%%esp)\n popf" ::: "memory");
# elif defined(__x86_64__)
/* Enable Alignment Checking on x86_64 */
__asm__("add $-128, %%rsp \n" // skip past the red-zone, in case there is one and the compiler has local vars there.
"pushf\n"
"orl $0x40000,(%%rsp)\n"
"popf \n"
"sub $-128, %%rsp" // and restore the stack pointer.
::: "memory"); // ordered wrt. other mem access
# endif
#endif

启用后,它的工作方式很像 /proc/cpu/alignment 中的 ARM 对齐设置,请参阅答案 How to trap unaligned memory access?例如。

此外,如果您使用的是 GCC,我建议您启用 -Wcast-align 警告。当为具有严格对齐要求的目标(例如 ARM)构建时,GCC 将报告可能导致未对齐内存访问的位置。

但注意libc手写的asm for memcpy等函数还是会进行未对齐访问,所以设置AC在x86(包括x86-64)上往往不实用。 GCC 有时会发出 asm 进行未对齐访问,即使您的源代码没有,例如作为一次复制或清零两个相邻数组元素或结构成员的优化。

关于linux - 禁止在 x86/x86_64 上进行未对齐的内存访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11837550/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com