簡體   English   中英

如何使用C語言中的“ mmap”命令分配特定的內存區域? (Android NDK)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM