mmap-Ersatz für malloc
Muss ich einen Weg finden, um mmap anstelle von malloc. Wie ist das möglich? (Ich bin nicht mit der libc nur syscalls) Und ja brk() ist möglich. Ich verwendet, sbrk (), aber erkannte seine nicht, sys-call... (x86 inline-Montage)
Ich habe auf der Suche um und sah dieses: Wie zu verwenden mmap zuweisen von Speicher im heap?, Aber es hat nicht helfen, denn für mich hatte ich einen segfault.
Im Grunde, alles was ich will zu tun, ein schaffen, 3 Platten, Speicher für die Speicherung von Zeichen.
Sagen,
char * x = malloc(1000);
char * y = malloc(2000);
char * z = malloc(3000);
Wie ist das möglich, mit mmap und wie frei es später mit munmap?
- kernel.org/doc/man-pages/online/pages/man2/sbrk.2.html ist ein Systemaufruf, sondern als veraltet ein.
- die glibc
malloc
verwendetmmap
gegebenenfalls (zum Beispiel, wenn die Menge der bytes, die zu reservieren ist jenseits einer bestimmten Schwelle) - entnommen aus der malloc-Mann-Seite: Normalerweise malloc() reserviert Speicher auf dem heap, und passt die Größe des heap als erforderlich, mit sbrk(2). Bei der Zuteilung von Blöcken von Speicher, die größer als MMAP_THRESHOLD bytes, die glibc malloc () - Implementierung den Speicher reserviert, wie eine private anonyme Zuordnung mithilfe von mmap(2). MAP_THRESHOLD ist 128 kB standardmäßig, aber ist einstellbar über mallopt(3). Zuweisungen durchgeführt unter Verwendung von mmap(2) unberührt von der RLIMIT_DATA resource limit (siehe getrlimit(2)).
- Wie sind Sie nicht mit libc? mmap und malloc sind libc-Aufrufe.
malloc
ist in der Tat ein standardlibc
Funktion, abermmap
ist ein system nennen, genannt werden kann, ohne Bibliothek.... wie Flexo-Antwort zeigt....
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie sorgfältig Lesen Sie die mmap(2) Mann Seite? Ich empfehle, es zu Lesen mehrmals.
Beachten Sie, dass können Sie nur bitten, den kernel [thru
mmap
etc...], um Speicher zu verwalten ausgerichtet, und mehrere auf der Seite Größesysconf(_SC_PAGE_SIZE)
die oft 4096 bytes (und ich bin der Meinung, in meiner Antwort).Dann könnten Sie tun:
später den Speicher frei, verwenden Sie
etc
Wenn Sie möchten, reservieren 5Kbytes, benötigen Sie zwei Seiten (da 5Kbytes < 2*4096 und 5Kbytes > 1*4096), d.h.
mmap(NULL, 2*page_size,
...Eigentlich alle Ihre
x
,y
,z
dauert nur 8000 bytes und die passen könnte in zwei, nicht drei, Seiten... Aber dann könnte man nurmunmap
dass der Speicher zusammen.Sich bewusst sein, dass
mmap
ist ein system nennen, das könnte Recht teuer werden.malloc
Implementierungen kümmern, um zu vermeiden, fordern Sie zu oft, das ist, warum Sie verwalten die zuvorfree
-d Zonen, um Sie später wiederverwenden (im weiterenmalloc
-s) ohne syscall. In der Praxis werden die meistenmalloc
- Implementierungen verwalten, die unterschiedlich groß Zuweisungen (z.B. mehr als ein megabyte), die oftmmap
-ed aufmalloc
undmunmap
-ed auffree
Zeit.... Sie studieren könnten, den source-code einigermalloc
. Der von MUSL Libc vielleicht einfacher zu Lesen als die Glibcmalloc
.BTW, die Datei
/proc/1234/maps
zeigt Ihnen die memory map des Prozesses der pid 1234. Versuchen Sie auchcat /proc/self/maps
im terminal, es zeigt die memory map descat
Prozess.Können Sie anrufen
mmap
eine anonyme Zuordnung in x86-asm mit so etwas wie: