Eigenes OS?


  • 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)
    

    👍



  • Sieht bei mir so aus:

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

    🙂 👍


  • Mod

    Stark! Probiert bitte mal die 105er. 🙂
    http://www.henkessoft.de/OS_Dev/Downloads/105.zip

    @abc.w: Könntest Du das makefile bitte auch auf Windows übertragen?

    Ich habe leider keine USB-Floppy. Der Floppy-Treiber scheint nicht zu funktionieren. Kommt die Shell? Gebt bitte 'hi' ein.

    mount: Es wurde kein Dateisystemtyp für /dev/sdc angegeben
    Werde den Typ vfat versuchen

    Kann man da FAT12 eingeben für die Floppy, damit die RootDir gelesen werden kann?



  • PrettyOS [Version 0.1.0105] (C) 2009 henkessoft.de
    Usable RAM: 3931391 KB  
    RAM Disk at: 4008100Ch
    
    Floppy Driver Test!
    

    Bleibt dann hängen. Keine weitere Ausgabe. Das liegt aber nicht am Bootloader. 🙂



  • Zum Thema USB Stick unter WindowsXP kann ich folgendes beitragen:

    Da mir die Seite von Erhard Henkes ein bisschen zu fortgeschritten ist,
    habe ich erstmal diesen Bootrecord
    http://lowlevel.brainsware.org/wiki/index.php/Eigener_Boot_Record
    mit dem NASM Assembler als bootrecord.bin assembliert.

    Mit dem HP USB Disk Storage Format Tool
    http://www.chip.de/downloads/HP-USB-Disk-Storage-Format-Tool_23418669.html
    habe ich nen asbachuralt 64MB USB Stick mit dem FAT Dateisystem formatiert.

    Mit dem Hexeditor
    http://wintotal.de/softw/index.php?id=2286
    konnte ich unter Datei/Datenträger/Datenträger öffnen den USB-Stick öffnen, ebenso
    die Datei bootrecord.bin.

    Dann einfach per Copy and Paste den Bootrecord Salat in den USB-Stick Salat reinkopiert,
    den USB Stick salat gespeichert.

    Der USB-Stick ließ sich anschließend in der Tat booten, was mir die folgenden
    Zeilen am Monitor nach einem Neustart bestätigten:

    HELLO World!
    This is no OS. Press any key to reboot.

    Das könnte für den einen oder anderen hilfreich sein, der sonst nicht weiß, wie er
    seinen Bootrecord am USB-Stick testen kann.
    Wenn nicht, einfach diesen Beitrag löschen.
    🙂


  • Mod

    Bleibt dann hängen. Keine weitere Ausgabe.

    Daher hatte ich die Version 106 geschrieben mit DEBUG-Meldungen:

    // floppy disk with DMA Buffer
        flpydsk_set_working_drive(0); // set drive 0 as current drive
    	printformat("DEBUG ckernel.c: after flpydsk_set_working_drive(0)\n");
    	sti();
    	flpydsk_install(6);           // floppy disk uses IRQ 6
        printformat("DEBUG ckernel.c: after flpydsk_install(6)\n");
    	k_memset((void*)DMA_BUFFER, 0x0, 0x2400);
    	printformat("DEBUG ckernel.c: after k_memset\n");
    
        tasking_install(); // ends with sti()
    

    Die Zeile "DEBUG ckernel.c: after flpydsk_set_working_drive(0)" taucht bei euch noch auf, d.h. es klemmt bei:

    flpydsk_install(6);
    

    ... in flpydsk.c:

    void flpydsk_install(int irq)
    {
    	irq_install_handler(irq, i86_flpy_irq);
    	flpydsk_initialize_dma();
    	flpydsk_reset();
    	flpydsk_drive_data(13, 1, 0xF, TRUE);
    }
    

    Dort müsste man nun weiter debuggen, wo es in der Funktion blockt. Es ist sicher ein Unterschied zwischen einer USB-Floppy und einer Floppy. Das heißt das Thema Booten und Floppy-/...-/Treiber hängt stark zusammen.



  • Erhard Henkes schrieb:

    @abc.w: Könntest Du das makefile bitte auch auf Windows übertragen?

    Ich weiß leider nicht, was wären unter Windows Alternativen für dd, mount, umount und eject...
    Linux -> Windows:
    mkfs.msdos -> format
    dd -> rawwrite ?
    mount -> ?
    cp -> copy
    ls -> dir
    umount -> ?
    eject -> ?

    Erhard Henkes schrieb:

    mount: Es wurde kein Dateisystemtyp für /dev/sdc angegeben
    Werde den Typ vfat versuchen

    Kann man da FAT12 eingeben für die Floppy, damit die RootDir gelesen werden kann?

    Die Diskette habe ich mit mkfs.msdos FAT12 formatiert (Parameter -F 12). mount benutzt vfat, weil ich es in der Konfiguration des Linux Kernels aktiviert habe und dort unter Hilfe steht:

    CONFIG_VFAT_FS:
    This option provides support for normal Windows file systems with
    long filenames. That includes non-compressed FAT-based file systems
    used by Windows 95, Windows 98, Windows NT 4.0, and the Unix
    programs from the mtools package.
    The VFAT support enlarges your kernel by about 10 KB and it only
    works if you said Y to the "DOS FAT fs support" above...


  • Mod

    Könntest Du in der 106er bitte diese ergänzte Funktion in flpydsk.c einbauen, um heraus finden, wo es bei Dir mit der USB-Floppy aussteigt:

    void flpydsk_install(int irq)
    {
        irq_install_handler(irq, i86_flpy_irq);
        printformat("DEBUG flpydsk.c: after irq_install_handler");
        flpydsk_initialize_dma();
        printformat("DEBUG flpydsk.c: after flpydsk_initialize_dma");
        flpydsk_reset();
        printformat("DEBUG flpydsk.c: after flpydsk_reset");    
        flpydsk_drive_data(13, 1, 0xF, TRUE);
        printformat("DEBUG flpydsk.c: after flpydsk_drive_data");
    }
    

    Ich tippe auf "flpydsk_drive_data" als Hemmschuh. 🙂


  • Mod

    Ich weiß leider nicht, was wären unter Windows Alternativen für dd, mount, umount und eject...
    Linux -> Windows:
    mkfs.msdos -> format
    dd -> rawwrite ?
    mount -> ?
    cp -> copy
    ls -> dir
    umount -> ?
    eject -> ?

    Anstelle rawwrite nehme ich lieber das primitive partcopy, weil ich rawwrite nicht aus dem makefile sauber ansteuern konnte. mount/unmount keine Ahnung. Format macht man vorher.



  • Erhard Henkes schrieb:

    Könntest Du in der 106er bitte diese ergänzte Funktion in flpydsk.c einbauen, um heraus finden, wo es bei Dir mit der USB-Floppy aussteigt:

    ...
    

    Kleiner Verbesserungsvorschlag zu Debug-Ausgaben: gcc kennt __FILE__ und __LINE__, z.B.:

    printformat("%s: %u", __FILE__, __LINE__);
    printformat("DEBUG %s: after irq_install_handler (line %u)", __FILE__, __LINE__);
    


  • Erhard Henkes schrieb:

    Könntest Du in der 106er bitte diese ergänzte Funktion in flpydsk.c einbauen, um heraus finden, wo es bei Dir mit der USB-Floppy aussteigt:

    void flpydsk_install(int irq)
    {
        irq_install_handler(irq, i86_flpy_irq);
        printformat("DEBUG flpydsk.c: after irq_install_handler");
        flpydsk_initialize_dma();
        printformat("DEBUG flpydsk.c: after flpydsk_initialize_dma");
        flpydsk_reset();
        printformat("DEBUG flpydsk.c: after flpydsk_reset");    
        flpydsk_drive_data(13, 1, 0xF, TRUE);
        printformat("DEBUG flpydsk.c: after flpydsk_drive_data");
    }
    

    Ich tippe auf "flpydsk_drive_data" als Hemmschuh. 🙂

    Bekomme folgende Ausgabe:

    DEBUG flpydsk.c: after irq_install_handler
    DEBUG flpydsk.c: after flpydsk_initialize_dma
    

  • Mod

    Aha! Der Reset ist also schon das Problem.

    // reset controller
    void flpydsk_reset()
    {
    	ULONG st0, cyl;
    	flpydsk_disable_controller();
    	flpydsk_enable_controller();
    	flpydsk_wait_irq();
    
    	// send CHECK_INT/SENSE INTERRUPT command to all drives
    	int i;
    	for(i=0; i<4; ++i)
    		flpydsk_check_int(&st0,&cyl);
    	flpydsk_write_ccr(0);              // transfer speed 500kb/s
    	flpydsk_drive_data(3,16,240,TRUE); // pass mechanical drive info: steprate=3ms, load time=16ms, unload time=240ms
    	flpydsk_calibrate(_CurrentDrive);  // calibrate the disk
    }
    

    Ja, da ist bereits ein flpydsk_drive_data(...) drinnen, aber auch ein flpydsk_wait_irq(). Ganz schön verschachtelt der ganze Kram. Könntest Du bitte weiter suchen?



  • Aha! Vielleicht ist ja alles ganz trivial:

    // flpydsk.c (version 105+106)
    
    // die 240 hier
    void flpydsk_reset()
    {
    (...)
     flpydsk_drive_data(3,16,240,TRUE); // pass mechanical drive info: steprate=3ms, load time=16ms, unload time=240ms
    (...)
    }
    
    // hat auf "data" keinen Einfluß: (240 & 0xF) -> 0
    void flpydsk_drive_data(ULONG stepr, ULONG loadt, ULONG unloadt, int dma )
    {
    (...)
     data = ((stepr & 0xf) << 4) | (unloadt & 0xf);
     flpydsk_send_command(data);
    (...)
    }
    

Anmelden zum Antworten