将内存地址映射到变量

鼠标

如何将内存地址映射到变量以在该内存位置创建结构?我尝试了以下代码在给定的内存地址处创建一个结构,但它只是转储了分段错误?

代码中的内存位置是一个输入区域,我需要在其中设置某些数据并使用操作码按门铃,以便 CPU 获取输入数据并按照操作码所说的处理输入区域中的数据

    some_struct* some_struct_obj= (some_struct*)0xc321000000;
    memset(some_struct_obj, 0x00, sizeof(some_struct));
埃罗里卡

将内存地址映射到变量

在 C++ 中没有办法选择任何变量的确切位置。您只能选择存储类:自动、静态或线程本地。语言实现选择地址。

如何将内存地址映射到...以在该内存位置创建结构?

可以在任何内存地址中创建具有动态存储(不是变量)的对象,只要该内存已分配,并且不包含非平凡对象。可以使用placement new 表达式或一些在内部执行placement new 的标准函数来实现。

标准 C++ 无法从任意地址分配内存。语言实现负责为变量和动态对象分配内存。

在没有虚拟内存的嵌入式系统上,语言实现可能会记录分配的特定内存地址范围。在这种情况下,您可以简单地使用placement new 在该内存中创建对象。使用此类地址将无法移植到其他系统。


非标准方式怎么样?是的,它可能存在。例如,POSIX 标准指定mmap函数:

pa=mmap(addr, len, prot, flags, fildes, off);

该参数flags提供有关处理映射数据的其他信息。flags 的值是这些选项的按位或,在 <sys/mman.h> 中定义:

Symbolic Constant  Description
MAP_SHARED         Changes are shared.
MAP_PRIVATE        Changes are private.
MAP_FIXED          Interpret addr exactly.

MAP_FIXED在 flags 参数中设置时,实现会被告知 pa 的值应该是addr

但是,请考虑以下 Linux 联机帮助页:

唯一安全的用途是之前使用另一个映射保留了MAP_FIXEDaddr和长度指定的地址范围否则,使用MAP_FIXED是危险的,因为它强制删除预先存在的映射,使多线程进程很容易破坏自己的地址空间。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章