wtorek, grudnia 02, 2008

Intel Core i7 i TLB

Translacja adresów wirtualnych na fizyczne jest w x86 tak zrobiona, że mamy drzewiastą strukturę tablic stron (jedna tabelka na najwyższym poziomie z elementami wskazującymi na tabelkę na drugim poziomie, a elementy w tabelce drugiego poziomu wskazują na tabelkę trzeciego poziomu, ..., w tablicy czwartego poziomu mamy odowołania do fizycznych ramek pamięci).
Pierwsza cześć adresu wirtualnego (ileś tam bitów) stanowi indeks dla pierwszej tabelki, druga część dla drugiej tabelki itd. Trick jest taki, że element w tabelce pierwszego poziomu może wskazywać na swoją tabelkę, i taka referencja do własnej tabelki może zajść 3 razy pod rząd.
Procesor bierze adres wirtualny, przechodzi po drzewku i na końcu uzyskuje adres fizyczny.
Takie chodzenie jest kosztowne dlatego pary [adres wirtualny, adres fizyczny] są cache'owane w buforze TLB. W Core i7 TLB ma cache dwupoziomowy: level 1 - 64 pozycje, level 2 - 512 pozycji, takiego dużego TLB procesory jeszcze nie miały - powinno to dać dużego kopa (i daje, co widać w benchmarkach).
Manual Intela mówi, że jeżeli ta sama fizyczna ramka pamięci jest używana w N mapowaniach, to wyczyszczenie cache'u TLB dla tej ramki powinno być wykonane N razy, czyli N razy musi być wykonana instrukcja INVLPG. Jeśli za mało razy zawołamy INVLPG, to procesor pamięta złe mapowanie i coś złego się stanie, bo użyje złego adresu pamięci fizycznej, w najlepszym przypadku BSOD. Manual mówi też, że jeśli są robione tricki z wskazywaniem elementu tablicy na swoją własną tablicę M razy, to INVLPG musi być zawołane M-1 razy. A wszyscy myśleli, że INVLPG działa raz a dobrze...

0 komentarze: