2009-06-29 13 views
7

W jego November 1, 2005 C++ column, Herb Sutter pisze ...W jaki sposób działa pułapka sprzętowa w trójwymiarze-końcu, nawet jeśli wskaźnik nie jest nigdy dereferenced?

int A[17]; 
int* endA = A + 17; 
for(int* ptr = A; ptr < endA; ptr += 5) 
{ 
    // ... 
} 

[O] n niektóre architektury procesora, w tym dotychczasowymi, wspomniany kod może powodować pułapka sprzętu występuje w punkcie, w którym tworzony jest trzy-koniec-końcowy wskaźnik , niezależnie od tego, czy wskaźnik jest zawsze dereferencjonowany czy nie.

W jaki sposób pułapka na procesor na sygnaturze bitowej? Co o ...

int A[17]; 

// (i) hardware will trap this ? 
int *pUgly = A + 18; 

// (ii) hardware will trap this, too? 
int *pEnd = A + 17; 
++pEnd; 

// (iii) will this fool it? 
int *precious = A + 17; 
unsigned long tricksy = reinterpret_cast<unsigned long>(precious) ; 
++tricksy; 
int *pHobbits = reinterpret_cast<int *>(tricksy); 

Bonus pytanie: Czy wyrażenie „niektóre obecne architekturach procesora” są zwykle rozumiane jako odnoszące się wyłącznie do produktów transportowych, czy też to wyimaginowane architektur oraz jeśli dzieło fikcji, w której są opisane lub nawiązywały do ​​ma ostatniej daty publikacji?

+1

czy to nie koniec czterech lat, podobnie jak koniec A to koniec z przeszłością? –

Odpowiedz

5

Operacje na wskaźnikach zależą od implementacji.

Może się zdarzyć, że na niektórych platformach dozwolone są tylko określone rejestry do przechowywania wartości wskaźników (tylko określone rejestry mogą służyć jako rejestry indeksów), a wartość zapisana w takim rejestrze przez nieuprawniony kod programu jest natychmiast sprawdzana pod kątem prawidłowy adres. W takim przypadku, jeśli wartość wskaźnika odpowiada adresowi nieobecnemu w przestrzeni adresowej programu, to z pewnością wystąpi pułapka sprzętowa.

W takim przypadku dowolny kod niezoptymalizowany przez kompilator, który przypisuje nową wartość do wskaźnika, może potencjalnie spowodować pułapkę.

+1

Czy istnieją takie platformy, lub jest to jak "Nie używać tej koparko-ładowarki, jeśli znajdujesz się w Cloud City Bespin"? –

+1

Jest kilka, jak powiedziała Sutter, "w tym aktualne". Nie pamiętam żadnych imion, ale wiem, że one istnieją. Nie są jednak zbyt powszechne. Jednak kilka architektur używa oddzielnych rejestrów dla wskaźników i danych, co sprawia, że ​​wykrywanie nieprawidłowego adresowania jest trywialne. Czy to ma znaczenie, czy takie platformy istnieją? Po prostu tego nie rób. ;) – jalf

+2

Świadomy autor Borges napisał, że istnieją trzy rodzaje zwierząt: te, które można dotknąć, te, które można zobaczyć tylko z dużej odległości, i te, których można się nauczyć tylko z opowieści innych ludzi. Moje pytanie brzmi, jak te procesory wykorzystują pułapkę, więc prawdziwa dokumentacja techniczna procesora byłaby pouczająca. –

3

Możesz do Google "czytanie spekulacyjne". Zaraz po utworzeniu adresu może być sprytnie, aby architektura pamięci podręcznej wprowadziła odpowiednią pamięć podręczną do pamięci podręcznej. Zwykle powinno to być nieszkodliwe, ale jeśli jesteś znacznie poza zasięgiem (na przykład na następnej stronie), może to już nie być prawdą.

+0

+1 dla wyszukiwanego hasła. –

+0

Nie, to nie jest problem. Punktem o spekulacyjnych odczytach jest to, że są to optymalizacje, nic więcej.Jeśli adres, który próbują przeczytać, jest poza granicami, po prostu go nie czyta. – jalf

+0

@jalf: czy nie jest to po prostu inny sposób powiedzenia, że ​​pułapka sprzętowa nie ma widocznych konsekwencji? MMU nadal będzie prezentowany z adresem wirtualnym, który nie zostanie rozwiązany na adres fizyczny, i który musi się komunikować w ten czy inny sposób. – MSalters

Powiązane problemy