2014-12-24 6 views
5

Ich habe das Programm mit root priviledge ausgeführt, aber es beschwert sich, dass mmap Speicher nicht reservieren kann. Code-Schnipsel ist unten:Warum kann mmap Speicher nicht zuordnen?

#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); 
    } 
...} 

Hardware: Ich 8G RAM. Der Prozessor ist ivybridge

Uname Ausgang:

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: Die Ausgabe von perror

mmap: Cannot allocate memory 

Auch hat eine Zeile errno

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

zu drucken, aber der Ausgang ist:

something is wrong: 12 

EDIT 2: Die große TLB bezogenen Informationen aus/proc/meminfo

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

hast du das 'errno' überprüft? [oder] Was ist die Ausgabe von 'perror()'? –

+0

Kein Problem mit meinem OSX. –

+0

Sind Sie auf den Wert Ihrer 'MAP_HUGETLB' Konstanten sicher? –

Antwort

0

Wenn Sie MAP_HUGETLB verwenden, die mmap(2) Aufruf kann fehlschlagen (z Wenn auf Ihrem System keine großen Seiten konfiguriert sind oder wenn eine Ressource erschöpft ist, sollten Sie fast immer mmap ohne MAP_HUGETLB als Failback aufrufen. Außerdem sollten Sie MAP_HUGETLB nicht definieren. Wenn es nicht definiert ist (durch System-Header innerhalb von <sys/mman.h>; es kann je nach Architektur oder Kernel-Versionen anders sein), verwenden Sie es nicht!

// 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); 
} 

Die Documentation/vm/hugetlspage.txt Kernel erwähnen, dass große Seiten sind -oder begrenzt BE- kann (zB wenn Sie hugepages=N an den Kernel übergeben, oder wenn Sie Sachen durch /proc/ oder /sys/ tun, oder, wenn dies nicht im Kernel konfiguriert wurde , etc...). Du bist also nicht sicher, ob du sie bekommen willst. Und große Seiten für ein kleines Mapping von nur 4 KByte zu verwenden, ist ein Fehler (oder vielleicht ein Fehler). Große Seiten sind nur lohnend, wenn Sie viele Megabyte (z. B. ein Gigabyte oder mehr) fragen und immer eine Optimierung sind (z. B. möchten Sie, dass Ihre Anwendung auf einem Kernel ohne sie ausgeführt werden kann).

+0

Ich möchte mmap bitten, riesige tlb zu verwenden. Wie soll ich diesen Fehler verschwinden lassen? – drdot

+0

Warum 'mmap' mit' MAP_HUGETLB' kann fehlschlagen? bitte einige Link darüber geben, beide [Mmap] (http://man7.org/linux/man-pages/man2/mmap.2.html) und [hugetlbpage] (https://www.kernel.org/doc /Documentation/vm/hugetlbpage.txt) nicht über 'mmap' sprach mit' MAP_HUGETLB' – D3Hunter

+0

@jujj fehlschlagen kann, und Basile Starynkevitch, änderte ich die Abbildungsgröße auf 4 * 1024 * 1024 und gilt den Echobefehl von jujj zur Verfügung gestellt. Es funktioniert jetzt. Aber da ihr beide einen Teil der Lösung geliefert habt, weiß ich nicht, wer die Antwort ist. Aber ich denke, Basile hat zuerst das Kernel-Dokument und die Erklärung gepostet. Hinweis: Mit dem Befehl echo erhalte ich später noch Seg-Fehler in meinem Programm. – drdot