我正在开发一个宠物开源项目,它实现了一些流密码算法,我遇到的问题只有在我在ARM处理器上运行时才会触发.我甚至尝试在qemu下运行x86中的ARM二进制文件,但是那里没有触发bug.
这个bug的具体机制仍然是难以捉摸的,但我最好的办法是相信它是由我的程序中未对齐的内存访问尝试引起的,这是由qemu实现的,但是我的开发板中真正的ARM处理器默默地忽略了它.
因此,由于问题显示非常难以诊断,我想知道是否有任何工具可用于捕获我运行的程序所做的未对齐内存访问,以便我可以确切地看到问题发生的位置.
我还可以使用某种方式在我的ARM开发板上启用一些信号(SIGBUS,可能?),如果进程违反了内存对齐限制,就像我们在访问未映射的内存地址时得到SIGSEGV一样.它运行的是Linux 2.6.32.
考虑这样的内联汇编:
uint64_t flags;
asm ("pushf\n\tpop %0" : "=rm"(flags) : : /* ??? */);
Run Code Online (Sandbox Code Playgroud)
尽管可能存在某种内在函数来获取 RFLAGS 的内容,但我如何向编译器表明我的内联汇编破坏了堆栈顶部的一个四字内存?
我已经使用 C 指针有一段时间了,一切都按预期工作。然而现在我遇到了 ISO 标准,该标准规定“如果生成的指针未针对指向的类型正确对齐,则行为未定义”。
这让我不禁要问自己:
这是什么意思?
我们如何安全地将指针转换为其他类型?
我发现这个 C 代码示例据说是不正确的,因为它与更严格对齐的指针类型有关:
int main() {
char c = 'x';
int *ip = (int *)&c;
char *cp = (char *)ip;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我想知道Linux内核在执行该copy_from_user()函数时如何禁用x86 SMAP。我试图在源代码中找到一些东西,但失败了。
超级用户模式访问保护 (SMAP)是 x86 CPU 的一项安全功能,可防止内核访问非预期的用户空间内存,从而有助于抵御各种攻击。