Aktuelle Bugs: Wer ihn findet, darf ihn behalten!

Low-Level-Programmierung und Experimenteller Kernel; Ansprechpartner: Dirty Oerti
Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Aktuelle Bugs: Wer ihn findet, darf ihn behalten!

Beitrag von Dirty Oerti » 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

Code: Alles auswählen

0xFFFFFFFF
zurückgeben.

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;
}
Für Erklärungen stehe ich gerne bereit :)
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

AnGaiNoR
Beiträge: 212
Registriert: Sa Jul 19, 2008 7:07 pm
Wohnort: Dresden

Wer ihn findet, darf ihn behalten!

Beitrag von AnGaiNoR » Sa Okt 04, 2008 5:06 pm

Ist das wirklich ein Bug?

Code: Alles auswählen

Print 0xFFFFFFFF
Dieses simple Programm gibt mir -1 aus.
Deshalb denke ich ist es gar kein Bug, sondern 0xFFFFFFFF steht nicht für 4294967295, sondern eben für -1.

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: Wer ihn findet, darf ihn behalten!

Beitrag von Kerli » Sa Okt 04, 2008 5:47 pm

AnGaiNoR hat geschrieben:Ist das wirklich ein Bug?

Code: Alles auswählen

Print 0xFFFFFFFF
Dieses simple Programm gibt mir -1 aus.
Deshalb denke ich ist es gar kein Bug, sondern 0xFFFFFFFF steht nicht für 4294967295, sondern eben für -1.
Vollkommen richtig. Da beim Computer die Zahlen als Zweierkomplement gespeichert werden ist 0xFFFFFFFF gleich -1. Versuch einmal folgendes Programm zu kompilieren und auszuführen:

Code: Alles auswählen

#include <iostream>

int main()
{
  std::cout << (short) 0xFFFFFFFF << std::endl;
  return 0;
}
Die Ausgabe sollte -1 sein. Die Konvertierung nach short ist wichtig, da die Zahl sonst als long interpretiert wird, und dann natürlich nicht negativ ist sondern eben 4294967295.
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Aktuelle Bugs: Wer ihn findet, darf ihn behalten!

Beitrag von Dirty Oerti » So Okt 05, 2008 10:52 am

Hmmm...
das wäre eine schöne Lösung.

Aber:

Warum gibt das Programm dann so etwas aus:

Code: Alles auswählen

-1
0xFFFFFFFF
0xFFFFFFFF
0xFFFFFFFF
0xFFFFFFFF
0xFFFFFFFF
0xFFFFFFFF
0xFFFFFFFF
(...)
Es wird nur einmal (!) -1 ausgegeben.

Außerdem ist es lustigerweise möglich -1 rauszubekommen, wenn ich ein "--" (minus minus) hinzufüge.
(Am Anfang bin ich noch in der Lage das mitzurechnen, bei den größeren Zahlen bin ich noch nicht mitgekommen.)

Ich weiß, dass da "unsigned" steht. Aber ich weiß nicht, wie ernst das genommen wird...

Wichtig ist eigntl nur, dass ich eine Ausgabe habe, die auf "FEHLER" hindeutet. Da hatte ich mich eben für 0xFFFFFFFF entschieden. Wenn ich das mit -1 IMMER (!) vergleichen kann, dann ist das kein Beinbruch :)

Mich wundert nur, dass es immer nur 1 mal als -1 ausgegeben wird und danach als 0xFFFFFFFF..
Kann sich das jemand erklären?
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8485
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Aktuelle Bugs: Wer ihn findet, darf ihn behalten!

Beitrag von Xin » So Okt 05, 2008 11:45 am

Kannst Du den Part vom Code mal posten, ich finde da oben kein printf oder cout... oder seh ich's einfach nicht!?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Aktuelle Bugs: Wer ihn findet, darf ihn behalten!

Beitrag von Dirty Oerti » So Okt 05, 2008 7:15 pm

Xin hat geschrieben:Kannst Du den Part vom Code mal posten, ich finde da oben kein printf oder cout... oder seh ich's einfach nicht!?
Da oben ist kein printf oder cout (geht beides im Übrigen nicht).
Was ich ausgebe ist der Rückgabewert.

Ich rufe die Funktion in einer Schleife auf (simuliert eine komplette Allokation des phys Speichers), bis mein Rückgabewert (0xFFFFFFFF) kommt, der mir anzeigt, es ist alles voll.

Achja:
Das -1 kann ich nicht mit 0xFFFFFFFF vergleichen, sonst würde die Schleife, in der ich die Funktion testweise aufrufe ja schon abbrechen, wenn das -1 kommt und nicht erst wenn das 0xFFFFFFFF kommt.
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8485
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Aktuelle Bugs: Wer ihn findet, darf ihn behalten!

Beitrag von Xin » So Okt 05, 2008 9:55 pm

Dirty Oerti hat geschrieben:
Xin hat geschrieben:Kannst Du den Part vom Code mal posten, ich finde da oben kein printf oder cout... oder seh ich's einfach nicht!?
Da oben ist kein printf oder cout (geht beides im Übrigen nicht).
Was ich ausgebe ist der Rückgabewert.
Ok.
Dirty Oerti hat geschrieben:Ich rufe die Funktion in einer Schleife auf (simuliert eine komplette Allokation des phys Speichers), bis mein Rückgabewert (0xFFFFFFFF) kommt, der mir anzeigt, es ist alles voll.

Achja:
Das -1 kann ich nicht mit 0xFFFFFFFF vergleichen, sonst würde die Schleife, in der ich die Funktion testweise aufrufe ja schon abbrechen, wenn das -1 kommt und nicht erst wenn das 0xFFFFFFFF kommt.
Sofern Du von einem 32-Bit-Datentyp ausgehst, besteht zwischen 0xFFFFFFFF und -1 kein Unterschied. Also kannst Du es auch nicht unterscheiden.
Daher würde ich mich an Deiner Stelle erstmal festlegen, ob Du nun ausschließlich mit signed oder ausschließlich mit unsigned Variablen arbeiten möchtest.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Aktuelle Bugs: Wer ihn findet, darf ihn behalten!

Beitrag von Dirty Oerti » Mo Okt 06, 2008 1:21 pm

Es werden ausschließlich unsigned Variablen verwendet.
Was wollte ich mit einer negativen Framenummer?
Es ist eine Nummerierung, folglich brauche ich natürliche Zahlen => unsigned int.
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8485
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Aktuelle Bugs: Wer ihn findet, darf ihn behalten!

Beitrag von Xin » Mo Okt 06, 2008 1:37 pm

Dirty Oerti hat geschrieben:Es werden ausschließlich unsigned Variablen verwendet.
Was wollte ich mit einer negativen Framenummer?
Wenn Du ausschließlich unsigned verwendest, kannst Du nicht sinnvoll auf -1 vergleichen.
Dirty Oerti hat geschrieben:Es ist eine Nummerierung, folglich brauche ich natürliche Zahlen => unsigned int.
-1 gehört nicht zu den natürlichen Zahlen.

Mir scheint, Du trickst Dich hier selbst ein wenig aus.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Aktuelle Bugs: Wer ihn findet, darf ihn behalten!

Beitrag von Dirty Oerti » Mo Okt 06, 2008 1:57 pm

Das Problem ist:

Ich verwende nur unsigned int.
Trotzdem kommt als vorletzter Rückgabewert ein -1 raus.
Der letzte Rückgabewert ist dann 0xFFFFFFFF
(Der Rückgabewert wird in einer Schleife mit 0xFFFFFFFF verglichen, ist er gleich, so wird abgebrochen)

Es passiert also definitiv, dass die Funktion -1 zurückgibt, OBWOHL ihr Rückgabetyp unsigned int ist.
Xin hat geschrieben:Mir scheint, Du trickst Dich hier selbst ein wenig aus.
Ich weiß.
Ich weiß nur nicht wo und wie.
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Antworten