Autor Thema: grub2 memorymap trouble  (Gelesen 2653 mal)

twixraider81

  • Beiträge: 2
    • Profil anzeigen
Gespeichert
« am: 02. December 2013, 14:28 »
hey leute,

zunächst einmal danke für das fantastische lowlevel wiki. die tutorials sind super gemacht! sehr verständlich aufgebaut und mit den notwendigen hintergrund infos angereichert.

mein projekt ist ein kernel in d2. für mich ist das eine neue herausforderung, da es sowohl das erste projekt in d als auch mein erster kernel ist. als compiler kann ich ldc2 oder gdc2 verwenden, das buildenvironment aufzusetzen hat eigentlich bis jetzt den großteil der arbeit gemacht, durch die große abhängigkeit von d auf seine runtime.

aber weiter im text. der kernel ist ein 64bit higher half kernel. die basis steht soweit: textausgabe im framebuffer und bochs/e9 port. gdt, idt und pic sind programmiert und der nächste schritt ist für mich nun die physische speicherverwaltung. diese benötige ich nun als nächstes für die kernel heap verwaltung, denn ich will nicht weiter mit statischen strukturen arbeiten.

die memory infos möchte ich aus den multiboot2 informationen auslesen und habe probleme mit der struktur der einträge.
ich beziehe bereits andere informationen aus der multiboot2 struktur wie die kommandozeile, bootloadername und framebuffer addresse. das auslesen funktioniert.
für die memory map will dass allerdings keinen sinn ergeben, weder die basisaddressen noch die länge der regionen ergeben einen sinn. kann mich hier jemand auf die nächste stufe schubsen? das infomaterial im netz ist leider fast ausschlieslich auf multiboot1 strukturen ausgelegt.

datenstrukturen und codeschnipsel - http://pastebin.com/msiZYpwn
ausgabe des kernels mit der memory map - http://pastebin.com/6Rnyq6zm

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 02. December 2013, 15:54 »
Hi und willkommen an Board!

Ich hab nun keine Ahnung von D oder D2, aber in C wäre das hier nicht korrekt (sofern das 1:1 übersetzbar ist):
ulong entryAddr = cast(ulong)(memMap + memMap.tagType.sizeof + memMap.tagSize.sizeof + memMap.entrySize.sizeof + memMap.entryVersion.sizeof);Im Prinzip wird da ja 16 auf den Zeiger memMap addiert. In C würde dann entryAddr aber nicht wie gewünscht die Adresse von memMap + 16 Bytes enthalten, sondern auf das 16-te TagMemoryMap hinter memMap zeigen, also 256 Bytes hinter memMap.

Der Grund dafür ist der Zusammenhang zwischen Zeigerarithmetik und Indizierung von Arrays:
int foo[4];
int *x = &foo[0];
int *y = x + 3;
y zeigt jetzt nicht auf das vierte Byte in foo, sondern auf den vierten Eintrag in foo (foo[3]). Der Unterschied ist relevant, weil int größer ist als ein Byte.

Um das zu Lösen könntest du zum Beispiel erst auf ulong casten und dann die Werte addieren.
Dieser Text wird unter jedem Beitrag angezeigt.

twixraider81

  • Beiträge: 2
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 02. December 2013, 20:39 »
Ich hab nun keine Ahnung von D oder D2, aber in C wäre das hier nicht korrekt (sofern das 1:1 übersetzbar ist):
ulong entryAddr = cast(ulong)(memMap + memMap.tagType.sizeof + memMap.tagSize.sizeof + memMap.entrySize.sizeof + memMap.entryVersion.sizeof);Im Prinzip wird da ja 16 auf den Zeiger memMap addiert. In C würde dann entryAddr aber nicht wie gewünscht die Adresse von memMap + 16 Bytes enthalten, sondern auf das 16-te TagMemoryMap hinter memMap zeigen, also 256 Bytes hinter memMap.

hi jidder!

du hast natürlich recht mit dem hinweis auf die pointerarithmetik und dein vorschlag behebt das problem.

* * Available memory: 0x0; length: 651264
 * * Reserved memory: 0x9f000; length: 4096
 * * Reserved memory: 0xe8000; length: 98304
 * * Available memory: 0x100000; length: 535756800
 * * ACPI reclaimable memory: 0x1fff0000; length: 65536
 * * Reserved memory: 0xfffc0000; length: 262144

so solls aussehn. merci :)

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 02. December 2013, 20:51 »
Tut nicht auch einfach folgendes was du willst.
ulong entryAddr = cast(ulong)(&memMap.entries);
Das ist weniger fehleranfällig oder meinst du nicht?
« Letzte Änderung: 02. December 2013, 20:53 von MNemo »
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

 

Einloggen