【发布时间】: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