Aktuelle Bugs: Wer ihn findet, darf ihn behalten!
Verfasst: Mo Sep 29, 2008 8:25 pm
Tag 
Ich werde diesen Thread in Zukunft dazu benutzen, über Bugs zu informieren, die mir bekannt sind.
Wenn jemand dann von Erfolg gekrönnt ist und weiß, woher der Bug kommt bzw wie er beseitigbar ist, wäre ich ihm/ihr sehr dankbar, wenn mir das mitgeteilt werden würde
Damit fang ich gleich mal an:
Aktueller Bug
Der aktuelle Bug befindet sich im physikalischem Memory Manager. Und zwar in der Funktion find_first_free().
Parameter der Funktion: keine
Rückgabewert der Funktion: (unsigned int) Frame-Nummer des ersten freien Frames
Was funktioniert nicht ordnungsgemäß?
Lässt man alle Frames allokieren (bei der Allokation wird diese Funktion aufgerufen), so werden nach und nach alle Frames allokiert.
Nur beim vorletzten Aufruf der Funktion ergibt sich als Ausgabe der Framenummer
Wenn alles voll ist oder bei einem anderen Fehler sollte die Funktion zurückgeben.
Das tut sie auch beim letzten Aufruf.
Nur eben beim vorletzten kommt -1.
Hier der Code:
Für Erklärungen stehe ich gerne bereit 

Ich werde diesen Thread in Zukunft dazu benutzen, über Bugs zu informieren, die mir bekannt sind.
Wenn jemand dann von Erfolg gekrönnt ist und weiß, woher der Bug kommt bzw wie er beseitigbar ist, wäre ich ihm/ihr sehr dankbar, wenn mir das mitgeteilt werden würde

Damit fang ich gleich mal an:
Aktueller Bug
Der aktuelle Bug befindet sich im physikalischem Memory Manager. Und zwar in der Funktion find_first_free().
Parameter der Funktion: keine
Rückgabewert der Funktion: (unsigned int) Frame-Nummer des ersten freien Frames
Was funktioniert nicht ordnungsgemäß?
Lässt man alle Frames allokieren (bei der Allokation wird diese Funktion aufgerufen), so werden nach und nach alle Frames allokiert.
Nur beim vorletzten Aufruf der Funktion ergibt sich als Ausgabe der Framenummer
Code: Alles auswählen
-1
Code: Alles auswählen
0xFFFFFFFF
Das tut sie auch beim letzten Aufruf.
Nur eben beim vorletzten kommt -1.
Hier der Code:
Code: Alles auswählen
unsigned int find_first_free()
{
//Durchsuche Smap nach freien Maps
unsigned int* tmp = (unsigned int*) Smap_Start;
unsigned int counta = 0;
unsigned int countb = 0;
unsigned int countc = 0;
while(*tmp == 0xFFFFFFFF) {//alles besetzt?
counta++;//Einen weiteren 4 Byte Blcok überprüft
if(counta>=Smap_Size) return 0xFFFFFFFF; //Nichts frei
tmp++;//Nächste 4 Byte
}
//NOTE: Schutzmechanismus (Map existiert nicht => ausblenden)
// Nicht implementiert, da Schutz schon vorhanden (siehe pMM_Setup)
// außerdem gibt es ansonsten Geschwindigkeitseinbußen
while(*tmp & MAKRO_SET_BIT(countb)) {//welches Bit ist denn nun frei?
countb++;//Nächstes Bit
if(countb>=32) return 0xFFFFFFFF;//Nichts frei!!?
}
counta<<=5; //Optimiert
counta+=countb;//counta ist nun die Map-Nr.
countb = 0;
tmp = (unsigned int*)(maps_Start+(map_Size*counta));//Pointer auf die Map setzen
while(*tmp == 0xFFFFFFFF) {//alles besetzt?
countb++;
if(countb>=map_Size) return 0xFFFFFFFF;//Nichts frei!!!
tmp++;//Nächste 4 Byte
}
while(*tmp & MAKRO_SET_BIT(countc)) {//welches Bit ist frei?
countc++;
if(countc>=32) return 0xFFFFFFFF;//Nichts frei?!!!
}
countb<<=5;//Optimiert
countb+=countc;//countb ist nun Nr des Frames in der Map
counta*=FRAMES_PER_MAP;
counta+=countb;//counta ist nun die Nr des Frames
return counta;
}
