Also Qemu bleibt auch bei pmm_init() stehen, wenn ich weit hintem im Code den Timer setze.
Vermutlich kommt Qemu nicht so schnell mit der Ausgabe hinterher, als wie es den Code verarbeitet. Somit könnte es doch etwas mit der Speicherverwaltung zu tun haben, dass er manschmal ohne am Timer zu fummeln stehen bleibt. Evtl. auch Ursache für CPU-Reset bei echter Hardware!
Mein pmm_init():
void pmm_init(struct multiboot_info* mb_info)
{ /* inititalisiert die Speicherverwaltung. Alle Speicherbereiche,
die beim Start des Systems frei sind, müssen als frei markiert werden, der Rest als belegt.
*/
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;
}
/*
* Die Multibootstruktur auch, genauso wie die Liste von Multibootmodulen.
* Wir gehen bei beiden davon aus, dass sie maximal 4k gross werden
*/
struct multiboot_module* modules = mb_info->mbs_mods_addr;
pmm_mark_used(mb_info);
pmm_mark_used(modules);
/* Und die Multibootmodule selber sind auch belegt */
int i;
for (i = 0; i < mb_info->mbs_mods_count; i++) {
addr = modules[i].mod_start;
while (addr < modules[i].mod_end) {
pmm_mark_used((void*) addr);
addr += 0x1000; //DEC: 4096 (4k)
}
}
}
Der Timer:
int counter = 1193182 / 100;// FREQUENZ
outb(0x43, 0x32);
outb(0x40, counter & 0xFF);
outb(0x40, counter >> 8);
Das zu noch kurz die Anmerkung, dass der eigentliche Fehler, wie im 1.Post beschieben vorher auftratt, bevor ich den Timer gesetzt habe. Ich habe nämlich zuvor die Standartfrequenz unverändern gelassen und einfach nur den IRQ0 bzw. 32 benutz! Das Problem, dass Qemu manschmal bei pmm_init(); (jedefalls laut Textausgabe!) stehen bleibt bestand dort aber auch.
Mit vmm_map_page() mappe ich in der Funktion vmm_init() die direkt nach pmm_init() aufgerufen wird die erst 8MB Speicher virtuell gleich physischer! Vielleicht liegt auch dort der Fehler.
Vielleicht hilft dieser Post etwas dem Problem auf das Bit zu kommen!