Как вы выделяете определенную область памяти с помощью команды «mmap» в C? (Android NDK)

Каков правильный способ выделения определенного региона памяти с помощью «mmap» в C? Я прочитал / proc / self / maps, чтобы определить, что область доступна.

Я пробовал следующее, но он падает при попытке записать в выделенную память:

// rdram is defined in header as: #define rdram ((unsigned int *)0x80000000) printf( "rdram=0x%x", (int)rdram ); printf( "munmapping" ); munmap ((void*)0x80000000, 0x800000); printf( "mmapping" ); if(mmap ((void*)0x80000000, 0x800000, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0) <= 0) { printf( "mmap(0x80000000) failed" ); } else { for (i=0; i<(0x800000/4); i++) { printf( "writing a zero at 0x%x", (0x80000000 + i) ); rdram[i]=0; // <<---------CRASH HERE--------<< } printf( "done writing zeros" ); } 

Было высказано предположение по моему ранее заданному вопросу (который закрылся, поскольку я не был четко заявлен), что я неправильно обнаруживаю, когда mmap не удалось, и что я должен использовать posix_typed_mem_open вместо -1 для параметра fildes. Я думал, что попробую следующее (пожалуйста, дайте мне знать, если что-то не так с этим):

  int m; int p; printf( "rdram=0x%x", (int)rdram ); printf( "munmapping" ); munmap ((void*)0x80000000, 0x800000); printf( "posix_typed_mem_open" ); p = posix_typed_mem_open( "/memory/ram", O_RDWR, POSIX_TYPED_MEM_ALLOCATE_CONTIG ); printf( "mmapping" ); m = (int) mmap ((void*)0x80000000, 0x800000, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS, p, 0); if( m == (int) MAP_FAILED ) { printf( "mmap failed" ) } else { for (i=0; i<(0x800000/4); i++) { printf( "writing a zero at 0x%x", (0x80000000 + i) ); rdram[i]=0; } printf( "done writing zeros" ); } 

Это выполняется на одном из устройств моего тестировщика (сопоставление памяти на моем устройстве не подходит), поэтому я хотел бы знать, что это имеет смысл, прежде чем я попрошу его запустить его, чтобы посмотреть, какой выход он получает.

Вы пытаетесь сопоставить виртуальную или физическую память? Если виртуальный, то вы на правильном пути, но можете столкнуться с некоторыми проблемами в Android с вашим первым подходом. Типизированные объекты памяти не требуются, однако kernel ​​принимает первый аргумент mmap только как подсказку . ENOMEM предполагает, что вы нажимаете какой-то лимит, установленный на вашем устройстве.

Если вашей целью было выделение физической памяти, вам нужно сделать это: mmap / dev / mem (требуется root или изменить права на него) с установленным значением смещения, которое вам нужно.

Просто попробуй вот так

 /* 使用映射 /dev/zero 分配内存页 */ memFd = open("/dev/zero", O_RDONLY); if (memFd < 0) { jniThrowException(mJniEnv, RUNTIME_EXCEPTION, "open /dev/zero fail!"); return MR_FAILED; } memBase = (char *) mmap(NULL, memLen, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE, memFd, 0); if (memBase == MAP_FAILED) { jniThrowException(mJniEnv, OUTOFMEMORY_ERROR, ""); close(memFd); return MR_FAILED; }