gpt4 book ai didi

c++ - 如何在不违反严格的别名规则的情况下访问内存映射的多字节寄存器?

转载 作者:搜寻专家 更新时间:2023-10-30 23:57:20 24 4
gpt4 key购买 nike

我正在使用 Xilinx Zynq (ARM) 平台开发一个嵌入式 Linux 项目,该项目需要将一些物理 FPGA 地址映射到虚拟地址空间,以便我可以访问一些 32 位寄存器。有没有办法让我调用 mmap(),然后在映射地址上覆盖一个 32 位数组,以便对这些寄存器进行单次操作访问?

我目前正在使用 memcpy() 来遵守严格的别名规则,但这显示为对 FPGA 的 4 次单独访问(每字节 1 次)。编译时指定 -fno-strict-aliasing 是我唯一安全的选择吗?

最佳答案

您误解了严格的别名规则。

该规则不仅仅关于类型。这也与语义有关。通过将 void * 强制转换为某些其他指针类型的别名是完全没问题的,只要有适当类型的对象。 (否则 void * 将没有用。)

E.

uint32_t reg = 1337;
void *ptr = ®
*(uint32_t *)ptr = 42;

没问题,因为 ptr 确实包含 uint32_t 对象的地址;只是它有不同的类型。

所以,下面这段代码:

uint32_t *regs = mmap(0xf00ba12, ...);
regs[0] = 0xffffffff;

可能会或可能不会违反严格的别名规则,具体取决于地址 0xf00ba12 处的寄存器是否属于 uint32_t 类型。因此,在您的情况下,这是有效的。


严格的别名规则涉及试图绕过类型系统并通过不同类型的左值访问对象来作弊的程序员。这当然涉及转换指针,但违反严格别名的不是转换和取消引用指针的行为,而是在引用地址处没有给定类型的对象这一事实。

不要使用-fno-strict-aliasing!

关于c++ - 如何在不违反严格的别名规则的情况下访问内存映射的多字节寄存器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25194348/

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