2014-12-24 7 views
5

Я запускал программу с привилегией root, но он продолжает жаловаться, что mmap не может выделить память. Ниже приведен фрагмент кода:Почему mmap не может выделить память?

#define PROTECTION (PROT_READ | PROT_WRITE) 
#define LENGTH (4*1024) 

#ifndef MAP_HUGETLB 
#define MAP_HUGETLB 0x40000 
#endif 

#define ADDR (void *) (0x0UL) 
#define FLAGS (MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB) 

int main (int argc, char *argv[]){ 
... 
    // allocate a buffer with the same size as the LLC using huge pages 
    buf = mmap(ADDR, LENGTH, PROTECTION, FLAGS, 0, 0); 
    if (buf == MAP_FAILED) { 
    perror("mmap"); 
    exit(1); 
    } 
...} 

Оборудование: У меня 8G RAM. Процессор Ivybridge выход

Uname:

Linux mymachine 3.13.0-43-generiC#72-Ubuntu SMP Mon Dec 8 19:35:06 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux 

EDIT 1: Выход PError

mmap: Cannot allocate memory 

Также добавил одну линию для печати ERRNO

printf("something is wrong: %d\n", errno); 

Но выход есть:

something is wrong: 12 

EDIT 2: Огромный связанные TLB информация из/Proc/MemInfo

HugePages_Total:  0 
HugePages_Free:  0 
HugePages_Rsvd:  0 
HugePages_Surp:  0 
Hugepagesize:  2048 kB 
+1

Вы проверили 'errno'? [или], что является результатом 'perror()'? –

+0

Нет проблем с моей OSX. –

+0

Вы уверены в ценности своей константы 'MAP_HUGETLB'? –

ответ

0

При использовании MAP_HUGETLB, то mmap(2) вызова может произойти (например, если ваша система не имеет огромных настроенных страниц или если какой-то ресурс исчерпан), вы почти всегда должны звонить mmap без MAP_HUGETLB в качестве отказа. Кроме того, вы не должны определять MAP_HUGETLB. Если он не определен (внутренними системными заголовками являются <sys/mman.h>, он может отличаться в зависимости от архитектуры или версий ядра), не используйте его!

// allocate a buffer with the same size as the LLC using huge pages 
buf = mmap(NULL, LENGTH, PROTECTION, 
#ifdef MAP_HUGETLB 
      MAP_HUGETLB | 
#endif 
      MAP_PRIVATE | MAP_ANONYMOUS, 
      0, 0); 
#ifdef MAP_HUGETLB 
    if (buf == MAP_FAILED) { 
    // try again without huge pages: 
    buf = mmap(NULL, LENGTH, PROTECTION, 
       MAP_PRIVATE | MAP_ANONYMOUS, 0, 0); 
    }; 
#endif 
if (buf == MAP_FAILED) { 
    perror("mmap"); 
    exit(EXIT_FAILURE); 
} 

Documentation/vm/hugetlspage.txt Упоминание Ядро, что огромные страницы -или может быть- ограничено (например, если вы передаете hugepages=N к ядру, или, если вы делаете вещи через /proc/ или /sys/, или, если это не было настроено в ядре , и т.д...). Таким образом, вы не уверены, чтобы их получить. И использование огромных страниц для небольшого отображения всего 4 Кбайта - ошибка (или, возможно, отказ). Огромные страницы заслуживают внимания только при запросе много мегабайт (например, гигабайт или больше) и всегда являются оптимизацией (например, вы хотели бы, чтобы ваше приложение могло работать на ядре без них).

+0

Я хочу попросить mmap использовать огромный tlb. Как мне заставить эту ошибку уйти? – drdot

+0

Почему 'mmap' с' MAP_HUGETLB' может выйти из строя? пожалуйста, дайте ссылку на это, как [mmap] (http://man7.org/linux/man-pages/man2/mmap.2.html), так и [hugetlbpage] (https://www.kernel.org/doc /Documentation/vm/hugetlbpage.txt) не говорил о 'mmap' с' MAP_HUGETLB' может сбой – D3Hunter

+0

@jujj, и Basile Starynkevitch, я изменил размер отображения на 4 * 1024 * 1024 и применил команду эха, предоставленную jujj. Он работает сейчас. Но поскольку вы оба предоставили часть решения, я не знаю, кто ответит. Но я думаю, что Basile сначала опубликовал документ и объяснение ядра. Примечание: только с командой echo я по-прежнему получаю seg-ошибки позже в моей программе. – drdot

Смежные вопросы