Eigenes OS?



  • Wenn Stage 1 die CHS der eigenen Partition selbst ermittelt (z.B. durch Auslesen der Partitionstabelle des MBR), dann müssen "Seltsamkeiten" wie bei GRUB erst nicht in Erwägung gezogen werden.

    In der eigenen Partition ist Platz genug für "seltsames" (jedenfalls solange wie PrettyOS noch kein FS hat).



  • Dort sitzt aber normal schon ein Dateisystem, das seine eigenen Vorstellungen davon hat, wie der Platz genutzt wird. Ich denke, man wird eher nicht drum herumkommen, in stage1 ein paar Sektornummern von stage2 reinzupatchen.



  • Wenn die Position von Stage 2 der Stage 1 "nachträglich" mitgeteilt werden muß, dann ist es schlechtes Design.



  • Dann hat gutes Design leider die Eigenschaft, dass es nicht funktioniert.



  • Ich hab grad mal meine Grub Installationen geprüft. Auf der Diskette (ext2) und der Festplatte (ext3) liegt Stage2 im Sektor 1, also direkt hinter dem MBR.

    Was würde man denn machen wenn das Dateisystem dann doch mal in Sektor 1 beginnt? Stage2 in die Zuordnungstabelle eintragen und hoffen das das Dateisystem nicht auf die Idee kommt die Datei zu verschieben (Stichwort defragmentieren bei ntfs)?



  • Du müsstest mal schauen, was GRUB auf einer Diskette macht, dort hat man diesen Platz ja nicht, wenn ich mich grad nicht täusche. Aber stimmt, mit Dateisystem und Defragmentierung hast du wohl verloren.



  • taljeth schrieb:

    Du müsstest mal schauen, was GRUB auf einer Diskette macht, dort hat man diesen Platz ja nicht, wenn ich mich grad nicht täusche. Aber stimmt, mit Dateisystem und Defragmentierung hast du wohl verloren.

    Stimmt, bei der Diskette ist es doch nicht Sektor 1. Ich habe mir mit Hexdump nur 1 byte anzeigen lassen...

    Also bei der Diskette liegt Stage2 mitten auf der Diskette und ist im Dateisystem eingetragen. Also bräuchte man um sicher zu gehen wirklich einen Installer der mit dem Dateisystem auf dem Bootmedium klarkommen muss.



  • +gjm+ schrieb:

    Probier mal folgendes:

    ; boot.asm (version 106)
    ReadSectors:
    (...)
    ; mov  dl, BYTE [DriveNum]   ; ändern in:
     mov  dl, BYTE [bootdevice]  ; Da unklar ist welche "Nummer" das Bootdevice hat,
    (...)                        ; wird "bootdevice" schon die richtige Nummer sein.
    

    Setzt aber voraus, daß das BIOS "CHS-Zugriffe" auf ein USB-Gerät unterstützt (emuliert).
    Die Version 106 startet auch "vollständig" von einem USB-Stick.

    Hab's noch nicht ausprobiert, werde es noch nachholen.
    Ich beobachte jetzt folgendes Verhalten: Mein BIOS scheint keine Probleme zu haben vom USB Stick zu starten. Ich habe auf dem Stick meinen Dummy-Bootloader kopiert, der mit int 13 einen Sektor lesen soll. Der Dummy-Bootloader scheint vom USB-Diskettenlaufwerk zu lesen (erkennbar an den Geräuschen vom USB-Diskettenlaufwerk :)).
    Hier ist mein Dummy-Bootloader:

    [Bits 16]
    org 0x7C00    ; start address of bootloader
    
        xor ax, ax
        mov ds, ax
        mov es, ax
        mov fs, ax
        mov gs, ax
    
        mov si, szStartMessage
        call print_string
    
    CheckDriveStatus:
        mov ax, 0x0100    ; Check status of the first floppy disk
        mov dx, 0x0000
        int 0x13
    
        cmp al, 0x00
        jne DriveStatusError
    
        mov ax, 0x0000    ; Initialize es:bx buffer address pointer
        mov es, ax
        mov bx, Buffer
    
        mov ax, 0x0201    ; Read sector to the buffer at es:bx
        mov cx, 0x0001
        mov dx, 0x0000
        int 0x13
    
        mov si, szReadSectorDone
        call print_string
    
        jmp CheckDriveStatus
    
    DriveStatusError:
        mov si, szDriveStatusError
        call print_string
        jmp CheckDriveStatus
    
    ;******************************************************************************
    ;   Print String  
    ;   DS:SI   null-terminated string
    ;******************************************************************************
    print_string:
    .loop:   
        mov ah, 0x0E      ; BIOS function 0x0E: teletype
        lodsb             ; grab a byte from SI
        test al, al       ; NUL?
        jz .done          ; if the result is zero: get out
        int 0x10          ; else: print out the character
        jmp .loop
    .done:
        ret
    
    szStartMessage db "Started from USB stick", 0x0D, 0x0A, 0
    szDriveStatusError db "Drive status error", 0x0D, 0x0A, 0
    szReadSectorDone db "Reading sector done", 0x0D, 0x0A, 0
    
    TIMES 510-($-$$) hlt    ; fill bytes until boot signature
    db 0x55                 ; boot signature
    db 0xAA                 ; boot signature 
    
    Buffer:    ; Start of buffer
    


  • Hab noch ein wenig rumexperimentiert - mein BIOS weigert sich, vom USB-Diskettenlaufwerk zu starten. Geht einfach weiter und bootet von der Festplatte.
    Nach dem Booten vom USB Stick ist bei mir übrigens DX = 0x0080. D.h. USB Stick = "1st hard disk" 😕


  • Mod

    mein BIOS weigert sich, vom USB-Diskettenlaufwerk zu starten

    Hast Du nicht schon den BL Stage 1 davon gestartet, oder war das vom USB-Stick? 😕
    Er konnte doch nur den BL Stage 2 nicht nachladen, oder verwechsle ich da etwas?



  • Erhard Henkes schrieb:

    mein BIOS weigert sich, vom USB-Diskettenlaufwerk zu starten

    Hast Du nicht schon den BL Stage 1 davon gestartet, oder war das vom USB-Stick? 😕
    Er konnte doch nur den BL Stage 2 nicht nachladen, oder verwechsle ich da etwas?

    Stage 1 Bootloader habe ich bis jetzt immer nur vom USB-Stick starten können. Und dieser Stage 1 Bootloader kann irgendwie auf den USB-Diskettenlaufwerk zugreifen (der gleichzeitig am anderen USB Port angeschlossen ist), findet aber den Stage 2 Bootloader nicht.
    Das habe ich auch alles mit meinem Dummy-Bootloader nachvollzogen. Und wie ich vorhin gepostet habe, USB-Sticks werden von meinem BIOS als "1st hard disk" abgebildet (int 13h mit DL = 0x80) und USB-Diskettenlaufwerke werden als "1st floppy disk" abgebildet (int 13h mit DL = 0x00). Und Booten vom USB-Diskettenlaufwerk geht interessanterweise nicht.



  • Du hast nicht zufällig einen GRUB auf der Platte? Ansonsten könntest du es mal mit "chainloader (fd0)+1" versuchen (also GRUB von der Platte booten und den wiederum den Bootloader von der Floppy laden lassen).


  • Mod

    Stage 1 Bootloader habe ich bis jetzt immer nur vom USB-Stick starten können. Und dieser Stage 1 Bootloader kann irgendwie auf den USB-Diskettenlaufwerk zugreifen (der gleichzeitig am anderen USB Port angeschlossen ist), findet aber den Stage 2 Bootloader nicht. Das habe ich auch alles mit meinem Dummy-Bootloader nachvollzogen. Und wie ich vorhin gepostet habe, USB-Sticks werden von meinem BIOS als "1st hard disk" abgebildet (int 13h mit DL = 0x80) und USB-Diskettenlaufwerke werden als "1st floppy disk" abgebildet (int 13h mit DL = 0x00). Und Booten vom USB-Diskettenlaufwerk geht interessanterweise nicht.

    Danke für die Zusammenfassung.



  • abc.w schrieb:

    Das habe ich auch alles mit meinem Dummy-Bootloader nachvollzogen.

    Der Stack sollte noch initialisiert werden. ⚠

    abc.w schrieb:

    Und Booten vom USB-Diskettenlaufwerk geht interessanterweise nicht.

    Lade das Floppy-Image mal irgendwo hoch. Ich will es mir mal genauer ansehen.

    abc.w schrieb:

    Und wie ich vorhin gepostet habe, USB-Sticks werden von meinem BIOS als "1st hard disk" abgebildet (int 13h mit DL = 0x80) und USB-Diskettenlaufwerke werden als "1st floppy disk" abgebildet (int 13h mit DL = 0x00).

    Das ist auch ok so. Das BIOS ist der Ansicht, daß es sich bei dem USB-Stick um eine Festplatte handelt. So soll das auch sein. Nun kannst du via CHS, INT13 und DL = 0x80 beliebig auf den USB-Stick zugreifen. Aber Vorsicht bei DL=0x81! Das wird wahrscheinlich die "echte" Festplatte sein.

    Aber wie schon gesagt, die "boot.bin" ist "hardcoded" und nur für eine FAT12-formatierte Diskette geeignet! (FAT12 nur dehalb, weil man da (halbwegs) sicher sein kann, daß sich Dateien im Root-Verzeichnis an einer ganz bestimmten CHS-Position befinden).

    Wenn du ganz vom USB-Stick starten willst, dann sind Anpassungen in der CHS-"Leselogik" erforderlich.

    Die allgemeine CHS-Konfiguration für einen USB-Stick ist wie folgt:

    CHS = xxx 255 63, wobei xxx je nach Größe des Sticks differiert.


  • Mod

    ..



  • taljeth schrieb:

    Du hast nicht zufällig einen GRUB auf der Platte? Ansonsten könntest du es mal mit "chainloader (fd0)+1" versuchen (also GRUB von der Platte booten und den wiederum den Bootloader von der Floppy laden lassen).

    Ja, ich habe GRUB. Habe probeweise in der menu.lst eingetragen:

    title PrettyOS
    chainloader (fd0)+1

    Nach dem Neustart ausgewählt und, unglaublich, aber wahr, mein Dummy-Bootloader wurde von der Diskette geladen und ausgeführt 👍
    Werde es noch mal mit dem Stage1 BL von Erhard ausprobieren.



  • +gjm+ schrieb:

    Der Stack sollte noch initialisiert werden. ⚠

    Ach so, ja, das ist ein Fehler, Danke für den Hinweis.

    +gjm+ schrieb:

    Lade das Floppy-Image mal irgendwo hoch. Ich will es mir mal genauer ansehen.

    Ich habe bloss meinen Dummy-Bootloader assembliert und mit dd auf die Diskette kopiert:

    dd if=boot.bin of=/dev/sdc bs=512 count=1
    

    +gjm+ schrieb:

    Aber Vorsicht bei DL=0x81! Das wird wahrscheinlich die "echte" Festplatte sein.

    Ja... das macht mir ein wenig Sorgen. Ich habe mein Laptop in letzter Zeit zig mal neugestartet, weiss nicht, ob's für die Hardware so gut ist... 😃


  • Mod

    Ich habe mein Laptop in letzter Zeit zig mal neugestartet

    Vielleicht kann Bochs oder andere Emu-Software helfen, die HW zu schonen. Ich habe manchmal auch das Gefühl, dass ich mein Floppy-LW schon geschrottet habe, wenn es das Schreiben verweigert und nur noch rumstottert. 🙄

    Werde es noch mal mit dem Stage1 BL von Erhard ausprobieren.

    Sollte eigentlich gehen.



  • Erhard Henkes schrieb:

    Werde es noch mal mit dem Stage1 BL von Erhard ausprobieren.

    Sollte eigentlich gehen.

    Nein, geht nicht.
    Habe eine Diskette vorbereitet, hier mein Makefile:

    PRETTYOS_SRC = /home/abc.w/PrettyOS_106
    FLOPPY_DEVICE = /dev/sdc
    
    all:
    	mkfs.msdos -F 12 -v -I $(FLOPPY_DEVICE)
    	mount $(FLOPPY_DEVICE) /mnt -v
    	cp $(PRETTYOS_SRC)/_stage2_bootloader/BOOT2.SYS /mnt -v
    	cp $(PRETTYOS_SRC)/kernel/ckernel.sys /mnt -v
    	umount /mnt -v
    	dd if=$(PRETTYOS_SRC)/_stage1_bootloader/boot.bin of=$(FLOPPY_DEVICE) bs=512 count=1
    	eject $(FLOPPY_DEVICE)
    

    Hier die Ausgabe beim Ausführen des Makefiles:

    -F 12 -v -I /dev/sdc
    mkfs.msdos 3.0.2 (28 Feb 2009)
    /dev/sdc has 1 head and 3 sectors per track,
    logical sector size is 512,
    using 0xf8 media descriptor, with 2880 sectors;
    file system has 2 12-bit FATs and 4 sectors per cluster.
    FAT size is 3 sectors, and provides 710 clusters.
    Root directory contains 512 slots.
    Volume ID is 8d70e057, no volume label.
    mount /dev/sdc /mnt -v
    mount: Es wurde kein Dateisystemtyp für /dev/sdc angegeben
    Werde den Typ vfat versuchen
    /dev/sdc on /mnt type vfat (rw)
    cp /home/abc.w/PrettyOS_106/_stage2_bootloader/BOOT2.SYS /mnt -v
    »/home/abc.w/PrettyOS_106/_stage2_bootloader/BOOT2.SYS« ->
    »/mnt/BOOT2.SYS«
    cp /home/abc.w/PrettyOS_106/kernel/ckernel.sys /mnt -v
    »/home/abc.w/PrettyOS_106/kernel/ckernel.sys« -> »/mnt/ckernel.sys«
    umount /mnt -v
    /dev/sdc ausgehängt
    dd if=/home/abc.w/PrettyOS_106/_stage1_bootloader/boot.bin of=/dev/sdc bs=512 count=1
    1+0 Datensätze ein
    1+0 Datensätze aus
    512 Bytes (512 😎 kopiert, 0,44804 s, 1,1 kB/s
    eject /dev/sdc

    Mit GRUB (wie vorhin gepostet) vom USB-Diskettenlaufwerk gestartet. Bekomme die Ausgabe:

    Loading Second Stage Bootloader
    **************
    BOOT2.SYS MISSING



  • Jetzt bootet es! 👍
    Es war mein Fehler. Hier das geänderte Makefile:

    PRETTYOS_SRC = /home/abc.w/PrettyOS_106
    FLOPPY_DEVICE = /dev/sdc
    
    all:
    	mkfs.msdos -F 12 -v -I $(FLOPPY_DEVICE)
    	dd if=$(PRETTYOS_SRC)/_stage1_bootloader/boot.bin of=$(FLOPPY_DEVICE) bs=512 count=1
    	mount $(FLOPPY_DEVICE) /mnt -v
    	cp $(PRETTYOS_SRC)/_stage2_bootloader/BOOT2.SYS /mnt -v
    	cp $(PRETTYOS_SRC)/kernel/ckernel.sys /mnt -v
    	ls -l /mnt/BOOT2.SYS
    	ls -l /mnt/ckernel.sys
    	umount /mnt -v
    	eject $(FLOPPY_DEVICE)
    

    Hier die Ausgabe bei der Abarbeitung des Makefiles:

    mkfs.msdos -F 12 -v -I /dev/sdc
    mkfs.msdos 3.0.2 (28 Feb 2009)
    /dev/sdc has 1 head and 3 sectors per track,
    logical sector size is 512,
    using 0xf8 media descriptor, with 2880 sectors;
    file system has 2 12-bit FATs and 4 sectors per cluster.
    FAT size is 3 sectors, and provides 710 clusters.
    Root directory contains 512 slots.
    Volume ID is f6235fac, no volume label.
    dd if=/home/abc.w/PrettyOS_106/_stage1_bootloader/boot.bin of=/dev/sdc bs=512 count=1
    1+0 DatensÀtze ein
    1+0 DatensÀtze aus
    512 Bytes (512 B) kopiert, 0,029063 s, 17,6 kB/s
    mount /dev/sdc /mnt -v
    mount: Es wurde kein Dateisystemtyp fÃŒr /dev/sdc angegeben
           Werde den Typ vfat versuchen
    /dev/sdc on /mnt type vfat (rw)
    cp /home/abc.w/PrettyOS_106/_stage2_bootloader/BOOT2.SYS /mnt -v
    »/home/abc.w/PrettyOS_106/_stage2_bootloader/BOOT2.SYS« -> »/mnt/BOOT2.SYS«
    cp /home/abc.w/PrettyOS_106/kernel/ckernel.sys /mnt -v
    »/home/abc.w/PrettyOS_106/kernel/ckernel.sys« -> »/mnt/ckernel.sys«
    ls -l /mnt/BOOT2.SYS
    -rwxr-xr-x 1 root root 912 11. Okt 15:53 /mnt/BOOT2.SYS
    ls -l /mnt/ckernel.sys
    -rwxr-xr-x 1 root root 34036 11. Okt 15:53 /mnt/ckernel.sys
    umount /mnt -v
    /dev/sdc ausgehängt
    eject /dev/sdc
    

    Und das ist die Ausgabe von PrettyOS:

    PrettyOS [Version 0.1.0106] (C) 2009 henkessoft.de
    Usable RAM: 1047608 KB
    RAM Disk at: 4008100Ch
    DEBUG ckernel.c: after flpydsk_set_working_drive(0)
    

    👍


Anmelden zum Antworten