Alle Register auf Stack sichern



  • Hi,

    ich möchte alle Register auf dem Stack sichern, bisher kenne ich nur folgende zwei Instruktionen: pushad, pushfd

    Was für eine Instruktionssequenz müsste ich ausführen um den gesamten Status der CPU zu sichern? Und wieviele Bytes würden insgesamt auf dem Stack belegt werden?

    Ist im Moment nur für 32Bit interressant, allerdings habe ich eine 64Bit CPU, wird da trotzdem nur der 32Bit Teil gesichert?



  • Was meinst du mit "gesamter Status der CPU"?
    Am ehesten kommt da IMHO noch ran, was gesichert wird, wenn du einen Task-Wechsel machst (siehe PM-Tutorial in den FAQ), allerdings nicht auf dem Stack.
    Dafuer musst du auch dein eigenes OS basteln, aber wie das klingt, hast du das eh vor?



  • Nobuo T schrieb:

    Was meinst du mit "gesamter Status der CPU"?
    Am ehesten kommt da IMHO noch ran, was gesichert wird, wenn du einen Task-Wechsel machst (siehe PM-Tutorial in den FAQ), allerdings nicht auf dem Stack.
    Dafuer musst du auch dein eigenes OS basteln, aber wie das klingt, hast du das eh vor?

    Ich habe ja noch einen anderen Thread erstellt, da habe ich mein Vorhaben ein wenig erläutert. Genaugenommen muss ich nur das sichern was ein Prozess während der normalen Ausführung verändern kann, aber ich kenne mich mit den Details nicht so aus, deshalb suche ich hier Hilfe.
    Ich schätze mal bei dem Eintrag in der FAQ wird viel mehr gesichert, also auch die ganzen Sachen bezüglich Virtual Memory und so, oder?
    Das muss ich nicht haben (auch wenn das in meinem Ursprungsposting falsch dargestellt wurde).
    Ich brauche nur so Dinge wie die general purpose registers, fpu, diese Flag Field das bei "test" & co verändert wird und solche Dinge (wie gesagt ich weiß nicht was es da alles gibt).



  • ASM Noob schrieb:

    Nobuo T schrieb:

    Was meinst du mit "gesamter Status der CPU"?
    Am ehesten kommt da IMHO noch ran, was gesichert wird, wenn du einen Task-Wechsel machst (siehe PM-Tutorial in den FAQ), allerdings nicht auf dem Stack.
    Dafuer musst du auch dein eigenes OS basteln, aber wie das klingt, hast du das eh vor?

    Ich habe ja noch einen anderen Thread erstellt, da habe ich mein Vorhaben ein wenig erläutert. Genaugenommen muss ich nur das sichern was ein Prozess während der normalen Ausführung verändern kann, aber ich kenne mich mit den Details nicht so aus, deshalb suche ich hier Hilfe.
    Ich schätze mal bei dem Eintrag in der FAQ wird viel mehr gesichert, also auch die ganzen Sachen bezüglich Virtual Memory und so, oder?
    Das muss ich nicht haben (auch wenn das in meinem Ursprungsposting falsch dargestellt wurde).
    Ich brauche nur so Dinge wie die general purpose registers, fpu, diese Flag Field das bei "test" & co verändert wird und solche Dinge (wie gesagt ich weiß nicht was es da alles gibt).

    Es stört mich auch nicht, wenn es nicht auf dem Stack gesichert wird sondern irgendwo in globalen Variablen, hauptsache ich kann das später wieder zurücksetzen. Ich lasse die Anwendung ganz normal unter Windows laufen.



  • Dann mach halt einen 2. Prozess auf, wechsle moeglichst unauffaellig von einem in den anderen und fertig.
    Ansonsten blicke ich immer noch nicht wirklich durch, was du eigentlich vor hast.



  • Nobuo T schrieb:

    Dann mach halt einen 2. Prozess auf, wechsle moeglichst unauffaellig von einem in den anderen und fertig.
    Ansonsten blicke ich immer noch nicht wirklich durch, was du eigentlich vor hast.

    Ok ich wollt es eigentlich möglichst neutral halten, da viele Personen gleich was schlechtes reininterpretieren, wenn man sie auf dieses Gebiet begibt. Was ich möchte ist ein Framework, das im Wesentlichen dieses Tutorial komfortabel wrappt.
    Du musst es dir nicht unbedingt durchlesen, es geht im wesentlichen nur darum an einer bestimmten Stelle einen Teil des Codes zu überschreiben um seinen eigenen Code auszuführen, da ich dort evtl. den Stack und die Register manipuliere ist es natürlich wichtig, dass diese anschließend wieder hergestellt werden, so dass das Programm in einem konsistenten Zustand bleibt.
    Es ist schon ähnlich zu einem Prozess-Wechsel des Betriebssystems, allerdings wohl eher zu einem Wechsel zweier Threads eines Prozesses, da der Adressraum ja gemeinsam genutzt wird und evtl noch andere Register der CPU (wie gesagt ich kenn mich da nicht so im Detail aus).



  • Also ich habe mir dieses PM-Tutorial mal angesehen, aber ich finde dort keinen Code der die Register sicher in dem Multitasking-Kapitel. Kannst du mir das vllt. direkt verlinken was du gemeint hast?



  • ASM Noob schrieb:

    Ok ich wollt es eigentlich möglichst neutral halten, da viele Personen gleich was schlechtes reininterpretieren, wenn man sie auf dieses Gebiet begibt.

    Bestimmt nicht mehr als wenn sie jemanden so um den heissen Brei schreiben sehen. 😉

    Threads nennt man auch "Leichtgewichtprozesse". Ist also AFAIK idR. im Grunde auch ein Prozesswechsel, bei dem alles Wichtige gesichert wird, nur dass der Adressraum gleich bleibt.

    Wenn du also wirklich derart auf den Putz hauen willst, dass fpu, mmx, sse etc. evtl. beeinflusst wird, wuerde ich vorschlagen, einen extra Thread oder Prozess anzulegen.
    Ansonsten wird es wohl reichen, sich genau die Stelle anzusehen, an der du einsteigen willst und entsprechend nur das Noetigste zu sichern.
    zB. wird es vermutlich eher selten vorkommen, dass es noetig wird die flags (pushf), fpu-Register o.Ae. zu sichern.
    Waere im Einzelnen auch recht kompliziert - mit einem Befehl ist es da AFAIK nicht getan. Solltest du also mal in die Verlegenheit kommen, zB. den fpu-Status sichern zu wollen, waere das mit mmx, etc. wohl schon ein Thema fuer sich (ich muesste es zumindest erstmal nachlesen 😉 ).

    [edit]

    ASM Noob schrieb:

    Also ich habe mir dieses PM-Tutorial mal angesehen, aber ich finde dort keinen Code der die Register sicher in dem Multitasking-Kapitel. Kannst du mir das vllt. direkt verlinken was du gemeint hast?

    Das braucht auch keinen extra Code, weil die CPU das automatisch bei einem Prozesswechsel macht. Praktisch, oder? 😃
    [/edit]



  • Ok, dann belasse ich es bei dem Einfachen, also dem Sichern der general purpose Register und dem Status-Register.
    Für alles weitere muss man dann im konkreten Fall Rechnung tragen.


Anmelden zum Antworten