Autor Thema: Wo soll der Kernel hin im Ram  (Gelesen 11742 mal)

timon

  • Beiträge: 13
    • Profil anzeigen
Gespeichert
« am: 07. July 2013, 12:43 »
Hallo Zusammen

Ich schreibe gerade an meinem eigenen OS.
Ich habe schon viele Probleme gelöst, nur bei einem komme ich nicht weiter:

Wo soll ich den Kernel und alle seine Datenstrukturen im Ram platzieren?
Bisher habe ich den Kernel einfach an der Stelle gelassen, wo Grub ihn mir standartmässig hinlädt, bei 0x100000.
Nun suche ich einen besseren Ort für ihn.
Das wichtigste ist, dass

Er nicht an einem Ort ist, wo ein Gerät seine Register eingeblendet hat. Das heisst alle Orte an denen Geräte irgendwas in den Ram einblenden, kommen nicht in Frage(ausser die Adresse lässt sich ändern)

Ich möchte den Kernel, sowie alle seine Datenstrukturen in zusammenhängenden Pages haben, so dass ich sie einfach mappen kann. Am besten sie sind in den selben 4MB(solange mein Kernel und seine Datenstrukturen noch klein genug sind sind, später in den selben 8MB usw) so dass ich ganze Pagedirectories mappen kann.

Der Kernel soll physikalisch und virtuell am selben Ort sein, denn das macht mir die Sache viel einfacher.

Gewisse Programme/Bibliotheken möchten vllt dort sein wo mein Kernel ist. Mein OS sollte irgenwann(In sehr ferner Zukunft) auch Windows und Linux Programme ausführen können. Diese haben vermutlich Lieblingsadressen/Reservierte Adressen.

Könnt ihr mir sagen wo ich den Kernel unter den oben genannten Kriterien eher ansiedeln soll und wo auf keinen Fall?
Wo sind eure Kernel?

Lg Timon

« Letzte Änderung: 07. July 2013, 14:46 von timon »

micha

  • Beiträge: 141
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 07. July 2013, 12:59 »
Normalerweise ist es egal, wo dein Kernel physisch liegt. Deshalb würde ich ihn auch an 0x100000 lassen. Denn was ist, wenn ein Computer nur sehr wenig RAM hat?
In den 4GB virtuellen Speicher ist es dir überlassen, wo du deinen Kernel mapst.
http://www.lowlevel.eu/wiki/Teil_9_-_Paging
http://www.lowlevel.eu/wiki/Paging

Grundsätzlich gibt es da zwei Varianten: higherhalf & lowerhalf
Higherhalf bietet ein paar Vorteile, weil du dann problemlos Virtual 8086 Prozesse laufen lassen kannst, da diese immer in 0-1 MB laufen müssen.
http://www.lowlevel.eu/wiki/Virtual_8086_Mode
http://www.lowlevel.eu/wiki/Teil_9_-_Paging#Aufteilung_des_Adressraums

timon

  • Beiträge: 13
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 07. July 2013, 16:14 »
Wenn ich den Kernel vituell und physisch nicht am selben Ort habe, kann ich dann nach dem Einschalten des Pagings den Code von vorher nicht mehr benuzten weil die Adressen ändern? Sollte ich also zwei Kernelschreiben, einen VorPagingKernel und einen NachpagingKernel oder überschreibe ich die Adressen(so quasi mit einer Relocationtable)?

micha

  • Beiträge: 141
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 07. July 2013, 16:19 »
Bevor du in deine Init-Funktion springst muss du paging aktivieren und die ersten 4MB (am besten gleich in einer page) nach 3GB mappen. In dem Code, der vor der initalisierung deines eigentlichen Pagedirectory liegt, muss du um physische in virtuelle adressen zu wandeln, 0xc0000000 (3GB) addieren und um virtuelle in physische zu wandeln 0xc0000000 (3GB) abziehen.

timon

  • Beiträge: 13
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 07. July 2013, 20:29 »
Eine Frage noch: Du hast gesagt, der Default Ort(0x100000) wäre ein guter Ort um den Kernel zu laden. Ist der Bereich von 0x100000 bis ca 0x1500000(also die ersten 20 Megabytes des erweiterten Speichers) ein Ort, an dem keine Geräte ihre Register in den Ram einblenden?

micha

  • Beiträge: 141
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 07. July 2013, 20:47 »
Dafür hast du ja den virtuellen speicher, um dir das selbst auszusuchen. Welche adresse das genau ist, kannst du dem gerät normalerweise über IO-Ports mitteilen. (Wenn du das gerät nicht sowieso schon nur über ports steuerst)

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 07. July 2013, 22:07 »
Bisher habe ich den Kernel einfach an der Stelle gelassen, wo Grub ihn mir standartmässig hinlädt, bei 0x100000.
Es gibt keinen solchen Default. Du hast diesen Wert mit deinem Linkeraufruf selbst festgelegt, GRUB liest ihn nur aus der ELF-Datei und lädt den Kernel dann dahin, wohin er eben gern geladen werden möchte.

GRUB kann nicht unter 1 MB laden, und du willst wahrscheinlich physisch die niedrigstmögliche Adresse verwenden, damit du auch mit wenig RAM zurechtkommst. 1 MB ist deswegen die logische Wahl.

Ist der Bereich von 0x100000 bis ca 0x1500000(also die ersten 20 Megabytes des erweiterten Speichers) ein Ort, an dem keine Geräte ihre Register in den Ram einblenden?
Es gab mal ein ISA-Hole an 15-16 MB, das du aber heute normal nicht mehr finden wirst.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 10. July 2013, 20:44 »
Hallo,

Ich möchte den Kernel, sowie alle seine Datenstrukturen in zusammenhängenden Pages haben, so dass ich sie einfach mappen kann.
Dann trage in dein Linkerscript einfach ein, dass GRUB deinen Kernel an physisch 4 MB laden soll; muss ja nicht zwingend 1 MB sein.

Der Kernel soll physikalisch und virtuell am selben Ort sein, denn das macht mir die Sache viel einfacher.
Das macht die Initialisierung wirklich viel einfacher, bringt die später aber mehr Probleme als Nutzen. Windows und Linux haben den Kernel-Bereich (einstellbar) bei 2 GB oder 3 GB, wenn du zu denen theoretisch binärkompatibel sein können möchtest, musst du deinen Kernel dort auch hinlegen.

Üblicherweise linkt man alle Anwendungen an die gleiche Adresse (durch die Speicherverwaltung ist da immer verschiedener Speicher). (Dynamische) Bibliotheken werden zur Laufzeit an eine Adresse gelinkt, die noch frei ist. Wenn das nicht geht, dann bekommt das Programm seine eigene Kopie der Bibliothek.

Praktisch kannst du den Kernel überall hinlegen, wenn du mit den daraus entstehenden Nachteilen leben kannst. Wenn du den Kernel nicht zwingend 1:1 mappst, dann kannst du die Adresse auch an einer zentralen Stelle konfigurierbar machen, falls du irgendwann merkst, dass deine Entscheidung doch nicht so gut war. (Im schlimmsten Fall musst du dann aber alle Anwendungen neu linken. Für ein Hobby-OS ist das aber kein wirkliches Problem.)

1 MB ist deswegen die logische Wahl. [...]
Es gab mal ein ISA-Hole an 15-16 MB, das du aber heute normal nicht mehr finden wirst.
Hey, das ist doch mein Satz! :-D

Wenn du kein ISA-Hole unterstützen möchtest, hast du vermutlich 64 MB RAM oder mehr. Da kommt es dann nicht mehr darauf an, ob du nun an 1, 4 oder 16 MB lädst. (Zumal der Speicher ja nicht verloren geht, sondern in der normalen Speicherverwaltung auftaucht.) Ungefähr da würde ich aber die praktische Grenze für ein 1:1 setzen.

Gruß,
Svenska

timon

  • Beiträge: 13
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 14. July 2013, 23:02 »
Hallo Zusammen
Vielen Dank für eure Antworten

Ich werde in den nächsten Tagen weiter an meinem Os programmieren

 

Einloggen