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. sorryMacht 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 überhauptWenn 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 EndeDazwischen 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. ]