【问题标题】:Error with mmap and MAP_FIXED for allocating custom memory address用于分配自定义内存地址的 mmap 和 MAP_FIXED 错误
【发布时间】:2014-07-16 14:55:01
【问题描述】:

这个软件

#include <sys/mman.h>
#include<iostream>

main(){
    int* p;
    //int* p = 0x9;
    std::cout << p << std::endl;
    int* memptr = mmap((void*) p, 4096, PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE|MAP_FIXED, -1, 0);
    std::cout << memptr << std::endl;
    std::cout << "-------------------------\n";
    std::cout << *memptr << std::endl;
    std::cout << memptr << std::endl;
    *memptr = 345;
    std::cout << *memptr << std::endl;
    std::cout << memptr << std::endl;   
}

在将 MAP_FIXED 提供给 mmap 时给出分段错误(在 Linux 上使用 -fpermissive 编译)

0x7fff507b0dd0
0xffffffffffffffff
-------------------------
Speicherzugriffsfehler (Speicherabzug geschrieben)

相反,没有 MAP_FIXED 我得到了

0x7fffee5ce2d0
0x7f4f506ab000
-------------------------
0
0x7f4f506ab000
345
0x7f4f506ab000

但我希望 mempr 指向从 p 指向的位置开始的已分配内存区域(请参阅 mmap 调用。为此,我尝试了 MAP_FIXED 标志)。 此外,我希望用户将这个位置指定为一个数字,因为当我取消注释指针初始化时会发生这种情况,获得:

//int* p;
int* p = 0x9;

所以我想要那个之后

 int* memptr = mmap((void*) p, 4096, PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE|MAP_FIXED, -1, 0);

int* memptr = mmap((void*) p, sizeof(int), PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE|MAP_FIXED, -1, 0);

memptr 指向 0x9,其中 4096 或 sizeof(int) 字节分别被分配并可通过

写入
*memptr = 345;

我该怎么做?

【问题讨论】:

    标签: memory-management segmentation-fault mmap


    【解决方案1】:

    0x9 不太可能在可写甚至可分配的地址范围内。例如,http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory/ 显示了 Linux 中进程的地址空间,其中最低段 - 文本 - 从 0x08048000 开始,没有任何其他内容。 http://lwn.net/Articles/91829/ 更详细地描述了可以使用mmap 访问的地址。另见:Reasonable valid start address for mmap address hint so as to be gauranteed that things work

    【讨论】:

      猜你喜欢
      • 2020-11-14
      • 1970-01-01
      • 2018-06-28
      • 1970-01-01
      • 2013-02-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-03
      • 2016-06-03
      相关资源
      最近更新 更多