2013-08-21 18 views
5

Przepuściłem kod, który używa _ atrybut _ ((sekcja ("nazwa")). Rozumiem, że dla kompilatora gcc pozwala powiedzieć linker, aby umieścić obiekt utworzony w określonej sekcji "nazwa" (.?. „name” z adresu bezwzględnego zadeklarowanej w pliku linkera)__attribute __ ((sekcja ("nazwa"))) użycie?

Jaki jest sens robienia tego, a nie tylko za pomocą sekcji .data

+0

To dlatego, że jest to platforma kodu, nad którym pracuję. Zdaję sobie sprawę z tego, że ten ____atrybut____ jest dostępny tylko na niektórych platformach, dlatego chciałem go zawrzeć dla jasności. Próbuję zrozumieć, co zamierza intruza, kiedy przekreślał pewne obiekty w obiekty testowe, śledząc obiekty itp. – tll

+0

Usunąłem sekcję ARM, aby było jaśniej, że nie interesuje mnie specjalnie ARM, tylko użycie. – tll

Odpowiedz

5

Istnieje wiele możliwych zastosowań [Edytuj, aby dodać uwaga: ten jest tylko próbką zastosowań, które widziałem lub rozważałem, a nie pełną listą.]

Jądro Linux, na przykład, zaznacza pewien kod i sectio danych ns używane tylko podczas bootstrapu jądra. Można je zignorować po uruchomieniu jądra, odzyskując miejsce na inne zastosowania.

Można tego użyć do oznaczania wartości kodu lub danych, które wymagają poprawki na konkretnym wariancie procesora, np. Z koprocesorem lub bez niego.

Za jego pomocą można tworzyć na żywo "specjalne" przestrzenie adresowe, które zostaną wypalone w trybie PROM lub zapisane w pamięci EEPROM, a nie w zwykłej pamięci.

Można go używać do zbierania kodu lub obszarów danych w celach takich jak inicjalizacja i czyszczenie, tak jak w przypadku konstruktorów C++ i destruktorów, które działają przed uruchomieniem programu i po jego zakończeniu, lub w celu użycia krótszych trybów adresowania (nie mam wiedzieć, ile to będzie miało zastosowanie w ARM, ponieważ sam nie napisałem kodu ARM).

Rzeczywiste użycie zależy od skryptu (skryptów) linkera.

+0

Inne zastosowania to ** hot ** i ** cold ** dla * lokalizacji pamięci podręcznej *. Możesz także podzielić funkcje, takie jak obsługa przerwań, planowanie itp. Chociaż rutynowe funkcje mogą znajdować się w jednym pliku "C", typowa ścieżka wykonania może zyskać na grupowaniu * stosów wywołań *. Część kodu może być wykonana z * flash * lub * internal ram *. Te zasoby mogą być ograniczone, itp. –

+0

@torek W twoim ostatnim punkcie dotyczącym zbierania obszarów kodu/danych do inicjalizacji/czyszczenia, to zasadniczo oznacza, że ​​mogę wybrać włączenie kodu przed uruchomieniem programu, ale w czasie wykonywania zamiast czasu kompilacji? Coś w rodzaju lepszej wersji #ifdef? – tll

+0

Nie jestem pewien, o co tu właściwie prosisz. Jeśli napisałeś skrypt linkera, który zawierał pewne sekcje i odrzucił inne, możesz dołączyć lub wyłączyć fragmenty w czasie * link *. Robienie rzeczy przy * uruchomieniu * czasu wymaga skoordynowania skryptu linkera i kodu wykonawczego, i jest znacznie trudniejsze. – torek

2

Z punktu USECASE widzenia, istnieje wiele różnych rodzajów .data, takie jak:

  • danych lokalnych do konkretnego procesora i/lub węzła NUMA
  • dane współdzielone pomiędzy kontekstach (jak użytkownik/kernelspace, podobnie jak strony .vdso lub vsyscall lub inny przykład, bootloader i jądro) tylko dane lub inne dane z określonymi ograniczeniami trybu/typu (powiedzmy, cacheability lub rezydentem cache - te ostatnie mogą być określone na niektórych ARM SoCs)
  • Dane, które są kontynuowane "przejścia stanu" (takie jak ładowanie obrazu hibernacji lub ponowne uruchamianie jądra/szybkie ponowne uruchamianie)
  • dane o określonych cyklach życia/cyklu życia (używane tylko w określonych etapach podczas rozruchu lub podczas działania, dane jednorazowe)
  • dane specyficzne dla danego podsystemu jądra lub danego modułu jądra
  • „Kod nimi rozmieszczane” adresowania danych (przesunięcia w x64 są wartości plus/minus 2 GB, więc jeśli chcesz RIP -relative adresowania, dane muszą być w tym zakresie swoje aktualnie wykonywany kod)
  • dane zmapowane do określonej przestrzeni rejestru sprzętowego Zakres VA

Więc w końcu to często około atrybuty (słowo tutaj użyte w bardziej ogólnym znaczeniu niż to, co __attribute__(...) pozwala stwierdzić od wewnątrz gcc źródłowego. Czy inna sekcja jest potrzebna i/lub użyteczna jest ... w oku patrzącego - to jest projektant systemu.

Dostępność atrybutu section, zatem , pozwala na elastyczność i to jest, IMHO, to dobrze.

Powiązane problemy