Autor Thema: int 10 geht nicht?  (Gelesen 5699 mal)

satyria

  • Beiträge: 8
    • Profil anzeigen
Gespeichert
« am: 26. March 2010, 17:29 »
Hallo

Nachdem ich es endlich geschafft habe, dass ich einen Kernel unter nasm und Grub zum laufen gebracht habe, kommt nun eine neue Frage auf. Ist INT 10 nicht verfügbar? Ist es nicht eine BIOS-Funktion, die eigentlich gehen müsste?

Hier mein Code, den ich mit NASM kompiliere:

[Bits 32]
global _start

_mbh:
dd 0x1BADB002
dd 0x00010000
dd 0xE4514FFE
dd 0x00100000 + _mbh
dd 0x00100000
dd 0x00100000 + _end
dd 0x00100000 + _end
dd 0x00100000 + _start

_start:
jmp start

msg db 10,'mein Kernel!!!!!!!!!!!!!',13,10,0

start:

mov si, msg
call print_string

ende:
jmp ende

print_string:
mov ah, 0x0E

.loop_start:
lodsb
test al, al
jz .done
int 0x10
jmp .loop_start

.done:
ret

_end:

Als Ergebnis passiert nichts.  :cry:

Gruß, Satyria

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 26. March 2010, 17:45 »
Hi,

GRUB schaltet die CPU in den Protected Mode, und die BIOS Funktionen sind nur im Real Mode verfügbar. Also ja, Interrupt 10h ist nicht verfügbar.

Zur Ausgabe von Zeichen musst du also direkt in den Videospeicher schreiben.

Der Artikel dazu im Wiki: http://lowlevel.brainsware.org/wiki/index.php/Textausgabe
Ein Beispiel in C: http://lowlevel.brainsware.org/wiki/index.php/Teil_4_-_Hello_World
Dieser Text wird unter jedem Beitrag angezeigt.

satyria

  • Beiträge: 8
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 26. March 2010, 19:20 »
Danke für die Antwort. Aber gibt es einen Möglichkeit mit Grub in den Real Mode zu wechseln?

Gruß, Satyria

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 26. March 2010, 19:58 »
GRUB bietet diese Möglichkeit nicht. Du musst selbst in den Real Mode wechseln.

Wie das geht findest du vielleicht mit der Suchfunktion, oder hier: http://wiki.osdev.org/Real_mode#Switching_from_Protected_Mode_to_Real_Mode
Dieser Text wird unter jedem Beitrag angezeigt.

satyria

  • Beiträge: 8
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 26. March 2010, 21:16 »
Ach, wie umständlich :-(

Es ist schade, das die Biosfunktionen nicht genutzt werden können. Das hätte es ja viel einfacher gemacht. Oder gibt es da noch andere Möglichkeiten?

Gruß, Satyria

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 26. March 2010, 21:24 »
Dazu sollte man aber auch noch sagen, dass du gar nicht in den Real Mode wechseln willst. ;)

BIOS-Funktionen sind zwar am Anfang ganz nett, aber erstens sind sie nicht so richtig flexibel, zweitens hast du im Real Mode weder virtuellen Speicher noch Speicherschutz und drittens ist ein Megabyte RAM auf Dauer auch nicht wirklich viel. Am besten ist, gleich den Protected Mode zu nehmen und sich die nötigen Treiber dann eben zu schreiben.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

satyria

  • Beiträge: 8
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 27. March 2010, 09:23 »
So, jetzt hab ich das ganze ohne Int versucht, aber leider bekomme ich keine Anzeige:

[Bits 32]
global _start

_mbh:
dd 0x1BADB002
dd 0x00010000
dd 0xE4514FFE
dd 0x00100000 + _mbh
dd 0x00100000
dd 0x00100000 + _end
dd 0x00100000 + _end
dd 0x00100000 + _start

_start:
    mov ah, 0x07
    mov esi, msg
    mov edi, [PutStr_Ptr]
.nextchar:
    lodsb
    test al, al         
    jz .end     
    stosw
    jmp .nextchar
.end:
ende:
jmp ende

PutStr_Ptr dd 0xb8000
msg db 'mein Kernel!!!!!!!!!!!!!',0

_end:

Wo mache ich da meinen Fehler (Wahrscheinlich übersehe ich da was)

Gruß, Satyria

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 27. March 2010, 10:08 »
Ja, du übersiehst, dass nasm so davon ausgeht, dass dein Code an die Adresse 0x0 geladen wird. In Wirklichkeit landet er ja aber bei 0x100000, wie du das im Multibootheader angegeben hast. Damit greift der Code natürlich voll ins Leere, wenn er auf msg oder PutStr_Ptr zugreifen will.

Wenn der Anfang so aussieht, tut es:
[org 0x100000]
[Bits 32]
global _start

_mbh:
dd 0x1BADB002
dd 0x00010000
dd 0xE4514FFE
dd _mbh
dd 0x00100000
dd _end
dd _end
dd _start
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

satyria

  • Beiträge: 8
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 28. March 2010, 22:32 »
Danke, das hat jetzt funktioniert! Aber nachdem hier oben davon gesprochen wurde, das man doch alles selbst Programmieren soll, kommt nun meine nächste Frage. Kann ich meine Eingaben direkt über bestimmte Hardwarepunkte abfragen? Also hat die Tastatur eine bestimmte Adresse, sowie die Grafikkarte? Wenn nicht, ist es tatsächlich nur über IRQ’s möglich, was ich dann nicht ganz verstehe, da doch auch diese sich auf irgendwas beziehen müssen, oder?

Gruß, Satyria

erik.vikinger

  • Beiträge: 1 277
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 29. March 2010, 08:45 »
Hallo,


siehe http://lowlevel.brainsware.org/wiki/index.php/Keyboard_Controller

Jede Hardware ist über irgendwelche Ports oder Speicheradressen für die CPU ansprechbar.


Grüße
Erik
Reality is that which, when you stop believing in it, doesn't go away.

 

Einloggen