【问题标题】:How to write data at a specific memory location? C++如何在特定的内存位置写入数据? C++
【发布时间】:2018-02-01 13:36:45
【问题描述】:

以下是我用来在 0x10000000 处写入无符号数据的代码。 程序已编译但运行失败。

void load_program(unsigned base_address){
    char* IM=reinterpret_cast <char*>(base_address);
    unsigned a=0;
    *IM=a;
}
int main(int argc, char** argv) {
    unsigned address=0x10000000;    
    load_program(address);
    return 0;
}

【问题讨论】:

  • 在具有受保护操作系统和虚拟内存的通用 PC 上,您不能只写入进程不拥有的随机地址。这导致undefined behavior。是什么让您认为该地址是写入字节的有效地址?
  • 请指定您的平台(Linux、Windows、嵌入式处理器,...)。您实际上想要达到什么目的?或者为什么你觉得需要写地址 0x10000000?
  • "如何在特定的内存位置写入数据?" - 首先要确保该地址是可访问的。
  • 您的代码可以在嵌入式系统上运行,前提是地址处有可写设备且没有操作系统。这是写入硬件设备寄存器和内存的技术。

标签: c++ c++11 pointers memory unsigned


【解决方案1】:

操作系统实际上不允许您访问未通过操作系统接口分配的内存。内存管理相当复杂(以https://en.wikipedia.org/wiki/Paging 为例)。

您的代码应该在没有操作系统的设备上运行,例如 Arduino。

无论如何,如果你想管理自己的内存,也许你可以先通过调用malloc(这是oldschool C风格)来分配一个块

int * pointer = 0;
int size = 50000;
pointer = (int*) malloc(size); //pointer now points to the beginning

【讨论】:

  • C++获取原始内存的方法是调用operator new(函数):int * pointer = static_cast&lt;int*&gt;(operator new(size));
【解决方案2】:

在 Linux 平台上,操作系统不允许用户(用户空间进程)选择一个随机地址并将数据放入该地址,因为普通用户空间进程无权修改/写入 RAM 的特权区域。

char* IM = 0x10000000; 
*IM = 10; /** It won't allow you to access */

【讨论】:

    【解决方案3】:

    在 Linux 上,您可以使用 mmap。您必须以 root 身份运行。我用它来到达 Xilinx SoC 的 PL 区域。

    #include <sys/mman.h>
    #include <fcntl.h>
    #include <unistd.h>
    ...
    unsingned int addr = 0x10000000;
    unsigned int base = addr & 0xFFFF0000;
    unsigned int offset = addr & 0x0000FFFF;
    memfd = open("/dev/mem",O_RDWR);
    char * baseaddr = static_cast<char *>(mmap(0, 0x10000, PROT_WRITE|PROT_READ, 
      MAP_SHARED, memfd, base));
    char * IM = baseaddr + offset;
    *IM = 0x00;
    munmap(baseaddr,1);
    close(memfd);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-12
      • 1970-01-01
      • 1970-01-01
      • 2015-08-06
      • 2022-12-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多