Как вы выделяете определенную область памяти, используя команду 'mmap' в C? (Android NDK) - PullRequest
1 голос
/ 02 декабря 2011

Как правильно распределить определенную область памяти, используя 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" );
 }

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

Ответы [ 2 ]

1 голос
/ 13 июля 2012

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

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

0 голосов
/ 08 сентября 2013

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

/* 使用映射 /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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...