C : mmap 在 0xffffffff 处初始化
C : mmap initialize at 0xffffffff
我目前正在为一个 C 项目做一个内存分配器,我遇到了一些我不明白的事情
我正在调用 mmap 为我的程序保留堆,我将在其中放置一些 headers。
我有
void * START_ADDRESS;
int MEMORY_INITIALIZED;
void* Mem_Init(int sizeOfRegion){
START_ADDRESS = mmap(NULL, sizeOfRegion, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_FILE |MAP_PRIVATE, -1,0);
header_t* startingHeader = START_ADDRESS;
//rest of the fontion
}
void* Mem_Alloc(int size){
if(MEMORY_INITIALIZED==0){
START_ADDRESS= Mem_Init(size);
//rest of the funtion
}
当我在此代码上使用 errno 时,它 returns 我遇到了无效参数错误。
当我使用 Mem_Init 方法调用它时,为什么 mmap returns 是一个有效地址,为什么当我在 Mem_Init 中调用 Mem_Init 时,为什么它 returns 我无效=25=] 方法 ?
提前致谢
经过一些小改动,您的代码似乎可以正常工作:
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <sys/mman.h>
void * START_ADDRESS;
int MEMORY_INITIALIZED = 0;
void* Mem_Init(int sizeOfRegion){
START_ADDRESS = mmap(NULL, sizeOfRegion, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_FILE |MAP_PRIVATE, -1,0);
if ((void *) -1 == START_ADDRESS) {
printf("Could not map memory: %s\n", strerror(errno));
}
printf("%p\n", START_ADDRESS);
void* startingHeader = START_ADDRESS;
//rest of the fontion
return startingHeader;
}
void* Mem_Alloc(int size){
if(MEMORY_INITIALIZED==0){
START_ADDRESS= Mem_Init(size);
}
//rest of the funtion
return START_ADDRESS;
}
int main(void) {
Mem_Alloc(1024);
return 0;
}
编译使用
gcc -Wall -Werror -o code code.c
我认为最重要的变化是 MEMORY_INITIALIZED 设置为 0,但语言律师向我保证,遵循 C89 标准的编译器已经这样做了。
终于找到错误了
在老师给我们的测试程序中,他试图分配一个0大小的头,而当你试图分配一个空指针时mmap失败。
一个简单的更正是
void* Mem_Init(int sizeOfRegion){
if(sizeOfRegion==0) sizeOfRegion = 1024; //1024 is an exemple
START_ADDRESS = mmap(NULL, sizeOfRegion, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_FILE |MAP_PRIVATE, -1,0);
if ((void *) -1 == START_ADDRESS) {
printf("Could not map memory: %s\n", strerror(errno));
}
感谢大家的支持
我目前正在为一个 C 项目做一个内存分配器,我遇到了一些我不明白的事情
我正在调用 mmap 为我的程序保留堆,我将在其中放置一些 headers。
我有
void * START_ADDRESS;
int MEMORY_INITIALIZED;
void* Mem_Init(int sizeOfRegion){
START_ADDRESS = mmap(NULL, sizeOfRegion, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_FILE |MAP_PRIVATE, -1,0);
header_t* startingHeader = START_ADDRESS;
//rest of the fontion
}
void* Mem_Alloc(int size){
if(MEMORY_INITIALIZED==0){
START_ADDRESS= Mem_Init(size);
//rest of the funtion
}
当我在此代码上使用 errno 时,它 returns 我遇到了无效参数错误。
当我使用 Mem_Init 方法调用它时,为什么 mmap returns 是一个有效地址,为什么当我在 Mem_Init 中调用 Mem_Init 时,为什么它 returns 我无效=25=] 方法 ?
提前致谢
经过一些小改动,您的代码似乎可以正常工作:
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <sys/mman.h>
void * START_ADDRESS;
int MEMORY_INITIALIZED = 0;
void* Mem_Init(int sizeOfRegion){
START_ADDRESS = mmap(NULL, sizeOfRegion, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_FILE |MAP_PRIVATE, -1,0);
if ((void *) -1 == START_ADDRESS) {
printf("Could not map memory: %s\n", strerror(errno));
}
printf("%p\n", START_ADDRESS);
void* startingHeader = START_ADDRESS;
//rest of the fontion
return startingHeader;
}
void* Mem_Alloc(int size){
if(MEMORY_INITIALIZED==0){
START_ADDRESS= Mem_Init(size);
}
//rest of the funtion
return START_ADDRESS;
}
int main(void) {
Mem_Alloc(1024);
return 0;
}
编译使用
gcc -Wall -Werror -o code code.c
我认为最重要的变化是 MEMORY_INITIALIZED 设置为 0,但语言律师向我保证,遵循 C89 标准的编译器已经这样做了。
终于找到错误了
在老师给我们的测试程序中,他试图分配一个0大小的头,而当你试图分配一个空指针时mmap失败。
一个简单的更正是
void* Mem_Init(int sizeOfRegion){
if(sizeOfRegion==0) sizeOfRegion = 1024; //1024 is an exemple
START_ADDRESS = mmap(NULL, sizeOfRegion, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_FILE |MAP_PRIVATE, -1,0);
if ((void *) -1 == START_ADDRESS) {
printf("Could not map memory: %s\n", strerror(errno));
}
感谢大家的支持