2016-09-19 1 views
5

Wenn ich den xv6 Quellcode lese, bin ich verwirrt über die Syntax der Deklaration unten. Kann mir das jemand erklären?Was bedeutet die Deklaration "extern struct cpu * CPU asm ("% gs: 0 ");" bedeuten?

extern struct cpu *cpu asm("%gs:0"); 
+2

'asm' nach einer Variablendeklaration können Sie normalerweise den Variablennamen für Verknüpfungszwecke angeben, aber in diesem Fall geben Sie keinen Namen an, sondern eine Art Registerreferenz. –

+0

Nächstes Mal - bitte zuerst Google! –

Antwort

7

Ich gehe davon aus, was extern struct cpu *cpu Mittel verstehen. Die Frage, die Sie haben, ist: Was bedeutet der asm("%gs:0") Teil?

Dieser Code verwendet eine gcc-Erweiterung namens asm labels, um anzugeben, dass die Variable cpu durch die Assemblerzeichenfolge %gs:0 definiert ist.

Dies ist NICHT, wie diese Erweiterung verwendet werden soll und gilt als hack.

Es gibt eine ausgezeichnete Diskussion von gs (und fs) here, aber kurz gs verweist auf den lokalen Speicher des aktuellen Threads. Das Format der Daten bei GS hängt von Ihrem Betriebssystem ab (Windows unterscheidet sich sehr von Linux). Dieser spezielle Code sagt, dass bei Offset 0 von gs, gibt es einen Zeiger auf eine struct cpu.

+0

Siehe [Diskussion auf einem aktuellen Duplikat] (https://stackoverflow.com/questions/47917027/what-does-asm-suffix-mean-in-given-code/47917087?noredirect=1#comment82802441_47917087) für Fälle, in denen die hack kompiliert oder assembliert nicht (32-Bit-PIC-Code oder jedes Mal, wenn der Compiler versucht, die Adresse als unmittelbares Verzeichnis in ein Register zu verschieben) oder schlechter, wenn es kompiliert wird, aber die falsche Adresse verwendet (64-Bit-Code) mit RIP-relativer Adressierung) –

7

Es ist ein Sonderfall von asm label. Er weist den Compiler an, anstelle des üblichen Symbolnamens %gs:0 zu senden, wenn Sie die Variable cpu referenzieren. Vermutlich wurde %gs zuvor als per-CPU-Speicherbereich eingerichtet, mit einem struct cpu Zeiger bei Offset Null. Der Zweck besteht darin, jeder CPU den Zugriff auf ihre eigenen Daten zu ermöglichen.

+1

so ruft dies nur Speicher, der 0 Bytes Offset in Segment ist, durch gs 'CPU' referenziert? –

+1

Ja, das stimmt grundsätzlich. – Jester

+0

Ich hatte die Frage etwas zu schnell angeschaut, um zu sehen, wie sie benutzt wurde. –

Verwandte Themen