>Die Zahlen sind komplett falsch. Die Interrupttabelle ist 1024 Bytes
>gross, im Adressbereich 0000:0000 bis 0000:03ff. Dahinter kommt die BDA
>mit 256 Bytes, von 0000:0400 bis 0000:04ff bzw. von 0040:0000 bis
>0040:00ff. Die erste freie Adresse ist demnach 0000:0500 bzw. 0050:0000.
>
>0000:7c00 ist die Adresse, an die der Bootsektor vom BIOS geladen
>wird, das heisst aber nicht, dass alles davor belegt wäre.
Was ist an der IVT falsch? Ich habe doch geschrieben dass sie in dem
Bereich steht und das trifft voll und ganz zu, oder nicht?
Und es stimmt dass bereits ab 0x500 der freie Speicherbereich beginnt.
Das war mein Fehler. Aber ich habe auch nicht behauptet dass die
Belegung mit dem Bootsektor zusammenhängt. ;)
>Die Adresse wird in dem Beispiel einfach nur aus Bequemlichkeit genutzt,
>da es dort sowieso nicht um ein "Betriebssytem" geht (auch wenn der
>Autor das behauptet), sondern allenfalls um einen minimalistischen
>Bootloader. So muss man sich keine Gedanken darum machen, dass man den
>Bootloader nicht durch den frisch geladenen OS-Code überschreibt.
Natürlich ist das noch lange keine Betriebssystem. Aber nahezu jeder,
der eines entwicklen will oder sich auch nur für die "unterste Ebene"
interessiert, fängt mit solchen kleinen Beispielen an.
>Die Segmente liegen bei x86 nicht wie man meinen könnte auf glatt durch
>64kiB teilbaren Adressen, sondern alle 16 Bytes fängt ein neues Segment
>an, das dann natürlich weitgehend mit den Nachbarsegmenten überlappt. Es
>ist durchaus üblich (siehe z.B. das "Original", DOS in seinen
>Varianten), den Kern direkt im Anschluss an die BDA zu laden. Schaut man
>sich den Bootloader eines solchen OS an (z.B. bei FreeDOS), wird i.d.R.
>eine seiner ersten Amtshandlungen beim Booten sein, sich selbst in einen
>anderen Speicherbereich zu verschieben, um den Platz für den Kern
>freizumachen.
Und ja, die Segmente sind jeweils 16 Bytes groß. Habe ich etwas anderes
gesagt? Wenn man aber noch im Segment 0 ist dann kommt man ohne zu
wechseln nun mal maximal bis 0xFFFF. Wenn man nun das weitere Programm
nach 0x500 ff. schreibt und das Programm immer weiter wächst - man
probiert dies und das - und plötzlich geht nichts mehr und finde dann
mal heraus, dass das Programm gerade so groß geworden ist, dass der
Bootsektor überschrieben wird. Also vermeidet man das besser im voraus
und nimmt die nächste Adresse, also 0x7E00. Theoretisch könnte man
natürlich das Segment 0x07E0 benutzen und hätte auch wieder 64KBytes
platz. Aber es ist doch viel schöner wenn das Programm bei Segment
0x1000 beginnt, nicht? Dann kann man 0x1000 als Code Segment, 0x2000 als
Datensegment, ... benutzen und es ist alles schön übersichtlich. =)
>Einfach mal eben 62,5kiB zu verschenken bloss um das Betriebssystem in
>ein "glattes" Segment zu laden will angesichts des eingeschränkten
>Realmode-Adressraumes gut überlegt sein.
Wer sagt denn verschwendet? Wenn dieser Bereich benötigt wird, kann man
ihn immer noch benutzen. Aber gerade für Anfänger ist es sicher
einfacher, wenn sie ganze 64KB frei haben und sicher nichts
überschreiben. ;)