Frägchen



  • ups, hab statt neues thema beim andern thread genatwortet. sorry
    nu denn:
    hab ein kleinen bootloader u nen "kernel" in einem binary (sector 1 u 2 von ner floppy). nu will ich eine binary aus sektor 3 laden, u an de anfang jmp'en. (bzw call'en, wenn das geht)
    nu frag ich: wie muss ich das in den kernel einbauen (sektor laden is ni das problem...), btw mit nasm
    geht dat überhaupt
    u auf win98 schreib ich mit debug boot.bin / -w 100 0 0 2 den bootsektor und de kernel auf die floppy, und mit debug lib.bin / -w 100 0 2 1 das zweite binary
    ist dat richtig?
    hölp ich will nur ma richtig nur mit bios isrs proggen...



  • Original erstellt von <ups - *frägchen*>:
    ups, hab statt neues thema beim andern thread genatwortet. sorry

    Macht nichts, habs geloescht 🙂

    Original erstellt von <ups - *frägchen*>:
    ...u an de anfang jmp'en. (bzw call'en, wenn das geht)

    Natuerlich kannst Du Dieses "Programm" in deinem OS auch mit einem call aufrufen. (nehme doch mal an, dein OS laeuft im RealMode?)
    Am Ende dieses Programms kannst Du dann mit einem ret (bzw. retf?)wieder zum Kernelcode zurueckkehren, musst halt nur darauf achten, dass dann auch die Ruecksprungaddresse entsprechend im Stack parat liegt.

    Original erstellt von <ups - *frägchen*>:
    nu frag ich: wie muss ich das in den kernel einbauen (sektor laden is ni das problem...), btw mit nasm
    geht dat überhaupt

    Wenn Du einen Teil hast, der einen Sektor von der Diskette liesst, ist doch eigentlich schon fast alles erledigt. Du hast doch fast 640KB freien Speicher... Ich weiss zwar nicht, wie dein Kernel genau aufgebaut ist, aber da wird sich doch wohl noch ein freies Fleckchen unter oder ueber dem Kernelcode finden lassen?
    DOS ist hier vielleicht ein ganz gutes Vorbild:
    Alle Binaries, werden in ein eigenes 64Kb-Segment geladen und starten bei Offset 100h. ds, es und ss zeigen auf das gleiche Segment, wie cs und sp steht auf FFFEh. Beendet wird das Programm durch einen von DOS eingerichteten Interrupt, der gewissermassen ins Kernel zurueckspringt. Mit einem solchen Interrupt koenntest Du dir auch den Stress mit der Ruecksprungaddresse in dein Kernel sparen. 😉

    Und wieso sollte das mit NASM nicht gehen, Du konntest damit doch schliesslich schon deinen Bootsektor und Kernel compilieren 😕

    Original erstellt von <ups - *frägchen*>:
    u auf win98 schreib ich mit debug boot.bin / -w 100 0 0 2 den bootsektor und de kernel auf die floppy, und mit debug lib.bin / -w 100 0 2 1 das zweite binary
    ist dat richtig?

    Das geht mit debug? Da weiss ich nichts von, muss ich nochmal pruefen.



  • Naja, es is ja kein so tolles betriebssystem...
    ich wollte das nur ma ausprobben...
    und der Code:

    boot.asm (+kernel)
    BIOS_LIB equ 0xF100
    
    loadkernel:
        cmp dl, 27h
        je Console
    
        call floppy_prepare
    
    bios_lib_load:
        mov ax, BIOS_LIB; loads sector into memory (try ...) ;Line 131
        mov es,ax
        mov ah,2    
        mov al,1    ; loading 1 sector.
        mov dx,0
        mov cx,3    ; ch = cylinder number and cl = sector number 1-63
    
        mov bx,0h
        int 13h     ; load it!
    
        jc bios_lib_load; something went wrong... => try again :)
    
        mov si, bios_loaded
        call putstr
        call newl
    
        mov ax, BIOS_LIB    ;Enter the BIOS Library 
        mov es, ax
        mov ax, 0h
    
        mov bx, [putstr]    ;allow BIOS to put a string
        mov dx, 0x7C00      ;to the Kernel Output
    
        call [es:100h]      ;Enter it!
    
        mov si, [es:100h]
        call putstr
    
        mov si, mymsg
        call putstr
    
        call Console        ; Simple Console
    
            call Reboot
    floppy_prepare:
        push ds     ; reset disk system
        mov ax, 0   ; forces controller to recalibrate drive heads (seek to track 0)
        mov dl, [bootdrv]
        int 13h
        pop ds
        jnc floppy_ok
    floppy_failed_init:
        mov si, msgresetfail
        call putstr
    floppy_ok:
        retn
    

    So?

    PS
    Wie kann ich eine eigene ISR implementieren, so dass diese aufgerufen wird, wenn ich [int (xx)h] aufrufe?



  • der code von vorher war ein misslungen.
    ich will wissen:
    bootsec+kernel (größe: 2sektoren) sind mal geladen, dann will ich wissen, wohin ich bios.bin laden soll (welche adressen denn erlaubt) und wie das geht...
    und 2. was ich in einem jmp/call aufruf eingeben soll - [abc:123] wirds kaum sein.



  • Der restliche Code (Bootsektor und Kernel) ist dann nicht von dir? Hast Du ihn dir denn ueberhaupt schonmal genauer angeschaut? 🙄
    Kommt mir irgendwie ein bissel komisch vor: Ein Bootsektor schreiben, der 2 Sektoren in den Speicher laedt, diese aufrufen etc. und nun hakts auf einmal?
    Egal.
    Die Speichereinteilung sieht beim Booten wie folgt aus:
    Die Interrupttabelle geht von 00000 bis 00400. Dort liegen von Int 00 bis Int 255 Far Pointer zu Interrupt handlers im Speicher. Folglich waere es denkbar unguenstig, dort ausfuehrbaren Code hinzuladen.
    Dahinter legt das BIOS noch weitere Informationen ueber verfuegbaren Speicher, Grafikhardware, Tastaturpuffer u.ae. ab. Man koennte also sagen, dass der Speicher bis 00540 unbenutzbar ist.
    Der Bootstrap wird nach 07C00 geladen, der sollte sich auch nicht selbst ueberschreiben. Ab A0000 faengt der Speicherbereich der Grafikkarte an. Der geht bis C0000. Da hinter sind meist shadows vom BIOS o.ae. also auch Tabu.
    Folgende Speicherbereiche sind also belegt:
    00000 bis 00540
    07C00 bis 07E00
    A0000 bis Ende

    Dazwischen ist alles frei. (Beispiel 0800:0000 :D)
    Wohin Du nun deine Binaries genau laden sollst, kann ich dir nicht sagen, da solltest Du dir selbst drueber gedanken machen, ist schliesslich dein System.

    Und um ein in den Speicher geladenes Programm zu starten, springst Du am besten zu der Addresse, zu der Du es geladen hast 😮

    Hab mal versucht deinen code ein bissel umzumoebeln... (nicht getestet - wie auch)

    boot.asm (+kernel)
    ;BIOS_LIB equ 0xF100 ;wo sollte das denn landen, bei deaktivierter A20?
    ;Was soll dieses BIOS_LIB ueberhaupt sein?
    BIOS_LIB equ 0x0800 ;hoffentlich wird dabei nichts vom Kernel ueberschrieben?
    
    loadkernel:
        cmp dl, 27h
        je Console
    
        call floppy_prepare
    
    bios_lib_load:
        mov ax, BIOS_LIB; loads sector into memory (try ...) ;Line 131
        mov es,ax
        mov ah,2    
        mov al,1    ; loading 1 sector.
        mov dx,0    ;hier wird dx auf 0 gesetzt und in Floppyprepare nach einer
    ;Variable*???*
        mov cx,3    ; ch = cylinder number and cl = sector number 1-63
    
        mov bx,0h
        int 13h     ; load it!
    
        jc bios_lib_load; something went wrong... => try again :)
    
        mov si, bios_loaded
        call putstr
        call newl
    
        ;mov ax, BIOS_LIB    ;Enter the BIOS Library 
        ;mov es, ax ;wenn es in "putstr" und "newl" nicht geaendert wird,
        ;muss es hier nicht nochmal gesetzt werden.
        mov ax, 0h
    
        mov bx, [putstr]    ;allow BIOS to put a string     ;????
        mov dx, 0x7C00      ;to the Kernel Output
    
        call [es:100h]      ;Enter it!
    ;Du hast deinen code nach Offset 0 geladen. startet er dann im binarie auch
    ;wirklich bei offset 100h?? Sonst entweder den call hier aendern, oder
    ;den Sektor ans entsprechende Offset laden!
    
        mov si, [es:100h]
        call putstr ;????
    
        mov si, mymsg
        call putstr
    
        call Console        ; Simple Console
    
            call Reboot
    floppy_prepare:
        push ds     ; reset disk system
        mov ax, 0   ; forces controller to recalibrate drive heads (seek to track 0)
        mov dl, [bootdrv]
        int 13h
        pop ds
        jnc floppy_ok
    floppy_failed_init:
        mov si, msgresetfail
        call putstr
    floppy_ok:
        retn
    

    [ Dieser Beitrag wurde am 09.11.2002 um 00:33 Uhr von Nobuo T editiert. ]


Anmelden zum Antworten