Bootloader Fat32 USB-Stick Real/Protection Mode


  • Mod

    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 ausrechnen

    FAT32 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 erkennt

    FAT32
    Freier Cluster 0000000016
    Defekter Cluster 0FFFFFF716
    letzter Cluster einer Clusterkette 0FFFFFF816…0FFFFFFF16
    sonstiger Cluster einer Clusterkette 0000000216 ≤ X ≤ 0FFFFFF616

    Bei 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

    1. <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 = FullSpeed

    Device #1
    Emulation Type = Auto
    Device #2
    Emulation Type = Auto
    ...

    Plug&Play - 0/S = No

    Oder beim Booten F8 und dann USBStick auswahlen 😃


  • Mod

    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 habe

    Den 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!


  • Mod

    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.


Anmelden zum Antworten