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

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top