相关疑难解决方法(0)

如何捕获未对齐的内存访问?

我正在开发一个宠物开源项目,它实现了一些流密码算法,我遇到的问题只有在我在ARM处理器上运行时才会触发.我甚至尝试在qemu下运行x86中的ARM二进制文件,但是那里没有触发bug.

这个bug的具体机制仍然是难以捉摸的,但我最好的办法是相信它是由我的程序中未对齐的内存访问尝试引起的,这是由qemu实现的,但是我的开发板中真正的ARM处理器默默地忽略了它.

因此,由于问题显示非常难以诊断,我想知道是否有任何工具可用于捕获我运行的程序所做的未对齐内存访问,以便我可以确切地看到问题发生的位置.

我还可以使用某种方式在我的ARM开发板上启用一些信号(SIGBUS,可能?),如果进程违反了内存对齐限制,就像我们在访问未映射的内存地址时得到SIGSEGV一样.它运行的是Linux 2.6.32.

c linux arm memory-alignment

16
推荐指数
2
解决办法
1万
查看次数

未对齐的内存访问是否总是导致总线错误?

根据维基百科页面分段错误,未对齐的内存访问可能导致总线错误.本文提供了有关如何触发总线错误的示例.在该示例中,我们必须启用对齐检查以查看总线错误.如果我们禁用这种对齐检查怎么办?

该程序似乎正常工作.我有一个程序经常访问未对齐的内存,并且它被很多人使用,但没有人向我报告总线错误或其他奇怪的结果.如果我们禁用对齐检查,未对齐内存的副作用是什么?

平台:我正在开发x86/x86-64.我也通过在Mac上用"gcc -arch ppc"编译它来尝试我的程序,它运行正常.

c memory-alignment

9
推荐指数
2
解决办法
6915
查看次数

我如何告诉 gcc 我的内联汇编破坏了堆栈的一部分?

考虑这样的内联汇编:

uint64_t flags;
asm ("pushf\n\tpop %0" : "=rm"(flags) : : /* ??? */);
Run Code Online (Sandbox Code Playgroud)

尽管可能存在某种内在函数来获取 RFLAGS 的内容,但我如何向编译器表明我的内联汇编破坏了堆栈顶部的一个四字内存?

c gcc x86-64 inline-assembly red-zone

7
推荐指数
1
解决办法
529
查看次数

将 C 指针转换为不同类型时要记住的规则

我已经使用 C 指针有一段时间了,一切都按预期工作。然而现在我遇到了 ISO 标准,该标准规定“如果生成的指针未针对指向的类型正确对齐,则行为未定义”。

这让我不禁要问自己:

  1. 这是什么意思?

  2. 我们如何安全地将指针转换为其他类型?

我发现这个 C 代码示例据说是不正确的,因为它与更严格对齐的指针类型有关:

int main() {
    
    char c = 'x';
    int *ip = (int *)&c;
    char *cp = (char *)ip;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)
  1. 更严格对齐的指针类型意味着什么?

c pointers casting memory-alignment

5
推荐指数
1
解决办法
199
查看次数

Linux内核如何在copy_from_user中临时禁用x86 SMAP?

我想知道Linux内核在执行该copy_from_user()函数时如何禁用x86 SMAP。我试图在源代码中找到一些东西,但失败了。

超级用户模式访问保护 (SMAP)是 x86 CPU 的一项安全功能,可防止内核访问非预期的用户空间内存,从而有助于抵御各种攻击。

security x86 operating-system kernel linux-kernel

2
推荐指数
1
解决办法
2067
查看次数