Ein eigenes kleines Betriebssystem
-
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
retnsteht 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.htmlUm 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.