Memory management mmap和MAP_错误已修复,用于分配自定义内存地址
这个软件Memory management mmap和MAP_错误已修复,用于分配自定义内存地址,memory-management,segmentation-fault,mmap,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);
#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;
}
相反,如果没有固定的映射,我会得到
0x7fffee5ce2d0
0x7f4f506ab000
-------------------------
0
0x7f4f506ab000
345
0x7f4f506ab000
但是我希望memptr指向一个分配的内存区域,从p指向的位置开始(请参阅mmap调用。出于这个原因,我尝试了MAP_FIXED flag)。
此外,我希望该位置由用户指定为一个数字,就像我取消对指针初始化的注释时发生的那样,获得:
//int* p;
int* p = 0x9;
那我以后就要了
int* memptr = mmap((void*) p, 4096, PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE|MAP_FIXED, -1, 0);
或
memptr指向0x9,其中分别分配了4096或sizeof(int)字节,并可通过
*memptr = 345;
如何做到这一点?0x9不太可能在可写甚至可分配的地址范围内。例如,在Linux中显示了一个进程的地址空间,其中最低的段-文本-从0x08048000开始,下面没有任何内容。更详细地描述可以使用
mmap
访问的地址。另见:
int* memptr = mmap((void*) p, sizeof(int), PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE|MAP_FIXED, -1, 0);
*memptr = 345;