Ist das normal?Ja, da "fehlt" auch nichts.
Zitat
Oder sollte ich statt jna(jump if not above) jb(jump if below) verwenden?Das wird in dem Fall auch nicht ändern, denn sowohl 2MB <= 3MB (not above) als auch 2MB < 3MB (below).
09. November 2026, 18:28
Ist das normal?Ja, da "fehlt" auch nichts.
Oder sollte ich statt jna(jump if not above) jb(jump if below) verwenden?Das wird in dem Fall auch nicht ändern, denn sowohl 2MB <= 3MB (not above) als auch 2MB < 3MB (below).
jna => jb
Das verstehe ich nicht, muss ich aber auch nicht...Ist das normal?Ja, da "fehlt" auch nichts.
Es steht nirgends geschrieben, was genau das high_mem sein soll (ist halt mehr oder weniger ein Maß für die Speichergröße über 1MB, aber wie genau das zustandekommt ist eben nicht definiert), es steht aber geschrieben, dass man es eben nicht für die Speicherverwaltung hernehmen soll. Solange also die memory map in Ordnung ist, "fehlt" auch nirgends etwas.Das verstehe ich nicht, muss ich aber auch nicht...Ist das normal?Ja, da "fehlt" auch nichts.
The maximum possible value for lower memory is 640 kilobytes. The value returned for upper memory is maximally the address of the first upper memory hole minus 1 megabyte.
Da steht ja, dass 1 MB abgezogen wird. Aber warum ist der Wert dann bei Bochs 3MB, wenn es bei VMWare 2MB ist und laut spezifikation ja der Speicher ab 1 MB - 1 MB sein soll?





;
)

Eine Liste, in der die Reservierten pages stehen,Also die Idee mit den 4 voneinander abhängigen Listen ist sicherlich nicht schlecht, allerdings leider immer sehr unüberschaubar, da ich Listen ja schon vorher immer wieder Programmiert habe
eine Liste in der die Freien Pages stehen,
eine Liste, in der der Byteweise reservierte Speicher steht,
und eine Liste, in der der freie Byteweise reservierbare Speicher steht.
=> 4 voneinander abhängige Listen, und ne menge fast unüberschaubarer code
Ist bestimmt nicht die Optimallösung, aber es Funktioniert;
und es ist eine Eigenkreation, Ich habe also keine großartigen Theorien zu dem Thema gelesen, sondern einfach selber drauflos entwickelt

zum Thema 4MB-Pages:Ich hatte vorher auch 4 MB-Pages. Da der Kernel allerdings theoretisch kompatibel zu einem 386er sein soll, habe ich das ganze umgeändert und verwende 4KB-Pages.
Ganz zu beginn (also vor dem aktivieren des pagings) bekommt mein kernel 3 4MB-Pages (die 1. 12 Byte im Speicher, physikalische adresse == virtuelle adresse).
Ansonsten arbeite ich nur mit 4KB-Pages.
.Ist jetzt von dir abgeschaut bluecode. Wenn man das so machen sollte, warum?Sollen/Müssen tut man garnichts. Es gibt natürlich noch andere (mögliche und vllt sogar andere sinnvolle
) Möglichkeiten. Meine Kriterien waren folgende:Also die Idee mit den 4 voneinander abhängigen Listen ist sicherlich nicht schlecht, allerdings leider immer sehr unüberschaubar, da ich Listen ja schon vorher immer wieder Programmiert habeWenn du deine Funktionen zur Listenmanipulation sehr allgemein fasst (wie zB die Listenimplementation von LOST für CDI [= Common Driver Interface] bzw. meine C++ Template Implementation für pedigree), dann brauchst du nicht mehrmals das gleiche wieder programmieren.
[...]ZitatAlso die Idee mit den 4 voneinander abhängigen Listen ist sicherlich nicht schlecht, allerdings leider immer sehr unüberschaubar, da ich Listen ja schon vorher immer wieder Programmiert habeWenn du deine Funktionen zur Listenmanipulation sehr allgemein fasst (wie zB die Listenimplementation von LOST für CDI [= Common Driver Interface] bzw. meine C++ Template Implementation für pedigree), dann brauchst du nicht mehrmals das gleiche wieder programmieren.
Und generell gesehen ist die Liste mit dem dynamischen Array aka Vector eine der einfachsten Datenstrukturen überhaupt. Ich denke, dass man das schon hinkriegen sollte[...]



Klar kriegt man das hin, und auch unter 1000 Zeilen code200 Zeilen mit Kommentaren und in C++ Awesomeness verpackt, siehe hier (nur der Wrapper um die eigentliche Liste). Die eigentliche Liste hat mehr Code (siehe auch hier) aber bietet halt auch einges was ein C++ STL gewöhnter Mensch so erwarten würde. Die Liste enthält auch einiges an Template-Tricksereien, um Codebloat zu vermeiden (und ist deswegen teilweise mehr Code als wirklich notwendig) und verwendet eine nette Iterator Klasse, die ziemlich viel Code spart (da sie auch von anderen Datenstrukturen verwendet werden kann).

Die "Schwierigkeit" liegt darin, dass man andauernd prüfen muss, obVersteh ich nicht wirklich, ich erlaube da nur Allokationen eines Vielfachen einer Page.
a) Eine Liste über eine Page-grenze geht, (also um pages für eine der listen zu reservieren/frei zugeben)
b) Sich 2 elemente einer Liste zusammenfassen lassen.Genau ein mal, beim Freigeben eines Speicherbereiches, siehe auch meine Implementation.
Es muss also einiges an rechnleistung investiert werden, nur um die Listen zu pflegen.Wie gesagt, beim Allozieren brauchst du lineare Zeit (bezogen auf die Anzahl der Einträge in der Liste), d.h. du gehst ein mal die Einträge durch und suchst dir einen passenden raus. Da es sehr wenige Einträge sind in der Liste wird es auch nicht viel Rechenaufwand sein.
ps.: Man sollte evtl erwähnen, das ich Elektrotechnik studiere und nicht InformatikIch denke nicht, dass das viel ausmacht.
Ich habe also nie sowas wie softwaredesign gelernt.
). Bis jetzt habe ich ihn nur als binären Suchbaum implementiert, was eine worst-cast Laufzeit von O(n) hat.
.Wie ich das dann mache, wenn aufeinanderfolgender Speicher überhalb des DMA-Bereichs reserviert werden soll, werde ich zu gegebener Zeit nachschauen, was so wie ich das gelesen habe recht schwer ist mit einem StackIch würde es als nicht praktikabel bezeichnen. Wie gesagt, wenn jemand zusammenhängenden RAM braucht, dann kriegt er den bei mir (pedigree) aus dem <16MB Allokator. Das kommt m.E. nicht häufig vor und es werden auch nicht große Stücke sein, insofern halte ich es für vertratbar..
Wie ich das dann mache, wenn aufeinanderfolgender Speicher überhalb des DMA-Bereichs reserviert werden soll, werde ich zu gegebener Zeit nachschauen, was so wie ich das gelesen habe recht schwer ist mit einem Stack
Wo steht da irgendwas von Programm?Wie ich das dann mache, wenn aufeinanderfolgender Speicher überhalb des DMA-Bereichs reserviert werden soll, werde ich zu gegebener Zeit nachschauen, was so wie ich das gelesen habe recht schwer ist mit einem Stack
Wenn ein Programm "normalen" zusammenhängenden Speicher haben will, ist es doch egal ob dieser physisch zusammenhängt. Er muss nur virtuell zusammenhängen.
Es geht hier eher um speziellere Allokationen innerhalb des Kernels./* Eine globale Variable, vielleicht auch später lokal :D */
unsigned int mem_end_page = 0;
...
if(CHECK_FLAG(mbt->flags, 6))
{
memory_map_t *mmap;
for(mmap = (memory_map_t *)mbt->mmap_address;
(unsigned long)mmap < mbt->mmap_address + mbt->mmap_length;
mmap = (memory_map_t *)((unsigned long)mmap + mmap->size + sizeof(mmap->size)))
{
mem_end_page += (unsigned int)(mmap->length_low + mmap->length_high);
}
}
Was haltet ihr davon, bzw. wie erfasst ihr die Größe des Arbeitsspeichers?
Was haltet ihr davon, bzw. wie erfasst ihr die Größe des Arbeitsspeichers?Die Größe interessiert mich meistens gar nicht so sehr.
