F
@D_Key Ja, ich gehe davon aus, dass da irgendwo eine malloc-Implementierung drin ist. Beim groben Überfliegen hab ich auch was von "newlib" gesehen. Das ist eine flexible libc-Implementierung, die sich gut an verschiedenste Systeme anpassen lässt. Ich verwende auch für mein Projekt ein Derivat von dieser (picolibc). Das ist dann unter der Haube sehr wahrscheinlich ebenfalls dlmalloc oder eine Modifikation davon, was da den Speicher für new/delete verwaltet.
Ich versuche halt, dein Heap-Fragmentierungs-Problem zu verstehen. Das sollte sich eigentlich dadurch äußern, dass Allokationen ab einer gewissen Größe fehlschlagen, obwohl in der Summe noch genug Speicher frei wäre. Ist das korrekt?
Das mit dem VIF FIFO verstehe ich a nicht so ganz. Ich hab wie gesagt keine Ahnung von der PS2, aber wenn das stimmt was mir die KI hier erzählt, dann sollte der eigentlich nicht im Hauptspeicher liegen, sondern ein relativ kleiner (nur 128 Byte großer) Hardware-Puffer der Vector Instructional Unit (VIF) sein, der ausschließlich über spezielle Register angesprochen wird. Also nicht über MMIO in den Hauptspeicher-Adressraum gemappt. Daher ist mir etwas unklar, wie sich das mit dem normalen RAM und dem Heap in die Quere kommen kann.
Der FIFO sollte eigentlich auch nur sehr kleine und kompakte Grafik-Kommandos beinhalten. Kann es vielleicht sein, dass sich da irgendwas staut und die Kommandos nicht abgearbeitet werden, so dass sich letztendlich dann auch sowas wie geladene Texturen im RAM unterwegs in den VRAM (via DMA?) ansammeln und den voll machen? Das wäre zumindest für mich einleuchtender. Aber wie gesagt, keine wirkliche Ahnung von der Kiste
@D_Key sagte in monotonic_buffer_resource sorgt für DMA Interrupt Error:
align_val_t
Ich kenne da deine konkrete Problematik nicht, aber Klassen und Daten-Member sollten sich eigentlich mit alignas(N) passend ausrichten lassen. Automatische Variablen, die Default-Allokatoren und new/delete sollten das auch entsprechend respektieren. Eine selbst-implementierte std::pmr::monotonic_buffer_resource sollte das in do_allocate() über den Alignment-Parameter natürlich auch berücksichtigen. dlmalloc sollte auch auf malloc/free-Ebene posix_memalign() unterstützen. Da müsste man mal schauen, ob das nach einem #include <malloc.h> zur Verfügung steht. C++17 kennt auch std::aligned_alloc(). Nur so als Anregung, aber offenbar hast du das Problem ja bereits gelöst.