Wie kann ich direkt auf den Bildschirm schreiben?
Ich bin ein teenager, der hat sich sehr interessiert in Assembler. Ich bin versucht zu schreiben, ein kleines Betriebssystem auf Intel-x86-assembler, und ich Frage mich, wie das direkte schreiben auf dem Bildschirm, wie in, ohne sich auf das BIOS oder eine beliebige andere Betriebs-Systeme. Ich war auf der Suche durch die Quellen des coreboot -, Linux -, und Kolibri, unter anderem, in der Hoffnung, Sie zu finden und zu verstehen, einige Stück code, der dies tut. Ich habe es noch nicht gelungen, in dieser Hinsicht, obwohl ich glaube, ich werde einen anderen Blick auf die Linux-source-code, dass es die meisten verstehen, um mich von der Quelle habe ich durchsucht.
Wenn das jemand kennt, oder weiß, wo in einigen Stück Quellcode, dass ich sehen konnte, würde ich mich freuen, wenn Sie mir gesagt.
Oder noch besser, wenn jemand weiß, wie zu identifizieren, was I/O-port auf einer Intel x86-CPU-Verbindung zu dem, was Stück hardware, das wäre zu schätzen. Der Grund warum ich das Fragen muss, ist, dass weder die Kapitel, die für Eingabe/Ausgabe in der Intel 64 und IA-32 Architectures Software Developer ' s Manual Volume 1: Basic Architecture, noch in den Abschnitten, die für den IN-oder OUT-Anweisung in Band 3, könnte ich diese Informationen. Und weil es zu anstrengend für die Suche nach relevanten Hinweise in den Quellen, die ich habe.
- Wow, vielen Dank für die tollen Antworten, jeder. Alle Antworten, die so Aussehen, als ob Sie wahrscheinlich, um nützlich zu sein.
- Haben Sie als Sharpie? Sie gleiten ganz leicht über die meisten CRT-und LED-displays.
Du musst angemeldet sein, um einen Kommentar abzugeben.
TEIL 1
Für alte VGA-Modi, gibt es eine Feste Adresse zu schreiben, um den (legacy -) - display-memory-Bereich. Für text-Modus dieser Bereich beginnt bei 0x000B8000. Für Grafik-Modi es beginnt bei 0x000A0000.
Für hochauflösende video-Modi (z.B. diejenigen, die durch die VESA/VBE-Schnittstelle) funktioniert das nicht, da die Größe des legacy-display-memory-Bereich ist begrenzt auf 64 Kb und die meisten hochauflösenden video-Modi brauchen viel mehr Platz (z.B. 1024 * 768 * 32-bpp = 2.25 MiB). Das zu umgehen, gibt es 2 verschiedene Methoden, unterstützt durch VBE.
Die erste Methode wird als "bank-switching", wo nur ein Teil der video-Karte die Anzeige Speicher zugeordnet ist, in den legacy-Bereich jederzeit (und Sie können Sie ändern, in welchem Teil zugeordnet). Dies kann ziemlich chaotisch - zum Beispiel, um zu zeichnen ein pixel, die Sie benötigen konnten, um zu ermitteln, welche bank das pixel ist, dann wechseln Sie zu dieser bank, dann berechnen Sie die offset-in der bank -. Zu machen, noch schlimmer, für einige video-Modi (z.B. 24-bit-video-Modi, wo es 3 Byte pro Bildpunkt (pixel) nur der erste Teil eines pixels Daten vielleicht in einer bank, und der zweite Teil die gleichen pixel-Daten in einer anderen bank. Der größte Vorteil von diesem ist, dass es funktioniert mit real-Modus-Adressierung, als die legacy-display-memory-Bereich ist unter 0x00100000.
Die zweite Methode wird als "Linear Framebuffer" (oder nur "LFB"), wo die Grafikkarte den gesamten Bildschirm-Speicherbereich zugegriffen werden kann, ohne unordentlich bank-switching. Fragen Sie die VESA/VBE-interface, in dem dieser Bereich ist (und es ist in der Regel in den "PCI-hole" irgendwo zwischen 0xC0000000 und 0xFFF00000). Das heißt, Sie können nicht auf es im real-Modus, und verwenden müssen, den geschützten Modus oder langen-Modus oder "unreal mode".
Finden Sie die Adresse von pixel, wenn man eine LFB-Modus, würden Sie etwas tun, wie "pixel_address = display_memory_address + y * bytes_per_line + x * bytes_per_pixel". Die "bytes_per_line" kommt von der VESA/VBE-interface (und kann nicht das gleiche wie "horizontal_resolution * bytes_per_line", weil es kann der Abstand zwischen den horizontalen Linien).
Für "bank eingeschaltet" VBE/VESA-Modi, wird es so etwas wie:
Für einige alte VGA-Modi (z.B. 256-Farben-Modus "0x13") es ist sehr ähnlich wie LFB, außer es ist kein Abstand zwischen den Zeilen, und Sie tun können "pixel_address = display_memory_address + (y * horizontal_resolution + x) * bytes_per_pixel". Für text-Modi es ist im Grunde das gleiche, außer 2 bytes bestimmen die einzelnen Zeichen und sein Attribut, z.B. "char_address = display_memory_address + (y * horizontal_resolution + x) * 2". Für andere alte VGA-Modi (schwarz-weiß/2-farbig, 4-farbig, und 16-Farb-Modi) Speicher der Videokarte angeordnet ist ganz anders. Es ist aufgeteilt in "planes", wo jede Ebene enthält ein bit der pixel, und (beispielsweise) zu aktualisieren, ein pixel in einem 16-Farb-Modus, den Sie schreiben müssen, um 4 separate Ebenen. Aus performance-Gründen die VGA-hardware unterstützt verschiedene schreib-Modi und verschiedene lese-Modi, und es kann kompliziert (zu kompliziert, zu beschreiben, angemessen hier).
TEIL 2
Für I/O-ports (auf 80x86, "PC-kompatiblen"), es gibt 3 Allgemeine Kategorien. Die erste ist die "de-facto-standard" legacy-Geräte, die mit festen I/O-ports. Dazu gehören Dinge wie die PIC-chips, ISA-DMA-controller, PS/2 controller, PIT-chip, serielle/parallele ports, etc. Fast alles, was beschreibt, wie das Programm jedes dieser Geräte wird Ihnen sagen, welche I/O-ports das Gerät verwendet.
Die nächste Kategorie lautet " legacy/ISA-Geräte, bei denen die I/O-ports in den Geräten ist bestimmt durch Jumper auf der Karte selbst, und es ist kein vernünftiger Weg, um zu bestimmen, die I/O-ports, die Sie verwenden, von der software. Um dies dem Anwender zu sagen, die OS die I/O-ports, die jedes Gerät verwendet. Zum Glück krustige Zeug hat alle veraltet sind (obwohl das nicht unbedingt bedeutet, dass niemand, es zu verwenden).
Die Dritte Kategorie ist "plug & play", wo es irgendeine Methode fragt das Gerät, welche I/O-ports es verwendet (und in den meisten Fällen das ändern der I/O-ports das Gerät verwendet). Ein Beispiel dafür ist der PCI -, wo es eine "PCI-configuration-space" erzählt, dass Sie viele Informationen über jedes PCI-Gerät. Für diese Kategorien gibt es keine Möglichkeit, jeder kann bestimmen, welche Geräte Sie verwenden werden, die I/O-ports, ohne es zu Laufzeit und verändern einige BIOS-Einstellungen können dazu führen, jede/alle diese Geräte ändern ich/O-ports.
Beachten Sie auch, dass eine Intel-CPU ist nur eine CPU. Nichts verhindert, dass diese CPUs verwendet werden, in etwas, das radikal anders ist als eine "PC-kompatible" computer. Intels CPU-Handbüchern wird nie sagen Sie nichts über die hardware, die es außerhalb der CPU selbst (einschließlich der Chipsatz oder Geräte).
Teil 3
Wahrscheinlich der beste Ort zu gehen, um weitere Informationen (das ist bestimmt für die OS-Entwickler/Bastler) ist http://osdev.org/ (Ihre wiki-und Foren).
Etwas über meinem Rahmen, aber möchten Sie vielleicht einen Blick in VESA.
Ist das nicht so einfach. Während das BIOS bietet die INT 10h-schreiben von text auf dem Bildschirm, Grafiken unterscheidet sich von einem adapter zum nächsten. Zum Beispiel finden Sie Informationen für VGA http://www.wagemakers.be/english/doc/vga hier. Einige alte SVGA Adapter http://www.intel-assembler.it/portale/5/assembly-game-programming-encyclopedia/assembly-game-programming-encyclopedia.asp hier.
Für Allgemeine I/O-ports, die Sie Durchlaufen müssen, das BIOS, was bedeutet, dass interrupts. Viele Blaue Monde, die ich verwendet Verweise von Don Stoner zu helfen, schreiben einige real-Modus-Montage, aber ich ausgebrannt auf es nach ein paar Monaten vergessen und das meiste, was ich wusste.
Um direkt auf den Bildschirm schreiben, sollten Sie vielleicht schreiben, um die VGA-Text-Modus-Bereich. Dies ist ein block von Speicher, der einen Puffer für den text-Modus.
Den text-Modus-Bildschirm besteht aus 80x25 Zeichen; jedes Zeichen ist 16 bit breit. Wenn das erste bit gesetzt ist, das Zeichen blinkt auf dem Bildschirm. Die nächsten 3 bits dann ausführlich die Hintergrundfarbe; die letzten 4 bits des ersten byte sind die Vorder - (oder text-Zeichen)'s Farbe. Die nächsten 8 bits sind der Wert des Charakters. Dies ist in der Regel code-page 737 oder 437, aber könnte es von system zu system variieren.
Hier ist eine Wikipedia-Seite mit Details zu dieser Puffer, und hier ist ein link zu codepage 437
Fast alle BIOS-Versionen werden stellen Sie den Modus auf text-Modus, bevor Sie Ihr system gebootet ist, aber einige laptop-BIOS nicht Booten in den Textmodus. Wenn Sie nicht schon im text-Modus, können Sie es mit
int10h
sehr einfach:(Der obige code verwendet die BIOS-interrupts, so hat es zu laufen im Real-Modus. Ich schlage vor, setzen diese in Ihrem Bootsektor.)
Schließlich, hier ist ein Satz von Routinen, die ich schrieb, für das schreiben von strings in den geschützten Modus.
Lesen Sie zu diesem auf dieser Seite.
Fand ich einen Ort, das bietet einige gute Informationen über die Angelegenheit:
http://www.osdever.net/FreeVGA/home.htm
Er spricht über einige details wichtig, um code zu schreiben, der schreibt direkt auf den Bildschirm. Ich fand es aus den link zu Don 'Stoner' s Seite (Danke für den link, SilverbackNet!). Ich bin noch auf der Suche nach mehr Informationen, also wenn jemand keine Ideen mehr, ich würde schätzen die Hilfe sehr viel.
Ich ein Buch gefunden, das scheint meine Fragen zu beantworten. Ich erkannte, dass solch ein Buch existieren könnte, nach der Lektüre über es auf der FreeVGA Seite.
Hier der link:
Programmer ' s Guide to the EGA -, VGA-und Super-VGA-Karten