【问题标题】:Map a memory address to a variable [duplicate]将内存地址映射到变量[重复]
【发布时间】:2020-12-06 18:14:57
【问题描述】:

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

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

    some_struct* some_struct_obj= (some_struct*)0xc321000000;
    memset(some_struct_obj, 0x00, sizeof(some_struct));

【问题讨论】:

  • 您不能写入随机地址。
  • 我可以将它映射到我的 C++ 代码中的变量吗?
  • 不,你不能。所以我问地址来自哪里。如果它是一个特殊的硬件地址,你可以使用它。但是您不能写入随机地址。你怎么知道这个地址是你申请的一部分?
  • 在嵌入式软件上,您可以声明特定变量,以便它们指向特殊的设备映射地址。您需要阅读硬件的开发手册,或通过库使用它。您应该使用有关您的平台和用于按门铃的控制器的更多信息来扩展您的问题。
  • 如果您在该调用中遇到分段错误,那么您就错了。如果 coredump 发生在其他地方,您需要显示该代码并询问它。

标签: c++


【解决方案1】:

将内存地址映射到变量

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

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

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

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

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


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

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

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

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

当在 flags 参数中设置MAP_FIXED 时,通知实现pa 的值应该是addr,准确地说。

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

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

【讨论】:

    猜你喜欢
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-30
    • 1970-01-01
    • 2018-02-20
    • 2012-02-21
    相关资源
    最近更新 更多