Fehlerhaftes malloc



  • Hallo,

    Ich hab ein kleinen Taschenrechner programmiert und ein Fehler gefunden.
    Die function malloc liefert nach ca. 16 versuchen einen ungültigen speicherbereich. was zu einem Pagefault führt.

    ====
    getestet in 'qemu' mit 32 MByte
    -------------------------------

    userprogramm

    #include "userlib.h"
    
    // test function
    int main()
    {
    	char* a;
    
        setScrollField(0, 43); // The train should not be destroyed by the output, so we shrink the scrolling area...
        printLine("                                !   Rechner   !                                 ", 2, 0x0B);
        printLine("--------------------------------------------------------------------------------", 4, 0x0B);
    
    	 for(;;)
        {
    		a = malloc( sizeof(char) * (1 + 1));
    		a[1] = '\0';
    		puts("qq");
        } 
        return(0);
    }
    

    weiterhin eine tolle sache, was ihr macht weiterso!

    -------
    wer einen rechtschreibfehler fiendet darf in behalten!


  • Mod

    weiterhin eine tolle sache, was ihr macht weiterso!

    Danke! Wir haben es vor. Danke für den Hinweis.



  • Das ist nur ein kleiner Fehler im Heapmanagement. malloc() liefert Adressen ab USER_HEAP_START:

    // kheap.h revision 412
    (...)
    // User Heap management
    #define USER_HEAP_START   ((uint8_t*)0x1400000)     // 20 MB
    (...)
    // User Stack
    #define USER_STACK 0x1420000
    

    Aber die Adresse 0x1400000 ist schon vergeben. Dort wird die ELF "hin"geladen. Darum die Exception (read-only).

    Hier ein kleiner Fix damit weiterprogrammiert werden kann (solange bis es gerichtet wird):

    // kheap.h revision 412
    (...)
    // User Heap management
    //#define USER_HEAP_START   ((uint8_t*)0x1400000)     // 20 MB
    #define USER_HEAP_START   ((uint8_t*)0x1410000)
    (...)
    // User Stack
    #define USER_STACK 0x1420000
    

    Allerdings ist der Spaß wieder vorbei wenn malloc() > 64KB liefern soll.


  • Mod

    darf der heap auch über dem stack liegen? ^^

    wäre das eine Lösung?

    #ifndef KHEAP_H
    #define KHEAP_H
    
    #include "os.h"
    
    //// Memory configuration ////
    // BE AWARE, THE MEMORY MANAGEMENT CODE STILL HAS SOME HARDCODED
    //       ADDRESSES, SO DO NOT CHANGE THESE ONES HERE!
    
    // Where the kernel's private data is stored (virtual addresses)
    #define KERNEL_DATA_START ((uint8_t*)0x0C0000000)   // 3 GB
    #define KERNEL_DATA_END   ((uint8_t*)0x100000000)   // 4 GB
    
    // PCI/EHCI memory location for MMIO
    #define PCI_MEM_START     ((uint8_t*)0x0FF000000)
    #define PCI_MEM_END       ((uint8_t*)0x100000000)   // 4 GB
    
    // Virtual adress area for the kernel heap
    #define KERNEL_HEAP_START KERNEL_DATA_START
    #define KERNEL_HEAP_END   PCI_MEM_START
    #define KERNEL_HEAP_SIZE  ((uint8_t*)((uintptr_t)KERNEL_HEAP_END - (uintptr_t)KERNEL_HEAP_START))
    
    // Placement allocation
    #define PLACEMENT_BEGIN   ((uint8_t*)0x1000000)     // 16 MB
    #define PLACEMENT_END     ((uint8_t*)0x1400000)     // 20 MB
    
    // User Heap management
    #define USER_HEAP_START   ((uint8_t*)0x1420000)                       // 20 MB plus 128 KB
    #define USER_HEAP_END     ((uint8_t*)(KERNEL_DATA_START - 0x1000000)) // 3 GB minus 16 MB
    
    // User Stack
    #define USER_STACK 0x1420000
    

Anmelden zum Antworten