Aktuelle Bugs: Wer ihn findet, darf ihn behalten!

Low-Level-Programmierung und Experimenteller Kernel; Ansprechpartner: Dirty Oerti
Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
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 2:23 pm

Dirty Oerti hat geschrieben: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.
Ich glaube, ich sehe, was hier passiert...

Die Funktion kann nicht -1 zurückgeben, wenn sie ein unsigned int zurückgibt. Sie gibt also 0xFFFFFFFF zurück.
Als Bitmuster ist das 1111 1111 1111 1111 1111 1111 1111 1111.
Das ist das gleiche Bitmuster, wie bei -1.

Wenn du das nun ausgibst, dann werden diese 32 '1'er irgendwie interpretiert - bei Deiner Ausgabe offenbar als signed int. 32 '1'er-Bits als signed int bedeutet -1, also gibt er -1 aus.

Du arbeitest also bei der Ausgabe nicht mit unsigned int, sonst wäre eine negative Ausgabe nicht möglich. Das Problem ist also, dass Du eben nicht nur unsigned int verwendest ^^.
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 2:43 pm

Xin hat geschrieben:Die Funktion kann nicht -1 zurückgeben, wenn sie ein unsigned int zurückgibt. Sie gibt also 0xFFFFFFFF zurück.
Als Bitmuster ist das 1111 1111 1111 1111 1111 1111 1111 1111.
Das ist das gleiche Bitmuster, wie bei -1.

Wenn du das nun ausgibst, dann werden diese 32 '1'er irgendwie interpretiert - bei Deiner Ausgabe offenbar als signed int. 32 '1'er-Bits als signed int bedeutet -1, also gibt er -1 aus.

Du arbeitest also bei der Ausgabe nicht mit unsigned int, sonst wäre eine negative Ausgabe nicht möglich. Das Problem ist also, dass Du eben nicht nur unsigned int verwendest ^^.
Die Ausgabefunktion nimmt als Parameter einen signed int, das ist richtig.
Was ich aber dennoch nicht verstehe:
Warum bricht die Schleife (!), in der ich den Rückgabewert vegleiche, nich aber, wenn das Bitmuster kommt?

Die Schleife sieht so ähnlich aus:

Code: Alles auswählen

do {
    temporary = find_first_free();
    PEN(temporary);
while (temporary != 0xFFFFFFFF);
Zumindest sah sie so ähnlich aus.
Muss ich den Vergleichswert etwa casten?
Würde das etwas helfen?
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: 8859
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 2:52 pm

Dirty Oerti hat geschrieben:Die Ausgabefunktion nimmt als Parameter einen signed int, das ist richtig.
Dann ist jetzt ja klar, wo die -1 herkommt.
Dirty Oerti hat geschrieben:Was ich aber dennoch nicht verstehe:
Warum bricht die Schleife (!), in der ich den Rückgabewert vegleiche, nich aber, wenn das Bitmuster kommt?

Die Schleife sieht so ähnlich aus:

Code: Alles auswählen

do {
    temporary = find_first_free();
    PEN(temporary);
while (temporary != 0xFFFFFFFF);
Zumindest sah sie so ähnlich aus.
Muss ich den Vergleichswert etwa casten?
Würde das etwas helfen?
temporary ist unsigned int?

Schau mal nach, was Dein Compiler aus 0xFFFFFFFF macht - ist das ein unsigned int oder ein signed int?
Ist 0xFFFFFFFF ein (signed int), dann passt 0xFFFFFFFF nicht in den Datentyp rein, also wäre der Wert von 0xFFFFFFFF in Wirklichkeit 0x8FFFFFFF, der mit dem Wert von (unsigned int) temporary, also 0xFFFFFFFF, nicht übereinstimmen würde.

Das kann ich mir aber so eigentlich nicht vorstellen... :-/
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 2:55 pm

Xin hat geschrieben:
Dirty Oerti hat geschrieben:Was ich aber dennoch nicht verstehe:
Warum bricht die Schleife (!), in der ich den Rückgabewert vegleiche, nich aber, wenn das Bitmuster kommt?

Die Schleife sieht so ähnlich aus:

Code: Alles auswählen

do {
    temporary = find_first_free();
    PEN(temporary);
while (temporary != 0xFFFFFFFF);
Zumindest sah sie so ähnlich aus.
Muss ich den Vergleichswert etwa casten?
Würde das etwas helfen?
temporary ist unsigned int?

Schau mal nach, was Dein Compiler aus 0xFFFFFFFF macht - ist das ein unsigned int oder ein signed int?
Ist 0xFFFFFFFF ein (signed int), dann passt 0xFFFFFFFF nicht in den Datentyp rein, also wäre der Wert von 0xFFFFFFFF in Wirklichkeit 0x8FFFFFFF, der mit dem Wert von (unsigned int) temporary, also 0xFFFFFFFF, nicht übereinstimmen würde.

Das kann ich mir aber so eigentlich nicht vorstellen... :-/
Entschuldigung: temporary ist ein unsigend int.
Die Funktion "PEN" (die Ausgabefunktion) nimmt aber einen signed int als Parameter.
Xin hat geschrieben:
Dirty Oerti hat geschrieben:Die Ausgabefunktion nimmt als Parameter einen signed int, das ist richtig.
Dann ist jetzt ja klar, wo die -1 herkommt.
Naja, ich werde so in der Art vergleichen müssen, oder?

Code: Alles auswählen

(temporary != (unsigned int) 0xFFFFFFFF)
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: 8859
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 2:59 pm

Dirty Oerti hat geschrieben: Naja, ich werde so in der Art vergleichen müssen, oder?

Code: Alles auswählen

(temporary != (unsigned int) 0xFFFFFFFF)
Bitte finde erst raus, welchen Datentyp 0xFFFFFFFF darstellt.

Code: Alles auswählen

unsigned int test = 0xFFFFFFFF;

printf( "%d\n", test & ( 1 << 31 ) );
Wenn da 1 rauskommt, ist alles in Butter, kommt da 0 raus, muss man gucken, wie man es Deinem Compiler verkaufen kann.
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 3:10 pm

Bist du sicher, dass du den Code meintest?
Ausgabe so ist:

Code: Alles auswählen

-2147483648
Mit

Code: Alles auswählen

printf( "%d\n", test );
kommt raus.
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: 8859
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 3:38 pm

Sieht alles top aus.

Ich glaube, jetzt müsste ich langsam dem Code nachvollziehen, denn Du da hast, um was qualifiziertes zu sagen, warum Deine Schleife nicht abbricht und ggfs. etwas experimentieren.
Wenn in den Vergleich eine -1 reinrutscht ist das ein signed vergleich und da würde bei 0xFFFFFFFF eventuell nur 0x7FFFFFF über bleiben (nicht 0x8F... wie eben fälschlicherweise behauptet)
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 3:45 pm

Weißt du was?

Ich versuche den Vergleich jetzt einfach mal mit einem Cast zu unsigned int.
Ergebnisse kommen gleich.

EDIT:

Ok, hätte lieber eine kleinere Speichergröße simulieren sollen (^^ hat etwas gedauert, war ja emuliert..), aber hier das Ergebnis:

Der Code:

Code: Alles auswählen

unsigned tmp;
do {
     tmp = kernel_pMM_Falloc();
     PEN(tmp);
}while(tmp != (unsigned int)0xFFFFFFFF);
Die Ausgabe:
(...)
30699
30700
30701
30702
30703
30704
30705
30706
30707
30708
30709
30710
30711
30712
30713
30714
30715
30716
30717
30718
30719
-1

[AUSNAHME] System gestoppt!
Division By Zero
Die Division By Zero Ausnahme ist gewollt und dient als "Stopper".

EDIT2:
Streiche ich den Cast aus dem Vergleich, dann kommt das gleiche dabei herraus.
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
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 19, 2008 3:21 pm

Mal was neues zum Knobeln...
und diesesmal habe ich nicht den leisesten Schimmer, was da abgeht... :x :?:

Ich habe jetzt eine Funktion eingebaut, mit der es iwann möglich sein soll, ein Directory zu erstellen, in dem die Kernelbereiche schon gemappt sind. Denn die Kernelbereiche müssen in allen Directorys gemappt sein, sonst kann bei einem Interrupt/PageFault/was auch immer kein Kernelcode ausgeführt werden => die CPU bekommt einen Triple Fault.

Diese Funktion alleine scheint auch gut zu funktionieren.

Ich kann sie implementieren, ausführen lassen, es ergibt alles die gewünschten Ergebnisse.
Das geht also:

Code: Alles auswählen

    Activate_Kernelheap();//Kernelheap aktivieren    ###########Da ist dann der Fehler######
    vfs_root = Init_iRamDisk( (unsigned int)ird_Start);

////////////AUSKOMMENTIERT////////////////////////////
    /*//Zum testen: Inhalt von / aufzeigen:
    unsigned int i = 0;
    struct dirent *node = 0;
    while( (node = vfsreaddir(vfs_root,i)) != 0) {
        K_PSUCCESS("file:  ");
        K_PINFO(node->name);
        vfsn_t *dirnode = (vfsn_t *)khalloc(sizeof(vfsn_t));
        dirnode = vfsfinddir(vfs_root,node->name);
        if ((dirnode->type&0x7) == FS_DIRECTORY) {
            K_PSUCCESS(" -> dir\n");
        } else {
            K_PSUCCESS(" -> content:\n");
            char *buffer = (char*)khalloc(dirnode->length+1);
            vfsread(dirnode, 0, dirnode->length, (unsigned char*)buffer);
            K_PINFO((char*)buffer);
            K_PINFO("\n---------------\n\n");
        }
        i++;
    }*/
////////////AUSKOMMENTIERT////////////////////////////

    unsigned int *NDir = (unsigned int*)K_alloc();
    NewDir(NDir); //######################'Die neue FUNKTION (NewDir)!!!! ////////////////////////////
    unsigned int * probe = (unsigned int*)0xDDDDDDD;//Nur ein Test, ob die Sache mit PageFaults geht..
    PEN(32);
    *probe = 5;
    PEN(*probe);
    for(;;);
}
Wenn ich aber den Code, der zwischen den

Code: Alles auswählen

////////////AUSKOMMENTIERT////////////////////////////
steht ausführen lasse, dann kommt es zu einem Abbruch.

Und nun das kuriose:
Der Abbruch ist VOR diesem Codeabschnitt, in der Funktion Acticate_KernelHeap().
Vor dieser Funktion wird die neue Funktion aber gar nicht ausgeführt, heißt, die verändert vorher nichts.

Selbst wenn ich die neue Funktion NICHT EINMAL aufrufe (also auch später nicht; die Funktion wird NIE aufgerufen), kommt der Fehler (Triple Fault) an der gleichen Stelle.

Bin dazu echt ratlos.
Das funktioniert nur, wenn ich die neue Funktion komplett auskommentiere (also nicht nur den Aufruf der Funktion).

*Total verwirrt*
*Um Hilfe ersuch*
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
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

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

Beitrag von fat-lobyte » So Okt 19, 2008 7:36 pm

Vielleicht ist einer der Funktionen die zwischen einer Zeile über dem Fehler und dem Anfang des auskommentierten Codes ein Makro, dass entweder Fehler enthält oder das Makro wurde falsch verwendet.
Außerdem könnte es sein, dass eine dieser Funktionen oder eine Variable nicht deklariert ist, oder vielleicht fehlt irgendwo eine Klammer oder ein Semikolon.

Das wird dir nicht viel Weiterhelfen, aber das sind die möglichkeiten, wie so etwas passieren kann.
Haters gonna hate, potatoes gonna potate.

Antworten