【问题标题】:Calling mmap from specific address从特定地址调用 mmap
【发布时间】:2021-01-20 05:02:40
【问题描述】:

如果知道(0x6A6F7444),如何从特定地址读取mmap函数? 我试过了:

mmap(0x6A6F7444, 100, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0)

但它不起作用。编译说:

warning: passing argument 1 of ‘munmap’ makes pointer from integer without a cast [-Wint-conversion] 

【问题讨论】:

  • 请比“不起作用”更好地描述行为。究竟观察到了什么?
  • 编译说:警告:传递 'munmap' 的参数 1 使指针从整数而不进行强制转换 [-Wint-conversion]
  • 请记住,0x6A6F7444 未与内存页面(通常为 4KiB)对齐,100 的页面大小也未对齐,并且该函数调用可能会返回错误。如果发生这种情况,我会尝试使用mmap((void *)0x6A6F7000, 4096, ...)
  • @Restman 请edit 带有该信息的问题。如果您询问错误,您应该提供实际错误,这应该是常识。另外,请注意第一个参数只是一个提示,除非设置了MAP_FIXED,否则操作系统可能不会实际使用该地址。但如果设置了MAP_FIXED,那么addr 也需要进行页面对齐。

标签: c linux memory mmap


【解决方案1】:

要让mmap 使用您的地址,它需要MAP_FIXED 标志,请参阅man mmap 了解完整详情。

【讨论】:

    【解决方案2】:
    #include <stdint.h> // for uintptr_t
    
    uintptr_t addr = 0x6A6F7444;
    
    mmap((void *)addr, 100, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
    

    将禁用警告。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-12
      • 1970-01-01
      • 1970-01-01
      • 2021-03-29
      • 1970-01-01
      • 1970-01-01
      • 2022-12-01
      • 1970-01-01
      相关资源
      最近更新 更多