mmap和MAP_FIXED错误,用于分配自定义内存地址

时间:2014-07-16 14:55:01

标签: memory-management segmentation-fault mmap

这个软件

#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;   
}
当给mmap提供MAP_FIXED时,

给出了一个分段错误(在Linux上用-fpermissive编译)

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

相反没有MAP_FIXED我获得

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

但我希望memptr指向从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;

我该怎么做?

1 个答案:

答案 0 :(得分:0)

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