Autor Thema: Verrückte Idee  (Gelesen 5934 mal)

Sannaj

  • Beiträge: 103
    • Profil anzeigen
Gespeichert
« am: 22. December 2011, 17:34 »
Mir ist grad eine ziemlich verückte Idee gekommen:
Und zwar:
Was haltet ihr davon, wenn ich ein Programm schreibe, das das BIOS und die IVT ausließt und den BIOS Code (Besonders die wichtigen Teile) dann so umschreibt, das er auch im PM läuft (Addresse müssen natürlich relokalisiert werden und Segmentladebefehle werden durch Interrupts ersetzt.)

Was haltet ihr davon?

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 22. December 2011, 17:54 »
Relativ wenig.

Das BIOS besteht aus Modulen (vgl. "Award Modular BIOS"), die einzeln komprimiert werden und über bestimmte Schnittstellen (z.B. Interrupts) mit dem Hauptmodul kommunizieren. Das ganze möchtest du automatisch reimplementieren. Ich vermute, es gibt Gründe, warum solchen Techniken nicht universell existieren (eher wird eine Emulation der bekannten Umgebung bereitgestellt).

Mich würde interessieren, um was es dir da im speziellen geht? Dein Code muss ja irgendwie ausgeführt werden und braucht dazu schon die Dienste des BIOS (im 16-Bit-RM). Den int13 brauchst du nicht, wenn du einen eigenen Plattentreiber hast (und ein paar hässliche Einschränkungen hat der BIOS-Treiber auch) und auch der int10 ist zu beschränkt, als dass der Aufwand sich lohnen würde (dann portiere lieber einen angepassten Grafiktreiber als ein universelles, langsames, beschränktes BIOS). Zumal das Video-BIOS ja nicht Teil des BIOS ist, sondern zur Grafikkarte gehört und nur teilweise 16-Bit-RM spricht.

Moderne Grafiktreiber sprechen die Grafikkarte auch immer über das VBIOS an (z.B. AtomBIOS), um nicht für jede potentielle Grafikkarte die GPIO-Adressen zu kennen.

Gruß,
Svenska

Sannaj

  • Beiträge: 103
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 22. December 2011, 18:00 »
Eigentlich gehts mir dann schon ehr um die Videofunktionen.

XanClic

  • Beiträge: 261
    • Profil anzeigen
    • github
Gespeichert
« Antwort #3 am: 22. December 2011, 19:39 »
Ich halte davon, dass mir die Idee vor allem bekannt vorkam. Und siehe da (nur eine Auswahl):

Ich äußere mich jetzt nicht weiter zu dem Thema (außer, dass ich bei jedem solcher Threads immer dachte „viel zu viel Aufwand für viel zu wenig Nutzen“), weil eigentlich alles in diesen Threads gesagt wurde. Ansonsten einfach mal weiter auf osdev.org nach “BIOS code translation” oder so suchen.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 22. December 2011, 19:45 »
Den int13 brauchst du nicht, wenn du einen eigenen Plattentreiber hast (und ein paar hässliche Einschränkungen hat der BIOS-Treiber auch)
In Zeiten, in denen man nicht nur von IDE-Platten und ATAPI-Laufwerken booten kann, sondern es Dinge wie AHCI oder gar USB-Sticks gibt, ist dieses "wenn" längst nicht immer gegeben.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

Sannaj

  • Beiträge: 103
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 22. December 2011, 20:06 »
Naja, man muss ja nicht gleich alle Opcodes umwandeln. Wenn man dem Prozessor sagen könnte, das er sich bei bestimmten Opcodes beschweren soll (Interrupt auslösen), wäre mir schon geholfen.

XanClic

  • Beiträge: 261
    • Profil anzeigen
    • github
Gespeichert
« Antwort #6 am: 22. December 2011, 23:43 »
Du müsstest aber praktisch alle Opcodes umwandeln, da zum Beispiel die meisten Word-Operationen im 32-Bit-PM einen Prefix bekommen, im RM nicht; bei den DWord-Operationen ist es dementsprechend genau umgekehrt. Und bei jeder Operation eine Exception auslösen... Das kannst du, nennst sich Trapflag, aber da kannst du gleich den ganzen Code emulieren.

Dimension

  • Beiträge: 155
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 23. December 2011, 01:15 »
Es wäre definitiv interessant zu erfahren, ob deine Versuche Aussicht auf Erfolg zeigen. Ich habe bisher immer gelesen, dass das BIOS vom Protected Mode nur noch über VM86 zu erreichen ist. Bei genauerem Überlegen scheint es sich dabei aber vermutlich nur um eine Emulation zu handeln.

XanClic

  • Beiträge: 261
    • Profil anzeigen
    • github
Gespeichert
« Antwort #8 am: 23. December 2011, 03:26 »
  • vm86 ist keine Emulation, sondern native Ausführung des Codes.
  • Vor allem für x64-Betriebssysteme wurden bereits fertige, relativ portable 8086-Emulatoren geschrieben, die auf die Ausführung von BIOS-Interrupts ausgelegt sind.
  • Die Idee der Rekompilierung anstatt Emulation des Codes wurde nach dem, was ich so gelesen habe, generell letzten Endes als zu hoher Aufwand angesehen. Geschwindigkeit spielt bei der Ausführung von BIOS-Code keine Rolle. Nachdem nun besagte Emulatoren bereits vorhanden sind, gibt es also keinen Grund, eine solche Rekompilierung ernsthaft zu erwägen (PoC ausgenommen).

Man bedenke vor allem, dass es im PM wirklich keinen sinnvollen Grund gibt, überhaupt BIOS-Code zu emulieren. vm86 ist vorhanden, funktioniert und ist wirklich prinzipiell sehr einfach zu implementieren, jedenfalls wesentlich einfacher, als es ein Emulator jemals sein könnte.

Befindet man sich jedoch im LM, so sind wie gesagt bereits fertige 8086-Emulatoren vorhanden, die den vm86 ersetzen können. Zu selbigen wird mWn auch jedem geraten, der eine entsprechende Frage auf osdev.org stellt (http://forum.osdev.org/viewtopic.php?f=1&t=23203#p187714).

Abschließend noch fünf Sekunden googlen: https://gitorious.org/x86emu.


Wie gesagt, als PoC ist Rekompilierung des BIOS sicherlich interessant. Einen ernsthaften Nutzen kann man daraus jedoch imho nicht ziehen.

PS: Ich mag PoCs. :wink:

Sannaj

  • Beiträge: 103
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 23. December 2011, 15:38 »
Du meinst also ich soll im PM Mode den BIOS Code mithilfe des VM86-Modes ausführen und den VM86/Realmode im LM emulieren.

XanClic

  • Beiträge: 261
    • Profil anzeigen
    • github
Gespeichert
« Antwort #10 am: 23. December 2011, 17:02 »
Wenn du überhaupt in den LM gehst, ja (wobei du dann auch im PM den Code emulieren könntest, wenn du den Emulator einmal eingebunden/geschrieben hast).

Wenn nicht, dann meine ich das auch, wobei die letzten sieben Worte dann natürlich wegfallen. :wink:

 

Einloggen