2015-05-08 20 views
5

Ich lese smphello.s Code von allan Cruse codeAssembly: Muss xadd Befehl gesperrt werden?

im folgenden Teil für jeden Prozessor zu er versucht Setup-Stack-Segment.

der Punkt ist, dass er verwendet XADD ohne Schloss Präfix während in der Beschreibung von XADD wie in here. Möglicherweise ist ein Sperrpräfix vorhanden.

ist dies ein Fehler oder ist es okay? und warum ?

# setup an exclusive stack-area for this processor 
mov $0x1000, %ax # paragraphs in segment 
xadd %ax, newSS  # 'atomic' xchg-and-add 
mov %ax, %ss  # segment-address in SS 
xor %esp, %esp  # top-of-stack into ESP 
+0

Ja, es sollte 'lock' verwenden. Der einzige Befehl, der die Sperre selbst setzt, ist 'xchg'. – Jester

+0

@becks: Gibt es ein Problem mit meiner Antwort? – SonOfSun

Antwort

1

Nach einem weiteren Gedanken daran, ein anderes Szenario für diesen Fall kam mir in den Sinn.

, wenn die Mikro Implementierung von xadd so aussehen:

temp = ax + newSS 
newSS = ax 
ax = temp ; the last 2 are actual xchg 

die wir haben Problem in diesem Szenario:

wird angenommen, dass newSS zwischen zwei Threads gemeinsam genutzt wird.

Thema No.0 (t0 mit seinem ax zu entspricht) Lasten und fügt newSS mit ax und in ein temp register setzen.

wird angenommen, dass wir an dieser Stelle einen Kontextschalter. Dann t1 mit ax entspricht versucht newSS laden und fügen Sie es ax und setzen Sie das Ergebnis in die temp register. und dann ein Kontextwechsel zurück zu t0 ... Beide Stack-Segmentregister zeigen auf die gleiche Adresse.

Offensichtlich haben wir hier ein Problem. Es sei denn, die Umsetzung Mikro so aussehen:

tmp register = ax 
xchg ax, newSS 
ax = ax + tmpRegister 

in irgendeiner anderen Art und Weise, dass variable newSS mehr gelesen als einmal oder gelesen und in verschiedenen Anweisungen geschrieben, müssen wir sperren.

3

Die Race-Bedingung ist nicht auf dem "NEWSS". Da die Anweisung Erklärung impliziert,

xadd %ax, newSS bedeutet:

temp = ax + newSS 
newSS = ax 
ax = temp ; the last 2 are actual xchg 

So ist die Race-Bedingung ist auf Axt-Register. Aber wenn wir genau überlegen, wissen wir, dass jeder Thread seine eigene Registerdatei oder seinen eigenen Kontext hat. Also wird es kein Problem geben. (Die Registerwerte nicht bei Kontextwechsel aus dem letzten Kenntnis von ihnen Thread ändern)

So gibt es keine Notwendigkeit, eine Sperre für XADD in diesem Beispiel.

+1

Von dem, was ich sehen kann, denke ich, dass der atomare Zusatz/Austausch ausreicht, um "newSS" in diesem Fall zu schützen, und Sie sind richtig. Ich bin jedoch eher ein Experte auf der ARM-Seite der Dinge, also werde ich gerne auf andere verzichten, wenn ich mich als falsch erwiesen habe. –