[英]How do you allocate a specific area of memory using the 'mmap' command in C? (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" );
}
這是在我的測試儀之一的設備上運行的(我的設備上的內存映射不合適),所以我想知道這一點是否有意義,然后再讓他運行它以查看他得到什么樣的輸出。
您是否要映射虛擬或物理內存? 如果是虛擬的,那么您將走上正確的道路,但您的第一種方法可能會遇到Android中的某些問題。 輸入的內存對象不是必需的,但是,內核將mmap的第一個參數僅用作提示 。 ENOMEM建議您達到設備上某種形式的限制。
如果您的目標是分配物理內存,則要做的是使用偏移量設置為您想要的地址來映射/ 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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.