Bootloader

Diskussion zum Thema Programmierung unter DOS (Intel x86)
TomCat
MemMaker-Benutzer
Beiträge: 87
Registriert: Do 1. Dez 2011, 17:16

Re: Bootloader

Beitrag von TomCat »

hab grad nachgesehen, anscheinend müssen die Segmentregister irgendwie geladen werden. Aber so richtig schlau werde ich nicht daraus. Wie soll das genau gehen? Die Segmentregister werden ja im Programm erst geladen z.b. mit ax,data1 und dann ds,ax Aber wie soll man das denn in einer kompilierten .EXE machen können? Ist mir voll schleierhaft. Und .Com hilft mir nix, weil das Ding tatsächlich nur 64kb groß sein darf. :-((
der_computer_sammler

Re: Bootloader

Beitrag von der_computer_sammler »

.
Zuletzt geändert von der_computer_sammler am Mi 2. Nov 2016, 19:08, insgesamt 1-mal geändert.
TomCat
MemMaker-Benutzer
Beiträge: 87
Registriert: Do 1. Dez 2011, 17:16

Re: Bootloader

Beitrag von TomCat »

der_computer_sammler hat geschrieben:Bin zwar Programmierer, aber um DOS und Assembler hab ich bisher immer einen großen Bogen gemacht. Trotzdem mal eine Frage als Denkanstoß: .COM und .EXE sind Formate für ausführbare Programme unter MS-DOS. Das ist doch eh sinnfrei, weil DOS umgangen werden soll, oder nicht? Wenn .COM nicht geht, weil das Programm mehr als 64 KB groß ist, muss man sich um alles selbst kümmern - so wie es DOS sonst bei EXE-Dateien macht.
naja die Exe wurde schon von masm und link erzeugt. Mir gehts halt darum die EXE dann von einer völlig leeren Platte auf der nur ein bootloader existiert und die zu ladende EXE. in den Speicher zu laden und dann zu starten.
DOSferatu
DOS-Übermensch
Beiträge: 1220
Registriert: Di 25. Sep 2007, 12:05
Kontaktdaten:

Re: Bootloader

Beitrag von DOSferatu »

Als ich das gelesen habe, war mein erster reflexartiger Impuls: O.M.G.
Aber wir sind ja hier im DOS-Forum und nicht in irgend einem dieser Spott&Flame&Haß-Foren, die es sonst so gibt.

Ich kann mich nur meinen Vorrednern anschließen: Das EXE-Format wurde von Microsoft für MS-DOS entwickelt (später für MS-Windows "aufgebohrt"). Eigentlich von einem Mann, dessen Name mir gerade entfallen ist, dessen Initialen aber M.Z. sind (das sind auch die ersten beiden Zeichen (MZ) in einer DOS-EXE, auch ZM ist übrigens möglich.

Der Header eines EXE-Files muß erst gelesen und ausgewertet werden, da er Informationen über die Offsets der zu setzenden Segmentregister (CS, DS, SS), die Stackgröße, den zusätzlich zu reservierenden Speicher enthält und die "Einsprungadresse", also an welcher Stelle im Code die Ausführung begonnen werden soll, also quasi IP (hier: Instruction Pointer, nicht: Internet Protocol). Außerdem enthält der Header noch die bekannte Tabelle, die dafür zuständig ist, alle Stellen im File zu markieren (per Offset), an denen mit absoluten statt relativen Adressierungen gearbeitet wird. Das ist nötig, damit die EXE an jede beliebige (naja /16 teilbare) Speicheradresse geladen werden kann.
Das funktioniert dann so, daß eine EXE so gespeichert ist, als wäre sie an Speicherstelle 0 geladen. Und an alle Stellen im Code, auf die die Tabelle verweist, wird dann die (Segment)Adresse, an die die EXE geladen wurde, dazuaddiert - erst dann wird die EXE gestartet.
Eigentlich ist das eine gute Erfindung - so war es möglich, auch größere Programme, die mehr als ein Segment (64 kByte) belegt haben, auszuführen.

Also entweder man baut den EXE-Lader, der in DOS enthalten ist, nach. Oder man gibt sich mit einem COM Programm zufrieden. Hier ist das Laden wesentlich unkomplizierter. Soweit ich weiß, setzt man da einfach CS und DS auf den Anfang von freiem Speicher (der so groß ist wie das COM-File + 256 Bytes), dann lädt man das COM an den Offset von CS (oder DS) +256 und startet es auch dort. Ich kann mich da etwas irren, aber so ungefähr läuft es. Ich hab jetzt gerade nicht im Kopf, wohin man den Stack (SS) laden muß.

Zum Stichwort freier Speicher: Der ganze Speicher ist (fast) komplett frei. Dieser Bootlader ist quasi das Betriebssystem - dem gehört der komplette Speicher und ob und wie man ein Speichermanagement dann veranstaltet, bleibt einem selbst überlassen.

Ich könnte mich sicher in das Ganze Thema wieder etwas reinlesen, aber momentan baue ich wieder an anderen Dingen herum.

Mich stört es ja auch etwas, daß ich in Borland Pascal 7.x nur noch EXE, keine COM erstellen kann. Ich habe aber gehört, daß es da Programme (EXE2COM, EXE2BIN oder so) gibt, die eine EXE in eine COM wandeln können - immer vorausgesetzt, daß die EXE die erforderlichen Eigenschaften hat (z.B. nur relative Sprünge usw).

Ich hoffe, das reicht erstmal als Erklärung.
TomCat
MemMaker-Benutzer
Beiträge: 87
Registriert: Do 1. Dez 2011, 17:16

Re: Bootloader

Beitrag von TomCat »

Hallo,

danke für die lange Antwort.
ich habe im Moment Schwierigkeiten die "Relocation-Tabelle" so umzusetzen, dass meine exe läuft.
Alles was ich gelesen habe ist, dass die relocation-table in Offset(2 Byte) und Segment(2 Byte) vorliegt.

Ist es nicht einfach so, dass ich in meiner (roh)-Exe einfach an bestimmten stellen den Eintrag um den Wert erhöhen muss
an den ich meine Exe final in den Speicher laden will?

Wäre doch logisch oder?

ab Adresse 18h stehen ja die Einträge der relocation table. hier finde ich dieEeinträge: (7 und 42), (12 und 42) etc.
wie sind diese zu interpretieren bzw. was muss ich damit anstellen?


Leider finde ich dazu nirgends ein Beispiel oder ne gute Erklärung.:-(
Benutzeravatar
zatzen
DOS-Guru
Beiträge: 518
Registriert: Di 17. Apr 2012, 05:10
Wohnort: bei Köln
Kontaktdaten:

Re: Bootloader

Beitrag von zatzen »

Das Speichermodell TINY lässt sich zu einer COM verlinken.
Ich habe aber auch einfach mal experimentell in Turbo Pascal
ein paar ASM Befehle geschrieben, per DB Markierunen eingefügt,
das ganze zu einer EXE kompiliert und den entsprechenden
Teil ausgeschnitten und als COM gespeichert, funktionierte auch.
mov ax, 13h
int 10h

while vorne_frei do vor;
TomCat
MemMaker-Benutzer
Beiträge: 87
Registriert: Do 1. Dez 2011, 17:16

Re: Bootloader

Beitrag von TomCat »

Hallo,

es geht darum ein großes Programm mal ganz ohne Betriebssystem laufen zu lassen. also mit mehreren Daten- und Code-Segmenten.

Mein Problem ist aktuell die Interpretation der Relocation-Table.

Also wie ist mit den Einträgen zu verfahren ist?

THX
TomCat
MemMaker-Benutzer
Beiträge: 87
Registriert: Do 1. Dez 2011, 17:16

Re: Bootloader

Beitrag von TomCat »

so weit ich das verstanden habe geht es darum, an beswtimmten Stellen der EXE-Datei die eintraege um den Wert zu erhöhen, den man als Offset nimmt um die Datei in den Speicher zu laden.

Ist das korrekt?
idspispopd
Norton Commander
Beiträge: 108
Registriert: Fr 8. Mai 2015, 22:28
Wohnort: Hamburg

Re: Bootloader

Beitrag von idspispopd »

Hier gibt es ein Beispiel das ganz gut aussieht:
http://forum.osdev.org/viewtopic.php?f=1&t=21676
Du könntest Deine .exe sicherlich auch vorab relozieren, wenn Du weißt dass sie immer an 1000:0000 geladen wird.

Da Du das noch nicht explizit gesagt hattest: Ich nehme an es geht Dir um die sportliche Herausforderung, alles selbst zu programmieren und volle Kontrolle über den Bootprozess zu haben? Ansonsten kann GRUB hier glaube ich helfen wenn Du nur MS-DOS umgehen willst, dann hättest Du schon mal eine Unterstützung des Dateisystems (aber Du wolltest glaube ich fixe Sektoren nehmen).
TomCat
MemMaker-Benutzer
Beiträge: 87
Registriert: Do 1. Dez 2011, 17:16

Re: Bootloader

Beitrag von TomCat »

Hi,

es geht mir darum ein sehr komplexes Programm völlig ohne OS laufen zu lassen. Ausserdem will ich totalen und schnellen Zugriff auf die HDD haben. Also ohne Dateisystem-Gedöns.

BTW: Es handelt sich um KI/Robotik-Programm...
Brueggi

Re: Bootloader

Beitrag von Brueggi »

Da ich mit bdos/286 Erfahrungen sammeln konnte, gebe ich mal meinen Senf dazu.

-wenn nur das programm geladen werden soll von hd und sonst nix gemacht wird, würde ich das fertige Programm direkt sektor für sektor auf hd schreiben - ohne exe/com-format. Bdos z. B. Besteht aus krnl286.sys,die das dos im binärformat enthält und so ohne Aufwand vom bootlader geladen werden kann.

Das schreiben vom bootlader oder des Programms erledigt idealerweise ein kleines tp-programm (liest eine Datei ein und schreibt die bytes auf disk/hd in den 1. Sektor und folgende)

-wenn du bis kommende woche warten kannst suche ich mal den source vom exe-relocator raus, den habe ich mal gebastelt, um tp-kompilate direkt unter bdos zu starten. Den kannst du verwenden - musst nur die hand voll dos-funktionen zum emulieren vom int 21 entfernen. Du liest dann also nur noch die exe ein und rufst den relocator auf, der belegt die register, patcht Sprungadressen und führt das Programm aus.

Bei bedarf poste ich gerne mal sourcen.

P. S. Totalen und schnellen Zugriff auf hd kann man auch mit Filesystem haben. Wenn du daten protokollieren willst, oder irgendwas speichern, kommst du nicht drum herum. Wenn du nen schnellen rechnerstart brauchst, kann ich dir gerne bdos anpassen, so dass es gleich durchbootet. Wenn man das startscript und den Bootmanager löscht gehts recht flott. Das Filesystem ist auch sehr einfach, das könntest du ggf direkt manipulieren ;-)
TomCat
MemMaker-Benutzer
Beiträge: 87
Registriert: Do 1. Dez 2011, 17:16

Re: Bootloader

Beitrag von TomCat »

So funzt jetzt alles und ist sauschnell !
Kann jetzt jeden Sektor der HDD lesen/schreiben egal wie groß die HDD ist.
Jetzt geht es evtl. um ein rudimentäres Filesystem das aber nix bremsen soll.
Ich brauche einfach volle Power!
drzeissler
DOS-Gott
Beiträge: 3336
Registriert: Mo 8. Feb 2010, 16:59

Re: Bootloader

Beitrag von drzeissler »

Gibt es irgendwo eine Übersicht aller PC-Booter?
CPU: 486 DX2/66 MOBO: SNI-D882 RAM: 3x16MB - FDD: 3,5" 1,44MB HDD: 6,4GB Seagate ISA(1): Audican32Plus PCI(1): 3com TX 905 OS: MsDos622 - Win95a - WinNT 3.51
Benutzeravatar
matze79
DOS-Gott
Beiträge: 7910
Registriert: So 9. Sep 2012, 20:48

Re: Bootloader

Beitrag von matze79 »

Hier noch was:
https://github.com/daniel-e/tetros

Tetros, passt in den Bootsector :)
https://www.shadowcircuit.de - Die kleine Community rund um Retro Computing
https://www.retroianer.de
Benutzeravatar
struuunz
DOS-Übermensch
Beiträge: 1209
Registriert: Fr 7. Mär 2014, 15:15
Wohnort: Pfalz
Kontaktdaten:

Re: Bootloader

Beitrag von struuunz »

haha ... ein Tetris im MBR. Sehr witzige Sache :)
Ritter der DOSianer
-- https://dosreloaded.de --
Antworten