如何在C中使用’mmap’命令分配特定的内存区域? (Android NDK)

在C中使用’mmap’分配特定内存区域的正确方法是什么? 我已阅读/ 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" ); } 

这是在我的一个测试人员的设备之一(我的设备上的内存映射不适合)上运行,所以我想知道这是有道理的,然后我让他运行它以查看他得到了什么样的输出。

您是否尝试映射虚拟物理内存? 如果是虚拟的,那么你就处于正确的轨道,但可能会在你的第一种方法中遇到一些问题。 类型化的内存对象不是必需的,但是,内核将mmap的第一个参数作为提示 。 ENOMEM建议您在设备上使用某种forms的限制设置。

如果您的目标是分配物理内存,那么您需要做的是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; }