Ein eigenes kleines Betriebssystem



  • Nobuo T schrieb:

    mov ax,0x1000  ; wow, ein paar gueltige Mnemonics...
    

    musst du auch noch salz in die wunde streuen? 😛



  • Ok, ich habe verstanden, dass ich keine Ahnung habe. Aber könnte jetzt mal jemand auch noch einen funktiniernden Code posten? Bitte! Ich wäre euch sehr dankbar!



  • Da hast du:

    org 0x7C00
    
    start: 
    mov ax, 0x9000       ; Adresse des Stack speichern
    mov ss, ax           ; Stackadresse festlegen
    mov sp, 0            ; Stackpointer auf 0 setzen
    mov [bootdriv], dl
    call load
    mov ax, 0x1000       ; 0x1000 ist die Speicheradresse unserer Shell
    mov es, ax
    mov ds, ax
    push ax
    mov ax, 0
    push ax
    retf
    
    bootdriv db 0         ; Das Bootlaufwerk  
    loadmsg db "Lade VitaXia...",13,10,0
    
    ; Mit dieser Funktion geben wir einen String aus
    putstr:
    lodsb
    or al,al
    jz short putstrd
    mov ah,0x0E
    mov bx,0x0007
    int 0x10
    jmp putstr
    putstrd:
    retn 
    
    ; Mit dieser Funktion laden wir unsere Shell vom Bootlaufwerk
    load:
    push ds
    mov ax, 0
    mov dl, [bootdriv]
    int 13h
    pop ds
    jc load
    
    load1:
    mov ax,0x1000
    mov es,ax
    mov bx, 0
    mov ah, 2
    mov al, 5
    mov cx, 2
    mov dx, 0
    int 13h
    jc load1
    mov si,loadmsg 
    call putstr
    retn
    
    times 512-($-$$)-2 db 0
    dw 0AA55h
    

    c&p aus deinem Tutorial - hab ich nicht getestet, sieht aber so weit ok aus.
    Und nun? 😕



  • Und wo verweißt dieser Code jetzt auf Sektor 5 der Diskette?



  • mov al, 5
    


  • Werde es später ausprobieren, berichte aber heute noch ob es geklaptt hat...



  • cpp_1 schrieb:

    Und wo verweißt dieser Code jetzt auf Sektor 5 der Diskette?

    Nirgendwo. Warum(,) sollte er das denn?

    na hier! schrieb:

    mov al, 5
    

    Falsch. Wie ich schon schrieb, erwartet int 13h, Funktion 2 in al die Anzahl der zu lesenden Sektoren.

    cpp_1 schrieb:

    Werde es später ausprobieren, berichte aber heute noch ob es geklaptt hat...

    Sei dir dabei aber bewusst, dass der Code so allein ohne die im Tutorium erwaehnte Shell nach dem Laden crasht.



  • Ja, muss er denn um das geht es ja in diesem Threath!

    Edit: Zumindest ab meinem 2. Beitrag 🙄



  • Dann schreib doch bitte mal genau hin, was du eigentlich hier willst.

    So wie ich das sehe, suchst du also nur jemanden, der dir ein Disketten Bootsektorprogramm in NASM hier hinpostet, das den Sektor der Diskette bei 0:0:5 ausliest, irgendwo in den Speicher haut und dort hin springt. Praktisch waere das also mit je der kleinen Modifikation einer Zahl in 2 Zeilen der "load"-Prozedur des zuletzt geposteten Programms zu loesen. 🙄

    ...

    Keine Ahnung, ob du wirklich nicht faehig, oder aus irgendwelchen Gruenden einfach nicht willens bist, diese mit den ganzen gegebenen Hinweisen und der Investition eines kleinen Bisschens Ueberlegung IMHO durchaus leicht machbare Aufgabe selbst zu bewaeltigen. So wirkt es zumindest auf mich, als waerst du nicht im Geringsten daran interessiert, etwas zu lernen, sondern wuerdest einfach nur einen Dummen suchen, der fuer dich coded. Da habe ich auf jeden Fall besseres zu tun. 😉



  • Nicht direkt. Denn "Learning by Doing". Schon klar dass ich einen brauche, der mir einen Code poste, für den Bootloader. Aber wenn ich sehe, wie das gemacht ist, leuchtet mir oft ein Licht auf und weiß es beim nächsten Mal. Entschuligung wenn du damit deine Zeit vergeudest. Aber wenn das so wäre, würde ich mir gleich den GRUB Bootloader herunterladen - wäre doch viel einfacher. Ich zwinge aber niemanden hier etwas zu posten! 😉



  • cpp_1 schrieb:

    Nicht direkt. Denn "Learning by Doing".

    Dazu versuche ich dich doch die ganze Zeit zu animieren. Was du willst, waere dann wohl eher "Learning by making someone else do your job." 😃

    cpp_1 schrieb:

    Aber wenn ich sehe, wie das gemacht ist, leuchtet mir oft ein Licht auf und weiß es beim nächsten Mal.

    Aha... Du willst also nicht lernen, wie ein Bootloader funktioniert, sondern wie du diesen Bootloader so modifizieren kannst, dass er mal diese und mal jene Sektoren von Diskette liest...? Halte ich fuer keine so sinnvolle Aktion...
    Sonst faellt es mir schwer, deine Vorstellung von Lernen nachzuvollziehen...



  • Wenn du Wirklich ein OS Programmieren willst, musst du deine Einstellung etwas ändern. Einen Sektor von einer Diskette laden, kann jeder, und macht jeder. Aber wenn es um die GDT und IDT geht, bist du im Prinzip auf dich alleine gestellt!
    Und spätestens danach ist dein Kernel so "speziell" dass einem kaum noch fertiger Code hilft.
    Du wirst 1000 mal an einem Punkt kommen, wo dir NIEMAND helfen kann! Also musst du Wissen/Lernen, wie du dir selber helfen kannst, indem du Tutorials liest (die übrigens idr. in Englisch sind).

    Einen guten Einstieg in die Thematik findest du im wiki von "LowLevel" (ausnahmsweise etwas in Deutsch 😉 )
    Eine weitere gute Community ist OSDev.org



  • Ja, ich weiß, dass ich nicht immer fertigen Code anfordern kann, aber wie gestagt, mein OS ist in C/C++ geschrieben, was ich in bisschen besser beherrsche. Was ich nicht verstehe ist:

    Also al = 1 (number of sectors to read (must be nonzero))
    CH = 0 (low eight bits of cylinder number)
    CL = 5 (sector number 1-63 (bits 0-5) high two bits of cylinder (bits 6-7, hard disk only))
    DH = 0 (head number)
    DL = 0 (1st FDD - drive number (bit 7 set for hard disk))
    ES:BX -> data buffer (wo auch immer du es hinhaben moechtest - sinnvoll waere idR. eine Adresse irgendwo zwischen 0x08000 (darunter liegt zT. BIOS-Zeug und die IVT) und 0xA0000 (ab hier startet die VGA).

    hast du geschrieben. Aber im Fertigen Code:

    load1:
    mov ax,0x1000
    mov es,ax
    mov bx, 0
    mov ah, 2
    mov al, 5
    mov cx, 2
    mov dx, 0
    int 13h
    jc load1
    mov si,loadmsg
    call putstr
    retn

    steht z.B. nichts von CL. 😕



  • Dann schau dir mal an, wie beim x86 die Register aufgebaut sind:
    zB. Hier fuer die 16Bit-Register:
    http://andremueller.gmxhome.de/cpu.html#allgreg
    oder auch hier ein eigener Beitrag in den FAQ:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-38545-and-postdays-is-0-and-postorder-is-asc-and-start-is-0.html

    Um die beiden Zitate, die du gebracht hast, zusammenzufassen:

    load1:
    mov ax,0x1000
    mov es,ax     ; fuer "ES:BX -> Zeiger auf data buffer" wird ax nach es kopiert.
    mov bx, 0     ; und bx wird 0 gesetzt. => es:bx ist also 1000:0000
    mov ah, 2     ; ah = 2
    mov al, 5     ; al = 5
    ; die 2 Zeilen hier drueber koennte man zB. auch schreiben als mov ax, 0x0205
    ; waere in jedem Fall effizienter.
    mov cx, 2     ; hier wird cx = 2 gesetzt => cl = 2; ch = 0
    mov dx, 0     ; dx = 0 => dl = 0; dh = 0
    int 13h
    jc load1
    mov si,loadmsg
    call putstr
    retn
    

    Klar so weit?



  • Bin jetzt das Wochenende weg, melde mich spter wieder...

    Edit: Habs verstanden.


Anmelden zum Antworten