2010-12-14 12 views

Antwort

0

Wenn Sie eine Anwendung starten, wird der eip (Programmzähler) auf die Textdaten Ihres Programms gesetzt, die Textdaten sind Ihr Code (0..1). Von hier aus beginnt es, Anweisungen von der Adresse auszuführen, die auf eip gestellt wird. Die Anweisungen werden auf einem ROM in der Nähe der CPU (oder des Caches) definiert, wenn die CPU versucht, etwas auszuführen, das keine Anweisung ist, die eine Ausnahme auslöst (Interrupt auf dieser Ebene). Wie er weiß, ob es sich um eine Anweisung handelt oder nicht, kann man sich vorstellen, dass er für jede Anweisung, die er holt, das ROM wie hashtable prüft, um zu sehen, ob es eine gültige Anweisung ist.

Dies ist ein sehr einfacher Ansatz für das Problem, weil viele Dinge XDD passieren.

3

Der Prozessor tut nur, was Sie ihm sagen. Wie Sie bemerkt haben, kann der Prozessor den Unterschied zwischen "Daten" und "Code" im Speicher nicht erkennen: Es ist alles nur eine Sequenz von Bytes. Es ist, was Sie sagen, dass es mit diesen Bytes zu tun hat, die definieren, wie es behandelt wird.

Wenn ein Programm kompiliert wird, enthält die generierte ausführbare Datei Informationen, die angeben, welche Teile Code sind und welche Teile Daten sind. Wenn ein Programm ausgeführt wird, lädt das Betriebssystem Code und Daten in verschiedene Teile des Speichers und weist dann den Prozessor an, den Code am Eingangspunkt des Programms auszuführen. Von dort holt der Prozessor den ersten Befehl, führt ihn aus und geht zum nächsten Befehl über.

Das ist natürlich alles sehr vereinfacht, aber ich denke, Sie bekommen die Idee.

In älteren Prozessoren und älteren Betriebssystemen hindert Sie nichts daran, dem Prozessor mitzuteilen, dass er Befehle ausführt, die sich in der Mitte eines Datensegments befinden. Oder, in der Tat, von "Daten" in der Mitte eines Codesegments zu modifizieren - wodurch selbst modifizierender Code gemacht wird. Neuere Prozessoren und Betriebssysteme haben normalerweise eine Form der Datenausführungsverhinderung und Sperren, um eine Modifikation des Codes zu verhindern. Andernfalls kann selbst modifizierender Code ein großes Sicherheitsrisiko darstellen.

Die kurze Antwort: Der Prozessor behandelt Code als Code, weil Sie es sagen. Ansonsten ist alles nur Bytes im Speicher.

2

Die verschiedenen Register helfen dem Prozessor beim Unterscheiden zwischen den verschiedenen Speichersegmenten in einem Prozess, der auf einem Computer ausgeführt wird. Wenn ein Programm gestartet wird, werden das Code-Segmentregister (cs) und der Anweisungszeiger (ip/eip/rip) eingerichtet, um auf den Code zu zeigen, während das Datensegmentregister (DS) und eines der allgemeinen Register (typischerweise DX) werden verwendet, um in ein Datensegment zu zeigen. Nun, das ist meistens eine Intel x86-Architektur, aber im Allgemeinen haben die meisten Architekturen Register, um die Code-Region von der Datenregion abzugrenzen, wie auch das Stack-Segment. Durch diese Register "weiß" oder kann die CPU zwischen der Codeadresse