ObjectsOS Bootsektor ========================================================== Version: 0.1 (04/09/2001) Autor: Gabriel Mainberger für ObjectsOS Team (gabisoft@freesurf.ch) Website: http://objectsos.de.vu Lizenz: GNU Lizenz (siehe unten) Inhalt ====== 1. Allgemeines 2. Bootsektor Informationen 3. Routinen 3.1 Ausführen des Bootsektorcodes 3.2 Das Rootverzeichnis (Stammverzeichnis) finden 3.3 Anzahl der Verzeichnis-Einträge auslesen 3.4 Herausfinden des Datei-Sektors 4. Sonstige Info 1. Allgemeines ============== Ein Bootsektor ist dazu da, eine Datei von einer Festplatte bzw. Diskette in den Speicher zu laden und auszuführen. Diese Datei ist aber nicht an einen bestimmten Sektor gebunden, sondern soll irgendwo auf der Platte gespeichert werden können. Damit auch Informationen gespeichert werden, wo sich die Datei befindet, muss das mit einem Datei System (in unserem Fall FAT) geschehen. Daraus folgt, das der Bootsektor, alle Informationen des Datei Systems auslesen und auswerten muss, um daraus den Sektor zu berrechnen in dem die Datei liegt. Der Bootsektor muss im ersten Sektor (Kopf 0, Spur 0, Sektor 1) sein und ausserdem am Ende die Bootsignation AA55 haben, sonst wird der Bootsektor vom BIOS nicht erkannt und denzufolge auch nicht geladen. 2. Bootsektor Informationen =========================== Zuerst ist es einmal zu wissen, wo das BIOS den Bootsektor im Speicher ablegt. Das ist in der Adresse 0x7C00. Diese Adresse ist bei allen BIOS gleich und dies hat Historische Gründe. Der Standart IBM PC benötigt mingestens 32 KB (!!!) Speicher, so das der Bootsektor an das "Ende" des Speichers gelegt wurde. Damit der Assembler, das auch weiss muss man ihm das am Anfang der Datei angeben. org 0x7C00 Auch die Dateissystem Informationen sind Teilweise im Bootsektor. Diese sind in Ihrer Position fest. Deshalb muss dieser Bereich mit einem Jump umgangen werden. Der NOP Befehl nach dem JMP ist nur dazu da, den Speicher aufzufüllen. jmp short load nop Hier stehen alle FAT Informationen die in einem Bootsektor vorhanden sein müssen. Die hier angegebenen Werte definieren hier die FAT-Struktur einer Diskette. oem db "OOS0.1.1" ; OEM bps dw 512 ; Bytes/Sektor spc db 1 ; Sektoren/Cluster rs dw 1 ; Reservierte Sektoren noFats db 2 ; Anzahl der FAT Kopien rde dw 224 ; Grösse des Root-Verzeichnisses ls_s dw 2880 ; Sektoranzahl wenn < 32MB Media db 0xF0 ; Media-Descriptor(hier 1.44MB) spF_s dw 9 ; Größe vom FAT spt dw 18 ; Sektoren pro Spur hpt dw 2 ; Anzahl der Read/Write Köpfe hs dd 0 ; Versteckte Sektoren ls_l dd 0 ; Sektorenanzahl wenn > 32MB dn db 0 ; Laufwerk reserved db 0 ; unbenutzt Signatur db 29h ; Boot-Signatur 29h DiskID dd 0 ; Disk-Volume-UD Name db "NO NAME " ; Name Dateisystem db "FAT12 " ; Dateisystem 3. Routinen =========== 3.1 Ausführen des Bootsektorcodes ================================= Hier wird ein Stack angelegt, die 1E FDC param table (was auch immer das ist) definiert und der Disketten Controller zurückgesetzt. 3.2 Das Rootverzeichnis (Stammverzeichnis) finden ================================================= Das Stammverzeichnis bzw. Rootverzeichnis enthält die Informationen zu allen Dateien. Das heisst, alle Dateinamen, Anfangssektoren der Dateien, Attribut Informationen ect. Alle dazu nötigen Informationen, wie man das Stammverzeichnis berechnet, kann man den Bootsektor Informationen entnehmen. Stammverzeichnis = (Anzahl der FAT kopien * Grösse der FATs) + Versteckte Sektoren + Reservierte Sektoren 3.3 Anzahl der Verzeichnis-Einträge auslesen ============================================ Um herauszufinden wie viele Verzeichnis-Einträge es gibt, ist eine weitere Berechnung nötig. Dazu wird die Verzeichniseintragslänge (bei FAT 32 Bytes) mal die Anzhal der Stammverzeichniseinträge gerechnet und diese durch die Anzahl Bytes pro Sektor gerechnet. Anzahl Verzeichnis-Einträge = (Verzeichniseintragslänge * Anzahl der Stammverzeichniseinträge) / Bytes pro Sektor 3.4 Herausfinden des Datei-Sektors ================================== Der Sektor ist realtiv einfach heruaszufinden. Er steht genau 26 Bytes (0x1A) nach dem Dateinamen. Auch die Länge ist nicht allzuschwer herauszufinden. Sie steht 28 (0x1c) Bytes hinter dem Dateinamen. 4. Sonstige Info ================ Das wären mal die wichtigsten Funktionen des Bootsektors. Sollte etwas unklar oder nicht genügend Dokumentiert sein, meldet euch bei mir gabisoft GNU Lizenz ========== Copyright (c) 2001 ObjectsOS Team. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by he Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License". A.3 GNU Free Documentation License: You should have received a copy of the GNU General Public License along with this program; if not, look at the website http://www.gnu.org/copyleft/fdl.html or write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.