Beiträge anzeigen

Diese Sektion erlaubt es dir alle Beiträge dieses Mitglieds zu sehen. Beachte, dass du nur solche Beiträge sehen kannst, zu denen du auch Zugriffsrechte hast.


Nachrichten - Al3x

Seiten: [1]
1
OS-Design / Re: VESA VBE Framebuffer-Fehler
« am: 18. April 2010, 18:00 »
Ja, hab ich. Ich denke, dass es auch funktioniert.
enable_A20:
        pusha
        cli                                    ; Disable all irqs
        cld
        mov   al,255                           ; Mask all irqs
        out   0xa1,al
        out   0x21,al
l.5:    in    al,0x64                          ; Enable A20
        test  al,2                             ; Test the buffer full flag
        jnz   l.5                              ; Loop until buffer is empty
        mov   al,0xD1                          ; Keyboard: write to output port
        out   0x64,al                          ; Output command to keyboard
l.6:    in    al,0x64                         
        test  al,2
        jnz   l.6                              ; Wait 'till buffer is empty again
        mov   al,0xDF                          ; keyboard: set A20
        out   0x60,al                          ; Send it to the keyboard controller
        mov   cx,14h
l.7:                                           ; this is approx. a 25uS delay to wait
        out   0edh,ax                          ; for the kb controler to execute our
        loop  l.7                              ; command.
        sti
        popa
        ret   


EDIT: Ich hab mal alles hochgeladen:

http://dl.dropbox.com/u/1802708/Bild.zip
2
OS-Design / VESA VBE Framebuffer-Fehler
« am: 18. April 2010, 17:28 »
Hallo,

ich programmiere in Assembler mit fasm und bin nun im protected mode mit VESA 640*480*24 (mode 0112h). VirtualBox bestätigt mir den Modus.

1. Wieso muss man 4112h schreiben statt 0112h?

2. Wie lautet der mode für 32 bit-bit? 0129h laut http://en.wikipedia.org/wiki/VESA_BIOS_Extensions#Other_commonly_available_modes
funktioniert nicht.

3. Dies ist der Code zum schreiben von Pixeln:

Display_Pixel:

mov edi,[ModeInfo_PhysBasePtr]

mov ebx, 640 ; gewünschte Breite
mov ecx, 480 ; gewünschte Höhe

mov ax, 0xfafa ; untere 16 Bits der Farbe
mov dl, 0x00 ; obere 8 Bits der Farbe

Stapel:
push edi
push ebx

Zeile:
add edi,3
mov [edi-3],ax
mov [edi-1],dl
dec ebx
jnz Zeile    ; springt solange nach Zeile, bis letztes Rechenergebnis null ergibt/Zero Flag gesetzt ist
pop ebx
pop edi
add edi, ModeInfo_BytesPerScanLine
loop Stapel    ; zieht von ecx 1 ab; solange ecx nicht null ist, wird nach Stapel gesprungen.

ret 

Nun ist das erste Pixel, das eingefärbt wird nicht das erste oben links?/rechts?, sondern es ist mitten in der ersten Zeile (siehe http://www.abload.de/image.php?img=capture_04182010_17262vfd5.jpg ). Daraus schließe, dass ModeInfo_PhysBasePtr auf eine falsche Adresse zeigt.  :? Aber wieso?
Wenn ich nun von edi 1566 (dezimal) abziehe, ist das erste Pixel auch das oberste linke, doch die letzte Zeile wird nur zur Hälfte gefüllt, wobei das letzte Pixel blau ist.

4. Wenn ich 480 bei [3] als Höhe eingebe, wird aber nur etwa ein drittel geefärbt  :?

Ich hoffe, dass ihr mir helfen könnt.
Vielen Dank im Voraus!!!
3
Offtopic / Re: BootProg auf FAT-iso?
« am: 08. April 2010, 16:09 »
Der Kernel lädt zuerst Vesa, A20, springt dann in den Protected Mode und lädt die Bitmap, die am Ende des Kernels integriert ist.
4
Offtopic / Re: BootProg auf FAT-iso?
« am: 08. April 2010, 13:16 »
Bisher hab ich BootProg für Floppies genommen und in den ersten Sektor eines Floppy-Images kopiert. BootProg sucht dann nach dem Kernel, bestimmt seine Position und lädt ihn.

Der Kernel initialisiert Vesa 640*480*8 und beinhaltet ein Bitmap (300KB), das er dann lädt. Wenn ich aber 1024*768*32 habe, ist das Bitmap dann 2,25MB groß, weshalb es nicht auf die Diskette passt und auch nicht vom Bootloader mit dem Kernel geladen werden kann, weil der RealMode ja nur 1MB Speicher hat.  :cry:

Nun gibt es Bootprog auch für FAT16 und da dachte ich mir, dass ich dann Bootloader, Kernel und Bild auf eine FAT-Platte packe, der Bootloader den Kernel lädt und der wiederum von der Festplatte das Bild lädt und ausgibt.

Wenn ich nun das FAT-formatierte leere raw-Image öffne, erhalte ich für den MBR folgendes. Aber ich kann das doch nicht mit dem Bootloader ersetzen, da dann der Table weg ist.

Danke, dass du mir hilfst!

FA 33 C0 8E D0 BC 00 7C 8B F4 50 07 50 1F FB FC BF 00 06 B9 00 01 F2 A5 EA 1D 06 00 00 BE BE 07 B3 04 80 3C 80 74 0E 80 3C 00 75 1C 83 C6 10 FE CB 75 EF CD 18 8B 14 8B 4C 02 8B EE 83 C6 10 FE CB 74 1A 80 3C 00 74 F4 BE 8B 06 AC 3C 00 74 0B 56 BB 07 00 B4 0E CD 10 5E EB F0 EB FE BF 05 00 BB 00 7C B8 01 02 57 CD 13 5F 73 0C 33 C0 CD 13 4F 75 ED BE A3 06 EB D3 BE C2 06 BF FE 7D 81 3D 55 AA 75 C7 8B F5 EA 00 7C 00 00 49 6E 76 61 6C 69 64 20 70 61 72 74 69 74 69 6F 6E 20 74 61 62 6C 65 00 45 72 72 6F 72 20 6C 6F 61 64 69 6E 67 20 6F 70 65 72 61 74 69 6E 67 20 73 79 73 74 65 6D 00 4D 69 73 73 69 6E 67 20 6F 70 65 72 61 74 69 6E 67 20 73 79 73 74 65 6D 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 01 01 00 06 0F 3F C9 3F 00 00 00 21 1B 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 AA
5
Offtopic / Re: BootProg auf FAT-iso?
« am: 08. April 2010, 11:03 »
Aha, ich habe gar nicht daran gedacht eine Bootdiskette zu benutzen  :roll:
Nun hab ich irgendein (vhd, vdi, raw, vm2) Festplattenimage erstellt und per Bootdiskette formatiert. Danke, Svenska!

Doch wie bringe ich nun Dateien in das Image? Und wie schreibe ich den Bootloader (der als .bin vorliegt) auf die Platte.

Mein Ansatz wäre per Windows-Live-System zu booten und die Daten rüberzuschieben. Doch das ist ziemlich umständlich. Gibt es denn nicht ein Programm, das direkt aus dem Host-Betriebssystem auf das Image zugreifen kann? Ich habe nur Disk2VHD gefunden, das die gesamte Partition in vhd umwandelt. Und wie schreibe ich den Bootsektor?
6
Offtopic / BootProg auf FAT-iso?
« am: 07. April 2010, 20:48 »
Hallo,

weil in meinen Kernel Bilder integriert sind, passt er nicht mehr auf eine Diskette. Also hab ich mir BootProg für FAT16 geholt und kompiliert, aber
nun möchte ich das nicht auf eine echte Festplatte kopieren, sondern auf ein Image (iso ist da doch richtig, oder?), weil ich das OS per VirtualBox emulieren möchte.

Doch wie erstelle ich ein FAT-Festplattenimage, auf dessen ersten Sektor der Bootloader sitzt?  :?

Wisst ihr dazu Rat?
Vielen Dank für evt. Hilfe!!
7
Das Wiki / Re: Bootloader: 2.Sektor laden
« am: 05. April 2010, 19:31 »
Ah, danke, ich hab Segment und Sektor vertauscht  :roll:
8
Das Wiki / Re: Bootloader: 2.Sektor laden
« am: 05. April 2010, 19:13 »
Ich hab es jetzt geändert, doch es ändert nichts am Problem. Auch wenn ich anstatt "Hello World" die ursprüngliche Nachricht ausgeben will, passiert nichts.
9
Das Wiki / Bootloader: 2.Sektor laden
« am: 05. April 2010, 18:31 »
Hallo,
ich bin neu in diesem Forum und möchte etwas mehr über das Programmieren von Betreibssystemen wissen, kenne mich aber mit Assembler relativ gut aus.

Nun wollte ich zum besseren Verständnis von Betriebssystemen einen Bootlader schreiben, der den 2. Sektor von Diskette nachlädt und einen String, der sich in diesem 2. Sektor befindet, ausgibt. Ich habe zuerst den Code von http://wiki.osdev.org/Babystep2 übernommen, der einen String ausgibt.
Das funktioniert auch perfekt, aber wenn ich nun per int10 den 2. Sektor von der Diskette lade und den String dort ausgeben will, passiert nichts.

Ich denke, der Fehler liegt vlt daran, dass ich nicht so richtig verstanden habe, was mit dem Datensegment (mov ds, ax) gemacht wird und wann das ausgeführt werden soll.

Soll der Code vom Kernel/2. Sektor hinter den Bootlader geladen werden?
Wenn nein, was ist die beste Stelle?
Muss ich irgendwie das Datensegment updaten? oder springen?
Ich darf doch später per include einfach den Kernel an den ersten Sektor hängen?

Vielen Dank für eure Hilfe!!!
Viele Grüße

Alex

[BITS 16]
[ORG 0x7c00]

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   xor ax, ax  ;make it zero
   mov ds, ax

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
   mov si, msg
   call bios_print
   
   call LoadKern     ; NEU
   mov si, msg2     ; NEU
   call bios_print    ; NEU
 
hang:
   jmp hang
 
msg   db 'Welcome to Macintosh', 13, 10, 0
 
bios_print:
   lodsb
   or al, al  ;zero=end of str
   jz done    ;get out
   mov ah, 0x0E
   int 0x10
   jmp bios_print
done:
   ret

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; Load kernel procedure          ; NEU
LoadKern:
        mov ah, 0x02    ; Read Disk Sectors
        mov al, 0x01    ; Read one sector only (512 bytes per sector)
        mov ch, 0x00    ; Track 0
        mov cl, 0x02    ; Sector 2
        mov dh, 0x00    ; Head 0
        mov dl, 0x00    ; Drive 0 (Floppy 1) (This can be replaced with the value in BootDrv)
        mov bx, 0x7E00  ; Segment 0x7E00
        mov es, bx      ;  again remember segments bust be loaded from non immediate data
        mov bx, 0x0000  ; Start of segment - offset value

        int 0x13        ; Call BIOS Read Disk Sectors function
        ret
     

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
   times 510-($-$$) db 0
   db 0x55
   db 0xAA
   msg2   db 'Hello World!', 13, 10, 0       ; NEU
   times 1024-($-$$) db 0                         ; NEU
Seiten: [1]

Einloggen