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!
-
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.
-
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