Bootloader Fat32 USB-Stick Real/Protection Mode



  • Hallo,
    Ich bin gerade dabei den Bootloader aus Teil 3 von PrettyOS

    First Stage Bootloader
    Second Stage Bootloader

    so 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 Bootloader

    Ich 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 Bootloader

    Du 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.


  • Mod

    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?


  • 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