在 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" );
}
这是在我的一个测试人员的设备上运行的(我设备上的内存映射不合适),所以我想在让他运行它以查看什么样的输出之前知道这是有意义的他得到了。
最佳答案
您是要映射虚拟 还是物理 内存?如果是虚拟的,那么您就走在了正确的轨道上,但您的第一种方法可能会在 Android 中遇到一些问题。不需要类型化的内存对象,但是,内核将 mmap 的第一个参数作为仅提示。不过,ENOMEM 表明您正在达到设备上设置的某种形式的限制。
如果您的目标是分配物理内存,您需要做的是映射/dev/mem(需要 root,或更改其权限)并将偏移量设置为您想要的地址。
关于android - 如何使用 C 中的 'mmap' 命令分配特定的内存区域? (安卓NDK),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8351162/