Kein OS



  • Hi,

    habe eine PC der kein OS hat. Er fährt zwar ganz normal hoch, es kommt aber dann die Meldung "kein Betriebssystem". Was müsste ich nun machen, dass ein ganz einfaches Hello World Prog in C von der Diskette aus gestartet und ausgeführt wird?

    Bin um jede Antwort dankbar

    CU Rufus



  • Wenn Du einen zweiten Rechner mit Linux besitzt, kannst Du Dir hier ein Mini-OS (Bootlader, Mini-Kernel) basteln, das eine Ausgabe Deiner Wahl erzeugt:
    http://www.ysgnet.com/art/toyos_1.html
    http://www.ysgnet.com/art/toyos_2.html

    Viel Spass! 🙂



  • Anmerkung: Ist allerdings Assembler (Eigentliches Programm liegt im zweiten 512-Byte-Sektor der Diskette.

    Wenn Du unbedingt ein aus C kompiliertes Programm zum Laufen bringen willst, kannst Du vielleicht eine einfache DOS-Systemdiskette erzeugen und Deine hallo.exe per autoexec.bat darauf starten lassen.



  • ich verschieb das mal in das Assembler Forum

    lies dort am besten mal die FAQ



  • so hallo erstmal..

    öhm also ich bin mal die beiden tuts durchgegangen über den bootloader fürs
    mini-os 😉

    aber ich hab da gewisse probs, das c programm auch für windows zu coden..
    und zwar häng ich im moment an dem
    floppy_desc = open("/dev/fd0", O_RDWR);

    ich habs erst mit floppy_desc = open("a:", O_RDWR); probiert, aber da bekomm
    ich keinen zugriff bzw.: perror -> permission denied !

    kennt jemand eine möglichkeit unter windows auf das raw floppy zuzugreifen ?

    dann hab ich mir den asm code für den bootloader für tasm umgeschrieben...
    nur ich wusste nicht , wie ich das jmpi 0, #0x500 schreiben sollte ..
    ich habs mal mit
    mov ax, 500h
    jmp ax:0

    gelassen, geht das so ??? 🙄 🙄
    hab noch nich viel erfahrung mit asm ...

    und ich versteh das richtig, dass der bootloader den kompletten code des 2ten sectors in location 500h hineinkopiert ?
    hmm wie isses dann eigentlich bei einem festplattenbootloader wie GRUB z.b. ?
    er kann doch unmöglich das ganze os ins ram kopieren , oder ? 🙄

    mfg haMMer



  • Original erstellt von Hammer:
    hmm wie isses dann eigentlich bei einem festplattenbootloader wie GRUB z.b. ?
    er kann doch unmöglich das ganze os ins ram kopieren , oder ? 🙄

    Wieso? Ein normaler Kernel ist keine 3MB groß, meistens wesentlich kleiner. Den kann man wunderbar in den RAM kloppen 🙂



  • Original erstellt von Hammer:
    **kennt jemand eine möglichkeit unter windows auf das raw floppy zuzugreifen ?
    **

    Ich kenne keine in C. Aber es gibt reichlich tools, die dir ein Floppy-Image auf eine Diskette bringen. Alternativ kannst du natürlich auch für die Tests ein Floppy-Image bauen und das in einen Emulator wie Bochs schmeißen

    **
    dann hab ich mir den asm code für den bootloader für tasm umgeschrieben...
    nur ich wusste nicht , wie ich das jmpi 0, #0x500 schreiben sollte ..
    ich habs mal mit
    mov ax, 500h
    jmp ax:0
    **

    Nimm besser jmp 0x500:0 🙂 (oder wars andersrum? 🙄)



  • http://www.linuxgazette.com/issue82/raghu.html

    ist auch eine Möglichkeit (Teil 3 von oben).

    Dort wird NASM (ist am weitesten verbreitet) verwendet. Kann man kostenlos downloaden:
    http://sourceforge.net/project/showfiles.php?group_id=6208



  • nochmal ne verständnisfrage :

    ein bootloader lädt den kernel eines os in den RAM. Ab dem zeitpunkt
    wird jedes nächste programm, welches ausgeführt wird , vom kernel selbst
    in den Hauptspeicher kopiert ... d.h. wenn ich unter dos oder windows z.b. eine
    .exe ausführe, übernimmt das der kernel, was am anfang der bootloader gemacht hat...

    so.. aber der bootloader ansich is ja auch n stück code, der aber vom bootdevice
    (floppy, hd .. etc.) ausgeführt wurde, ohne ihn vorher ins RAM kopiert zu haben ..
    bedeuted, es wäre doch auch möglich den ganzen kernel direkt auszuführen, ohne
    einen bootloader zu verwenden..
    d.h. so wie es z.b. im tut part 1 erklärt wird, nur in dem falle von der festplatte

    warum macht man das nicht so ?
    was ist der grund , dass jedes programm ins ram kopiert wird ?

    mfg haMMer



  • Original erstellt von Hammer:
    **ein bootloader lädt den kernel eines os in den RAM. Ab dem zeitpunkt
    wird jedes nächste programm, welches ausgeführt wird , vom kernel selbst
    in den Hauptspeicher kopiert ... d.h. wenn ich unter dos oder windows z.b. eine
    .exe ausführe, übernimmt das der kernel, was am anfang der bootloader gemacht hat...
    **

    In gewissem Sinne ja. Der Kernel tut aber viel mehr, er stellt Dienste zur Verfügung, damit das Programm mit dme Benutzer oder der Hardware interagieren kann.

    **
    so.. aber der bootloader ansich is ja auch n stück code, der aber vom bootdevice
    (floppy, hd .. etc.) ausgeführt wurde, ohne ihn vorher ins RAM kopiert zu haben ..
    bedeuted, es wäre doch auch möglich den ganzen kernel direkt auszuführen, ohne
    einen bootloader zu verwenden..
    d.h. so wie es z.b. im tut part 1 erklärt wird, nur in dem falle von der festplatte

    warum macht man das nicht so ?
    **

    Der Bootloadre darf maximal 512 Bytes groß sein. Ein Kernel passt da nicht rein. Ein Mini-Programm, welches den Kernel lädt schon.

    **
    was ist der grund , dass jedes programm ins ram kopiert wird ?
    **

    Ganz einfach, die CPU führt Code aus dem RAM aus und nicht von der Festplatte oder sonstwo. Dann wäre die CPU auch viel zu speziell. Im übrigen währe eine Ausführungsgeschwindigkeit direkt von Platt GRAUSIG.



  • aaaaah!, jetz hab ichs.. klar und das verschieben des codes vom bootsector in 7C00h, das übernimmt das BIOS richtig ? 🙂

    finds kagge , dass sowas nicht in jedem tut oder einsteigerbuch erläutert wird ( sowas sollte normalerweise jeder Programmierer, auch anfänger, erlernt bekommen ohne groß 100 leute zu befragen )

    [ Dieser Beitrag wurde am 06.05.2003 um 22:23 Uhr von Hammer editiert. ]



  • Original erstellt von Hammer:
    **aaaaah!, jetz hab ichs.. klar und das verschieben des codes vom bootsector in 7C00h, das übernimmt das BIOS richtig ? 🙂
    **

    Ganz genau 🙂

    **
    finds kagge , dass sowas nicht in jedem tut oder einsteigerbuch erläutert wird ( sowas sollte normalerweise jeder Programmierer, auch anfänger, erlernt bekommen ohne groß 100 leute zu befragen )
    **

    Naja, Einsteiger beschöftigen sich nicht gerade mit Betriebssystemen und Bootsektoren 🙂



  • Ich hab' mal im bin-Ordner meines djgpp gekuckt und da die dateien as.exe und ld.exe gefunden. Sind das äquivalente zu as86 bzw. ld86???



  • as86 boot.s -o boot.o
    ld86 -d boot.o -o boot

    sind die typischen befehle. as und ld klingt also nicht schlecht. Ich würde aber NASM empfehlen. Einfach ausprobieren. 🙂



  • Original erstellt von Erhard Henkes:
    sind die typischen befehle. as und ld klingt also nicht schlecht. Ich würde aber NASM empfehlen. Einfach ausprobieren. 🙂

    Den LD brauchst aber trotzdem noch 🙂



  • Also, die as bzw. ld vom gcc/djgpp sind falsch. Aber hier gibt's den richtigen zum Download (der bin86). Is' für Linux, meistens gibt's den aber auch schon bei der Distribution gleich mit. Bei mir (Mandrake) war jedoch nur der gcc dabei. Unter Windows schätze ich geht der aber nicht.

    Eine Frage habe ich jetzt aber noch: Wenn ich den Bootloader nun um folgende Zeilen erweitere:

    entry start
    start:
          mov ax,#0xb800
          mov es,ax
          seg es
          mov [0],#0x41
          seg es
          mov [1],#0x1f
    ;ab hier ist neu
          mov ax,09h
          mov dx,offset HelloW
          INT 21h
    loop1: jmp loop1            ;das war schon
    HelloW db 'Hello World !!','$'
    

    ...kommen beim Übersetzen eine Menge Fehlermeldungen. Woran liegt das??? Und wie kann ich da ein einfaches Hello World draus machen???



  • Bein NASM gibt es kein offset. Einfach weglassen. Damit ein Zeiger auf einen String gefunden wird, muss man am Anfang org xxx angeben. xxx ist die Speicheradresse, an die das Programm geladen wurde.



  • Wir reden doch gar nicht von NASM sondern von as86! Aber vermutlich kennt der das auch nicht...




Anmelden zum Antworten