Beiträge anzeigen

Diese Sektion erlaubt es dir alle Beiträge dieses Mitglieds zu sehen. Beachte, dass du nur solche Beiträge sehen kannst, zu denen du auch Zugriffsrechte hast.


Nachrichten - dave-g86

Seiten: [1]
1
Lowlevel-Coding / Re: Initialisieren der Bitmap will nicht
« am: 10. February 2010, 23:32 »
Oh danke, wieder was gelernt, der Tag war also nicht umsonst  :-)
2
Lowlevel-Coding / Re: Initialisieren der Bitmap will nicht
« am: 10. February 2010, 23:23 »
Nein, ich habe es bislang nur einmal aufgerufen, aber am Ende der pmm_alloc() steht:     /* Scheint wohl nichts frei zu sein... */
    return NULL;
also heißt das, dass er keinen freien Speicher gefunden hat, wenn ein NULL-Zeiger zurückgegeben wird (oder bedeutet NULL auch die Adresse 0x00?).
3
Lowlevel-Coding / Re: Initialisieren der Bitmap will nicht
« am: 10. February 2010, 11:46 »
Wie gesagt das Problem tritt auch mit dem originalen tutorial.git auf (http://git.tyndur.org/?p=tutorial.git;a=snapshot;h=b150439d3a6158a403f4dfef5d6f55fa6b7434f9;sf=tgz). Und dass kein Speicher da ist kann nicht stimmten denn wenn ich etwas später die init_multitasking() Aufrufe, bekommen alle task auch ihren Speicher nur wenn pmm_alloc() direkt aus der init()-Funktion aufgerufen wird funktioniert es nicht.
4
Lowlevel-Coding / Re: Initialisieren der Bitmap will nicht
« am: 09. February 2010, 23:01 »
Also ich hab nochmal ne ganze Weile gefriemelt. Teilweise scheint es mit dem originalen tutorial.git zu funktionieren. Nur liefert pmm_alloc(), wenn es in der init.c (also dem "Hauptprogramm") aufgerufen wird immer einen NULLZeiger zurück.
5
Lowlevel-Coding / Re: Initialisieren der Bitmap will nicht
« am: 09. February 2010, 19:20 »
Jetzt habe ich nochmal das komplett fertige Tutorial aus dem Netz geladen und versucht Speicher dynamisch anzufordern. Es tritt trotzdem der selbe Fehler auf. Wenn ich jetzt davon ausgehe, dass in dem Tutorial kein Fehler ist, dann könnte vielleicht GRUB das Problem sein?
Ich benutze GRUB-Version 0.97
6
Lowlevel-Coding / Re: Initialisieren der Bitmap will nicht
« am: 09. February 2010, 15:54 »
Meine Start.S ist hier:
.section multiboot
#define MB_MAGIC 0x1badb002
#define MB_FLAGS 0x0
#define MB_CHECKSUM -(MB_MAGIC + MB_FLAGS)

// Der Multiboot-Header
.align 4
.int    MB_MAGIC
.int    MB_FLAGS
.int    MB_CHECKSUM

.section .text

// Init ist eine Funktion aus init.c
.extern init

// _start muss global sein, damit der Linker es findet und als Einsprungspunkt
// benutzen kann (alle Labels, die nicht global sind, sind nur in dieser Datei
// sichtbar)
.global _start
_start:
    // Stack initialisieren
    mov $kernel_stack, %esp

    // C-Code aufrufen und Multiboot-Infostruktur als Parameter uebergeben
    push %ebx
    call init

    // Falls wir jemals aus init zurueckkommen sollten, gehen wir in eine
    // Endlosschleife
    jmp .

// 8 kB Stack fuer den Kernel. Das Label steht hinter dem freien Speicher,
// weil der Stack nach unten waechst
.section .bss
.space 8192
kernel_stack:

Allerdings hab ich das fertige Paket geladen und musste daher auch nix in der Start.S ändern(dachte ich jedenfalls). Die Änderung ist doch nur das PUSH bevors in den C-Kernel geht.

Die Änderungen am Linkerskript wurden auch erledigt.
7
Lowlevel-Coding / Re: Initialisieren der Bitmap will nicht
« am: 09. February 2010, 14:57 »
sowohl am Anfang des Kernels als auch am Anfang der Funktion sind die Werte:
mb_info: 0
mb_info->mbs_mmap_addr: 4026597203
mb_info->mbs_mmap_length : 4026597203
8
Lowlevel-Coding / Re: Initialisieren der Bitmap will nicht
« am: 09. February 2010, 13:52 »
Zitat
Warum konvertierst du denn...
Wie gesagt es ist der original Quelltext aus dem Tutorial  :wink:

Hab mal deine Kritikpunkte umgesetzt, aber das Problem besteht immer noch. Ich habe vor die Schleife noch ein kprintf("%d %d",(unsigned) mmap, (unsigned) mmap_end); geschrieben.

Dabei beträgt mmap 4026597203
       und mmap_end 3758227110.
9
Lowlevel-Coding / Initialisieren der Bitmap will nicht
« am: 09. February 2010, 04:12 »
Hallo,
ich habe den Kernel aus der "OS-Dev für Einsteiger" Serie nachprogrammiert und bin nun dabei ihn etwas zu erweitern. Nur irgendwie funktioniert das Initialisieren der Bitmap für die Speicherverwaltung nicht richtig.

void pmm_init(struct multiboot_info* mb_info)
{
    struct multiboot_mmap* mmap = mb_info->mbs_mmap_addr;
    struct multiboot_mmap* mmap_end = (void*)
    ((uintptr_t) mb_info->mbs_mmap_addr + mb_info->mbs_mmap_length);


    /* Per Default ist erst einmal alles reserviert */
    memset(bitmap, 0, sizeof(bitmap));

    /*
     * Nur, was die BIOS-Memory-Map als frei bezeichnet, wird wieder als frei
     * markiert
     */
    while (mmap < mmap_end) {
       if (mmap->type == 1) {
            /* Der Speicherbereich ist frei, entsprechend markieren */
            uintptr_t addr = mmap->base;
            uintptr_t end_addr = addr + mmap->length;

            while (addr < end_addr) {
                pmm_free((void*) addr);
                addr += 0x1000;
            }
        }
        mmap++;
    }

    /* Den Kernel wieder als belegt kennzeichnen */
    uintptr_t addr = (uintptr_t) &kernel_start;
    while (addr < (uintptr_t) &kernel_end) {
        pmm_mark_used((void*) addr);
        addr += 0x1000;
    }
}

Es handelt sich hierbei um die originale Funktion aus dem Tutorial. Ich hab nach ein paar Tests herausgefunden, dass mmap_end immer kleiner ist als mmap, somit wird nie in die while-Schleife gegangen und der vorher als belegt gekennzeichnete Speicher wieder freigegeben.

Ich verstehe ehrlich gesagt nicht wirklich woran das liegen kann, aber vielleicht ist es auch einfach zu spät in der Nacht  :wink:
Seiten: [1]

Einloggen