Frage
Ich arbeite seit zwei Wochen an JamVM, einer kleinen, aber leistungsstarken Java Virtual Machine.
Jetzt versuche ich herauszufinden, wie der Speicher implementiert ist, und stecke bei zwei dummen C-Problemen fest:
char *mem = (char*)mmap(0, args->max_heap, PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON, -1, 0);
-> Der Parameter -1 steht für einen Dateideskriptor. Was bedeutet das?(Ich habe den MMAP-Mann bereits gelesen, aber nicht gefunden, vielleicht habe ich ihn falsch verstanden ...)
heapbase = (char*)(((uintptr_t)mem+HEADER_SIZE+OBJECT_GRAIN-1&)~(OBJECT_GRAIN-1)) HEADER_SIZE;
-> Was ist 1 &?Ich finde es nicht in der C-Spezifikation ...
Danke,
Yann
Lösung
Sie verwenden den Dateideskriptor, wenn Sie eine geöffnete Datei haben, die Sie dem Speicher zuordnen möchten. In diesem Fall erstellen Sie eine anonyme Karte (eine, die nicht von einer Datei unterstützt wird), sodass der Dateideskriptor nicht benötigt wird. Einige Implementierungen ignorieren fd
für anonyme Karten, andere erfordern -1.
Die zweite Frage ist ein Syntaxfehler (wahrscheinlich ein Tippfehler). Es sollte wahrscheinlich so etwas sein wie:
heapbase = (char*)(((uintptr_t)mem+HEADER_SIZE+OBJECT_GRAIN-1)
&~(OBJECT_GRAIN-1)) - HEADER_SIZE;
In diesem Fall ist OBJECT_GRAIN
eine Zweierpotenz und es ist eine Möglichkeit, sich an dieser Potenz auszurichten. Wenn es beispielsweise 8 wäre, wäre ~(OBJECT_GRAIN-1)
~7
(~00...001112
, der ~11...110002
ist), der, wenn er mit einem Wert UND-verknüpft wird, verwendet werden könnte, um diesen Wert auf das Vielfache von 8 zu erzwingen, das kleiner oder gleich diesem Wert ist.
Tatsächlich ist es definitiv irgendwo ein Transkriptionsfehler (nicht unbedingt Sie), denn wenn ich die JamVM von
Andere Tipps
Als Antwort auf Ihre erste Frage.Auf der Manpage .
fd sollte ein gültiger Dateideskriptor sein, es sei denn, MAP_ANONYMOUS ist festgelegt.Wenn MAP_ANONYMOUS festgelegt ist, wird fd unter Linux ignoriert.Bei einigen Implementierungen muss fd jedoch -1 sein, wenn MAP_ANONYMOUS (oder MAP_ANON) angegeben ist, und tragbare Anwendungen sollten dies sicherstellen.
Es ist also -1, weil
MAP_ANONYMOUS
verwendet wird.