Aby zabrudzić stronę (włączając brudny bit we wpisie tablicy stron), dotykam pierwszych bajtów strony w ten sposób:
pageptr[0] = pageptr[0];
Ale w praktyce gcc zignoruje stwierdzenie przez eliminację martwego magazynu. Aby zapobiec optymalizacji przez gcc, ponownie piszę instrukcję w następujący sposób:
volatile int tmp;
tmp = pageptr[0];
pageptr[0] = tmp;
Wygląda na to, że sztuczka działa, ale jest trochę brzydka. Chciałbym wiedzieć, czy są jakieś dyrektywy lub składnia, które mają taki sam skutek? I nie chcę używać -O0
flagi, ponieważ przyniesie to również duży spadek wydajności.
-O0
nie zapobiegało „optymalizacji” martwego kodu, np. Gdy GCC wykryje jakiś kod nie daje efektu, po prostu go usuwa. AFAIK, to jest etap jeszcze wcześniej-O0
... Ale to tylko moje doświadczenieOdpowiedzi:
Wyłączenie optymalizacji rozwiązuje problem, ale jest to niepotrzebne. Bezpieczniejszą alternatywą jest uniemożliwienie kompilatorowi optymalizacji magazynu przy użyciu
volatile
kwalifikatora typu.volatile
Typ kwalifikatora instruuje kompilator być ścisły o sklepach pamięci i obciążeń. Jednym z celówvolatile
jest poinformowanie kompilatora, że dostęp do pamięci ma skutki uboczne i dlatego musi zostać zachowany. W takim przypadku efekt uboczny sklepu powoduje błąd strony i chcesz, aby kompilator zachował błąd strony.W ten sposób otaczający kod może być nadal optymalizowany, a twój kod jest przenośny dla innych kompilatorów, które nie rozumieją GCC
#pragma
ani__attribute__
składni.źródło
volatile
oznacza, że dostęp do pamięci musi nastąpić zgodnie z zapisem, czyli dokładnie tym, czego chcemy. Innymi słowy, przemyśleliśmy to dokładnie i oznacza to, co myślimy, że oznacza.Możesz użyć
aby wyłączyć optymalizacje od wersji GCC 4.4.
Zobacz dokumentację GCC, jeśli potrzebujesz więcej informacji.
źródło
Zamiast korzystać z nowych pragm, możesz również użyć ich
__attribute__((optimize("O0")))
do swoich potrzeb. Ma to tę zaletę, że stosuje się tylko do pojedynczej funkcji, a nie do wszystkich funkcji zdefiniowanych w tym samym pliku.Przykład użycia:
źródło
-Olevel
opcji, ale użyłem opcji indywidualnych, które włącza ona oddzielnie? (W moim przypadku nie mogę określić, która opcja optymalizacji indywidualnej psuje kod) .