Autor Thema: unbeschreibbare phyische pages  (Gelesen 2979 mal)

micha

  • Beiträge: 141
    • Profil anzeigen
Gespeichert
« am: 02. August 2013, 21:51 »
Moin,
ich hab ein kleines problem, dass mein OS sehr schnell abstürtzt, weil es auf physiche adressen schreibt, die wahrscheinlich garnicht beschreibbar sind. Egal, was ich in solche pages schreibe, es steht immer 0xfffff… drin.
ich hab dazu mal einen test gemacht.
nach der initalisierung des kernels wird dieser code ausgeführt:
  while(1) {
    int *a = vmm_find(current_context, 1, VADDR_KERNEL_HEAP_START, VADDR_KERNEL_HEAP_END);
    vmm_map_page(current_context, a, pmm_alloc(), VMM_KERNEL_FLAGS);
    *a = 10;
    printf("a = 0x%x, %d\n", a, *a);
  }

Das ergebnis:
Er bleibt beim 254 mal pmm_alloc() hängen. Die erste adresse, bei der -1 statt 10 (die ich dort hingeschrieben habe) steht ist 0xA0000.
Ich bin mir eigentlich ziemlich sicher, dass ich den pmm richtig initalisiere. (aber wahrscheinlich doch nicht ;) )
Hier der code: https://github.com/michamimosa/FruityOrange/blob/master/kernel/mm/pmm.c

ich hoffe jemand kann mir helfen!
LG, micha

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 03. August 2013, 09:57 »
Physisch 0xa0000 ist Videospeicher. Der ist nicht in der BIOS/GRUB-Memory-Map drin, du solltest ihn also eigentlich als belegt gekennzeichnet haben.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

micha

  • Beiträge: 141
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 03. August 2013, 10:15 »
Also wenn ich hier: http://www.lowlevel.eu/wiki/VGA richtig gelesen habe, dann sind das 64000 bytes, also ~16 pages, die ich reservieren muss?

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 03. August 2013, 11:52 »
Der Modus 13h, der dort erwähnt ist, benutzt nur 64000 Bytes, aber der Speicher ist trotzdem größer. 0xa0000 bis 0xbffff ist der Video-RAM. Danach kommen noch Video-ROM und BIOS.

Du benutzt die Memory Map, also solltest du nicht manuell irgendwas als belegt markieren, sondern erstmal schauen, wieso du den Speicher überhaupt alloziert bekommst. Der ist in der Memory Map eigentlich gar nicht erst als nutzbar eingetragen.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

micha

  • Beiträge: 141
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 03. August 2013, 12:07 »
Ich denke, das problem hat sich jetzt geklärt. ich hatte in pmm_alloc() einen fehler drin.

 

Einloggen