Bootloader Fat32 USB-Stick Real/Protection Mode
-
Hallo,
Ich bin gerade dabei den Bootloader aus Teil 3 von PrettyOSFirst Stage Bootloader
Second Stage Bootloaderso umprogrammieren dass er Fat32 kann und von einem USB Stick läuft.
Ich bin schonn so weit aber, wass muss ich noch umändern (die Sectorengröße oder die Cluster)
;Code ASM:
%ifndef FAT32
%define FAT32[BITS 16]
; "FAT 32" file system is build up by four areas at USB Sticks:
OperatingSystemName db " PRETTY " ; 8 byte
BytesPerSec dw 512
SecPerClus db 1
ReservedSec dw 1
NumFATs db 2
RootEntries dw 224
TotSec dw 2880
MediaType db 0xF0
FATSize dw 9
SecPerTrack dw 18
NumHeads dw 2
HiddenSec dd 0
TotSec32 dd 2 ; 0 = FAT12, 1 = FAT16, 2 = FAT32
DriveNum db 0
Reserved db 0
BootSig db 0x29
VolumeSerialNum dd 0xD00FC0DE
VolumeLabel db "PRETTY OS " ; 11 byte
FileSys db "FAT32 " ; 8 byte%endif
Was muss ich noch umändern im First Stage Bootloader b.z.w im
Second Stage BootloaderIch weiß jetzt auch, dass man bei FAT32 das Rootverzeichnis frei positioniert werden kann. Aber wie??
Danke im V o r r a u s
-
Ein interessantes Projekt!
Da (nach unseren Erfahrungen) Booten von USB schwierig ist, wäre es schön, wenn Du die Schritte, die Du vollzogen hast, dokumentieren könntest. Weniger in Bezug auf den FAT32-Treiber, sondern eher in Bezug auf das Booten von USB, da wir damit erhebliche Schwierigkeiten hatten. Insbesondere funktionierte es auf manchen Rechnern einfach nicht. Allerdings haben wir einen Stick dazu mit FAT12 formatiert.
Ich weiß jetzt auch, dass man bei FAT32 das Rootverzeichnis frei positioniert werden kann. Aber wie?
Ich bin kein Experte für FAT32, aber das Rootverzeichnis ist dort ein ganz normales Verzeichnis wie jedes andere auch. Das Lowlevel-Wiki sagt:
Bei FAT32 liegt das Wurzelverzeichnis im Datenbereich und wird wie jedes andere Verzeichnis auch behandelt. Es hat deshalb keinen festen Platz auf dem Volume. Sein erster Cluster wird im Boot-Sektor gespeichert, die weiteren Cluster werden in der FAT gespeichert. Die Größe des Wurzelverzeichnisses ist dadurch dynamisch.
Übrigens: PrettyOS verwendet eine weiterentwickelte Version des Bootloaders aus dem Tutorial, der u.a. mit größeren Kerneln umgehen kann. Es ist daher ggf. sinnvoll, die Änderungen direkt an dem verbesserten BL zu machen. Den Sourcecode findest Du hier: http://prettyos.svn.sourceforge.net/viewvc/prettyos/trunk/Source/
-
Was muss ich noch umändern im First Stage Bootloader b.z.w im
Second Stage BootloaderDu wirst im BL1 eine Routine schreiben müssen, die den BL2 (also die Datei boot2.bin) lädt. Alternativ könnte man versuchen, den BL2 in die hidden sectors zu kippen. Das kann im BL1 das Laden vereinfachen. Im BL2 müssten wiederum eine Laderoutine geschrieben werden, die dann den ganzen Kernel (kernel.bin) lädt.
-
Mal step-by-step:
Das BIOS mancher PC kann den usb-Stick booten. das klappt leider nicht mit jedem Stick perfekt. Aber angenommen, es haut hin. Das kannst Du prüfen, indem du deinen usb-Stick mit FAt12 "formatierst". Das geht wie folgt durch binäres Kopieren des Floppyinhaltes auf den Stick:dd if=FloppyImage.img of=\\.\I: (wenn I: dein LW-Buchstabe für den Stick ist)
Nun ist der Stick FAT12 formatiert.
Um FAT12 oder FAT32 muss das OS sich selbst kümmern. Also muss sowohl im BL1 als auch im BL2, auch die xxx.inc beachten, FAT12 auf FAT32 geändert werden. Da hat sich bisher noch keiner ran getraut.
Schau dir die Unterschiede bei FAT32 an. Das betrifft vor allem das Root-Verzeichnis.Du musst zunächst den MasterBootSector auslesen, damit du die Partitions-Tabellen hast, anschließend dann im angegebenen Sektor die Partitions-Infos.
Ich bin da momentan überfordert, helfe aber gerne mit, das zu lösen. FAT32 verstehe ich. Unser PrettyOS liest das ja alles aus, wenn man von/auf einem/n usb-Stick liest/schreibt. Ist leider komplex.
-
Ich binn jetzt so weit das man den First Stage bootloader einfach normal mit
Der fat32.inc assemblieren kann, in der Bootsector von einem Fat32 formatierten USB Stick schreiben kann mit Hexeditor HxD.
Jets Bootet der PC von USB aber findet boot2.bin nicht.Was jetzt?
-
Man muss boot2.bin im root dir finden und den Ladeprozess von FAT12 auf FAT32 switchen. Schau dir mal in PrettyOS den Prozess in C an, wie wir den MBR und die Partition analysieren und etwas lesen von FAT32 usb-Sticks.
-
Unterschiede zwischen Fat12 und Fat32
quelle http://de.wikipedia.org/wiki/File_Allocation_Table
Unterschideliche gro?e Fat Tabelle
Fat32 hat 28-bit binary Cluster und 4 bits sind "reserved"
Fat32 maximale Clusteranzahl = 268.435.456
Fat32 Clustergröße 4 KB bis 32 KB nicht 512 Bit ???Offset 10 Anzahl der FAT-Kopien FAT32 = 2 FAT16 abwärts = 1
Offset 11 Maximale Anzahl an Verzeichniseinträgen im Stammverzeichnis (Ungenutzt bei FAT32 und stets 0000hex)
Offset 13 Gesamtsektoranzahl des Mediums (max. 65535, bei größeren Medien ist dieser Wert 0 und der eigentliche Wert steht als 4-Byte-Wert an Offset 20hex. !! Bei FAT32 stets ungenutzt !!
Offset 16 Anzahl der Sektoren pro FAT. (Bei FAT32 ungenutzt und stets 0000hex, siehe Offset 24hex.)Offset 18 Sektoren pro Spur AUCH BEI USB ??
Offset 1A Anzahl der Seiten bzw. Schreib-Lese-Köpfe AUCH BEI USB ??Offset 1C Anzahl der „versteckten“ Sektoren vor dem Bootsektor. Bei Festplatten ist das die Anzahl der Sektoren zwischen Master Boot Record und dem Bootsektor der Partition. Bei nicht partitionierten Medien (ohne MBR) stets 0.
Offset 20 Gesamtsektoranzahl, falls größer als 65535 Bei 4GB noch ausrechnenFAT32 benutzt eine davon abweichende Struktur ab Offset 24hex:
Offset Länge (in Byte) Inhalt
24 4 Anzahl der Sektoren pro FAT
28 2 FAT Flags
2A 2 FAT-32-Version. Bei Microsoft stets 0000hex. (optional 0001hex für FATplus)
2C 4 Clusternummer, an der das Stammverzeichnis beginnt. Meistens 2.
30 2 Sektornummer des „FS Information Sector“ (In der Regel: 1)
32 2 Sektornummer der Bootsektorkopie (in der Regel: 6; Microsoft empfiehlt, keinen anderen Wert zu benutzen)
34 12 reserviert für spätere Erweiterungen, derzeit stets 0
40 1 Physische BIOS-Laufwerksnummer
41 1 Reserviert
42 1 Erweiterte Bootsignatur
43 4 Dateisystem-ID (Seriennummer)
47 11 Name des Dateisystems (ungenutzt)
52 8 FAT-Version. Stets "FAT32 "
5A 420 x86-Maschinencode des Bootloaders
1FE 2 BIOS-Bootsektorsignatur. Enthält die beiden Werte 55hex AAhex, anhand derer das BIOS beim Booten einen gültigen Bootsektor erkenntFAT32
Freier Cluster 0000000016
Defekter Cluster 0FFFFFF716
letzter Cluster einer Clusterkette 0FFFFFF816…0FFFFFFF16
sonstiger Cluster einer Clusterkette 0000000216 ≤ X ≤ 0FFFFFF616Bei FAT32 hat das Stammverzeichnis eine variable Größe und kann an einer beliebigen Position des Datenbereichs beginnen.
Es kann maximal ein Bereich von 2hoch15 · 2hoch28 = 2hoch43 Byte adressiert werden.
maximal 2hoch28 Dateien.
Media Descriptor Byte ist doch nur bei Diskette ?BL2 --> Protection mode --> Kernel laden
-
USB Stick an USB Stecken und Bios starten
Removable Drivers
- <USBstick name>
...
Interrupt 19 Capture = Disabled
USB Configuration:
USB devices Enabled = 4
USB Funktion = 8 USB Ports
Legacy USB Support = Enabled
USB 2.0 Controller = Enabled
USB 2.0 Controller Mode = FullSpeedDevice #1
Emulation Type = Auto
Device #2
Emulation Type = Auto
...Plug&Play - 0/S = No
Oder beim Booten F8 und dann USBStick auswahlen
- <USBstick name>
-
Wie weit kommst Du inzwischen?
-
Also der BL1 startet und bootet den BL2 dar startet den
Kernel noch nicht weil ich noch keinen Passenden Protection Mode
Kernel habeDen USB Stick kann man auch nornal berschreiben.
Wird unter Windows normal erkannt:
(Keine Ahnung ob auch unter Ubuntu/Linux)Ich werde die nachsten Tage mal Code Posten!
-
Klingt interessant.
-
Welche Dateien BL2 haben
auch was mit den Dateiensystem zutun (Fat12)??BL2:
A20.inc
Fat12.inc
GetMemoryMap.inc
gdt.inc
boot2.asm
-
Fat12.inc. Aufgerufen werden die Routinen von boot2.asm. In den anderen Dateien sollte nichts dergleichen drin sein.
-
Danke
Ich bin schonn so weit aber Fat32 hat eine andere Struktur ab Offset 24
Uberall wo ";WIE WAS" steht ABER wie mach ich das??
In boot.asm mus ich eigentlisch nichts mehr änder?%ifndef FAT32_INC %define FAT32_INC [BITS 16] ;########################################################################## ; Bootloader from Pretty OS changes by Max Kaiser AND ALL WHO HELP ;########################################################################## ; "FAT 32" file system is build up by four areas at USB Systems (USB-Stick, USB-Harddisk): ; - Boot Sector (also called BIOS Parameter Block, BPB) ; - File Allocation Table, FAT ; - Root Directory ; - Subdirectories and Files ; boot sector info block OperatingSystemName db "PrettyOS" ; 8 byte NICHT IN BOOT.ASM BytesPerSec dw 512 ; 512 , 1024 , 2048 , 4096 SecPerClus db 1 ; 1, 2, 4, 8, 16, 32, 64 ggf. auch 128 ReservedSec dw 2 ;neu, orginal 1 in 2 Sector you can write your Infos | In den 2. Sector con man Infos reinschreiben NumFATs db 2 ; 2 fur Fat32 RootEntries dw 0000 ;neu, Orginal 224 bei Fat32 ungenutzt d.h. 0000hex TotSec dw 0 ;NICHT IN BOOT.ASM neu, Orginal 2880 maximal 65535 wenn mehr dan 0 an Offset 20hex Bei FAT32 ungenutzt MediaType db 0xF0;NICHT IN BOOT.ASM ;neu ??????? WAS MUSS DA HINN Eigentlich egal oder ?????? FATSize dw 0000 ;neu, Orginal 9 FAT32 ungenutzt stets 0000hex sieh ????? offset 24hex ????? SecPerTrack dw 18 ;WIE WAS NumHeads dw 2 ;WIE WAS HiddenSec dd 0 ;WIE WAS NICHT IN BOOT.ASM TotSec32 dd 2 ;WIE WAS 0 = FAT12, 1 = FAT16, 2 = FAT32 neu 0 war zuerst NICHT IN BOOT.ASM DriveNum db 0 ;WIE WAS Reserved db 0 ;WIE WAS NICHT IN BOOT.ASM BootSig db 0x29 ;WIE WAS NICHT IN BOOT.ASM VolumeSerialNum dd 0xD00FC0DE ;!!!! WIE WAS Irgend eine ODER !!!!! NICHT IN BOOT.ASM VolumeLabel db "PRETTY OS " ; 11 byte NICHT IN BOOT.ASM FileSys db "FAT32 " ; 8 byte NEU, Orginal "FAT12 " jetzt "FAT32 " NICHT IN BOOT.ASM ;x86- Maschienencode des Bootloader ;BIOS-Bootsignatur 55hex, AAhex ;######################################################## ;DAS MUSS NOCH HINEIN STAD DEM ";WIE WAS" ;######################################################## ;Offset Länge (in Byte) Inhalt ;24 4 Anzahl der Sektoren pro FAT ;28 2 FAT Flags ;2A 2 FAT-32-Version. Bei Microsoft stets 0000hex. (optional 0001hex für FATplus) ;2C 4 Clusternummer, an der das Stammverzeichnis beginnt. Meistens 2. ;30 2 Sektornummer des „FS Information Sector“ (In der Regel: 1) ;32 2 Sektornummer der Bootsektorkopie (in der Regel: 6; Microsoft empfiehlt, keinen anderen Wert zu benutzen) ;34 12 reserviert für spätere Erweiterungen, derzeit stets 0 ;40 1 Physische BIOS-Laufwerksnummer ;41 1 Reserviert ;42 1 Erweiterte Bootsignatur ;43 4 Dateisystem-ID (Seriennummer) ;47 11 Name des Dateisystems (ungenutzt) ;52 8 FAT-Version. Stets "FAT32 " ;5A 420 x86-Maschinencode des Bootloaders ;1FE 2 BIOS-Bootsektorsignatur. Enthält die beiden Werte 55hex AAhex, anhand derer das BIOS beim Booten einen gültigen Bootsektor erkennt. %endif
-
Du brauchst im BL2 keinen kompletten BPB. Der ist in unserem BL2 nur deswegen partiell da, da wir einfach die Parameter nutzen. Es reicht daher, wenn Du dich im BL2 auf die Daten beschränkst, die du brauchst (kannst Du auch als Konstanten im Code nutzen, oder als Makro definieren)
-
Noch eine Frage:
Wen boot1.bin in den Bootsector schreibe dan kan den USB stick normal
beschriben, aber er hat die größe einer Diskette und nicht die 4GB wie davor.Was muss ich hier änder?
BytesPerSec dw 512 SecPerClus db 1 ReservedSec dw 1 NumFATs db 2 RootEntries dw 224 TotSec dw 2880 MediaType db 0xF0 FATSize dw 9 SecPerTrack dw 18 NumHeads dw 2
-
max_c++_c_LOL schrieb:
Noch eine Frage:
Wen boot1.bin in den Bootsector schreibe dan kan den USB stick normal
beschriben, aber er hat die größe einer Diskette und nicht die 4GB wie davor.Was muss ich hier änder?
BytesPerSec dw 512 SecPerClus db 1 ReservedSec dw 1 NumFATs db 2 RootEntries dw 224 TotSec dw 2880 MediaType db 0xF0 FATSize dw 9 SecPerTrack dw 18 NumHeads dw 2
Dort muss ein FAT32-BPB hin
-
Ja aber wen ich den Fat32_BPB in den USB stick
schreibe hat der USB stick nicht mehr 4GB sondern
nur noch ein paar MB so wie eine Diskete.
Aber was mus ich ändern das der USB stick wieder 4 GB groß wird?
-
Naja, die Werte müssen natürlich auch zum Gerät passen. Ein USB-Stick hat z.B. mehr als 2880 Sektoren.