Wie wird beim Erstellen eines Threads der Ausgangskontext bestimmt?

460
user179659

Wie wird der anfängliche Kontext (Zustand der Register) eines Threads bei der Thread-Erstellung festgelegt?

Beispiel: Aktueller Thread-Kontext eax = 0x4, ebx = 0x9000, ecx = 0xfff usw. Erstellen eines Threads wird aufgerufen, um die Ausführung bei 0xbfbfbf zu beginnen. Es ist offensichtlich, dass der Eip des Threads auf 0xbfbfbf gesetzt ist, aber wie wäre es mit den anderen Registern. Werden sie aus dem aktuellen Thread kopiert? Sind sie auf 0x00000000 eingestellt? Ist der Stapelzeiger derselbe? Ich möchte wissen, was mit dem anfänglichen Thread-Kontext bei der Thread-Erstellung passiert. Ich habe Google- und OS-Internal-Bücher geprüft und habe nicht gefunden, wonach ich suche.

Ist dies auch in anderen Betriebssystemen der Fall, insbesondere unter Linux und Windows?

1

1 Antwort auf die Frage

0
David Schwartz

Wenn ein neuer Thread ausgeführt wird, werden seine Register aus dem gespeicherten Kontext geladen, genau wie ein Thread, der bereits ausgeführt wurde. Der Thread, der den Thread erstellt, kann die Kontextstruktur des neuen Threads beliebig füllen, bevor er sie der Tabelle der laufenden Threads des Betriebssystems hinzufügt.

Grundsätzlich funktioniert es so:

  1. Eine neue Aufgabenstruktur wird zugewiesen.

  2. Die Felder in dieser neuen Aufgabenstruktur werden wie gewünscht ausgefüllt. Dazu gehören Register, der Stapelzeiger usw.

  3. Die Aufgabenstruktur wird als betriebsbereit markiert und zur Liste der Aufgaben des Schedulers hinzugefügt.

  4. Der Scheduler entscheidet sich für die Zeitplanung des neuen Threads, lädt seinen Kontext aus der Aufgabenstruktur und wechselt zu ihm.

  5. Der Thread hat nun alle Register, Stack und Anweisungszeiger, die der erzeugende Thread für ihn gefüllt hat.