2013-08-21 2 views
5

Ich habe Code durchgelaufen, der Attribut _ ((Abschnitt ("Name")) verwendet. Ich verstehe, dass für GCC-Compiler das Linker das Objekt in einem bestimmten Abschnitt "Name" (.?. mit „name“ absolute Adresse in einer Linker-Datei deklariert)__attribute __ ((Abschnitt ("Name"))) Verwendung?

Was ist der Sinn, dies zu tun, anstatt nur mit dem .data Abschnitt ist

+0

Es ist, weil das die Plattform des Codes ist, an dem ich arbeite. Ich bin mir bewusst, dass dieses Attribut nur auf bestimmten Plattformen verfügbar ist, daher wollte ich es zur besseren Übersicht hinzufügen. Ich versuche zu verstehen, was die Absicht des Codierers ist, wenn er bestimmte Objekte in Testobjekte, Verfolgungsobjekten usw. ausschneidet. – tll

+0

Ich entfernte den ARM-Abschnitt, so dass es klarer ist, dass ich mich nicht nur um ARM kümmere. – tll

Antwort

5

Es gibt viele mögliche Anwendungen [Bearbeiten Notiz hinzufügen: diese ist nur ein Beispiel von Verwendungen, die ich selbst gesehen oder in Betracht gezogen habe, keine vollständige Liste.]

Der Linux-Kernel zum Beispiel markiert einige Code- und Datenabschnitte ns wird nur während des Kernel-Bootstraps verwendet. Diese können nach der Ausführung des Kerns abgeworfen werden und den Speicherplatz für andere Zwecke zurückfordern.

Sie können damit Code- oder Datenwerte markieren, die auf einer bestimmten Prozessorvariante, z. B. mit oder ohne Coprozessor, gepatcht werden müssen.

Sie können es verwenden, um Dinge in "speziellen" Adressräumen zu leben, die in PROM gebrannt oder in einem EEPROM gespeichert werden, anstatt im normalen Speicher.

Sie können damit Code- oder Datenbereiche für Zwecke wie Initialisierung und Bereinigung zusammenfassen, wie mit C++ - Konstruktoren und -Destruktoren, die vor dem Programmstart und zum Ende ausgeführt werden, oder zur Verwendung kürzerer Adressierungsmodi (nicht wissen, wie viel das auf ARM zutreffen würde, da ich selbst keinen ARM-Code geschrieben habe).

Die tatsächliche Verwendung hängt von den Linker-Skripten ab.

+0

Andere Anwendungen sind ** hot ** und ** cold ** für * Cache-Lokalität *. Sie können auch Funktionen partitionieren, z. B. Interrupt-Handling, Scheduling usw. Auch wenn sich die Routine/Funktionalität in einer C-Datei befindet, kann der typische Ausführungspfad von der Gruppierung von * Aufrufstapeln * profitieren. Einige Codes können von * flash * oder * internal ram * ausgeführt werden. Diese Ressource kann begrenzt sein, etc. –

+0

@torek Auf Ihrem letzten Punkt über das Sammeln von Code/Datenbereichen für die Initialisierung/Bereinigung, bedeutet dies im Wesentlichen, dass ich wählen kann, um Code vor dem Programmstart, aber während der Laufzeit statt der Kompilierzeit enthalten? So ähnlich wie eine bessere Version von #ifdef? – tll

+0

Ich bin mir nicht sicher, was genau Sie hier fragen. Wenn Sie ein Linker-Skript geschrieben haben, das einige Abschnitte enthält und andere verworfen hat, können Sie Stücke zu * link * -Zeit einschließen oder ausschließen. Um * Run * -Zeit zu erledigen, müssen Sie Ihr Linker-Skript und Ihren Laufzeitcode koordinieren und es ist viel schwieriger. – torek

2

Aus usecase Sicht gibt es viele verschiedene Arten von .data, wie:

  • Daten lokal für eine bestimmte CPU und/oder NUMA-Knoten
  • zwischen Kontexten gemeinsam genutzter Daten (wie user/wie zB die .vdso oder vsyscall Seiten oder ein anderes Beispiel, Bootloader und Kernel)
  • nur Daten oder andere Daten mit spezifischen Zugriffsmodus/Typ Einschränkungen (sagen wir Cachefähigkeit oder Cache-Residenz - letzteres kann auf einigen ARM spezifiziert werden) SoCs)
  • Daten, die "Zustandsübergänge" bestehen (z. B. Winterschlaf-Image-Ladevorgänge oder Kernel-Crash/Neuinitialisierungen bei schnellem Neustart)
  • Daten mit bestimmten Lebensdauern/Lebenszyklen (nur in bestimmten Phasen während des Starts oder während des Betriebs verwendet, einmal schreibende Daten)
  • Daten spezifisch für ein bestimmtes Kernel-Subsystem oder bestimmte Kernel-Modul
  • „Code colocated“ Daten (Offsets in x64 sind plus/minus 2 GB Adressierung so, wenn Sie RIP -relative Adressierung wollen, müssen die Daten Ihres innerhalb dieses Bereichs von aktuell ausgeführter Code)
  • Daten, die einem bestimmten Hardware-Registerraum zugeordnet sind VA-Bereich

Also am Ende ist es oft über Attribute (das Wort hier in einem allgemeinen Sinne verwendet als das, was __attribute__(...) ermöglicht es Ihnen, innerhalb von gcc Quelltext angeben. Ob ein anderer Abschnitt benötigt wird und/oder nützlich ist, ist ... im Auge des Betrachters - also des Systemdesigners.

Die Verfügbarkeit des Attributs section, daher ermöglicht Flexibilität und das ist, IMHO, eine gute Sache.