2011-12-12 23 views
7

Linux jest systemem operacyjnym, a procesor ARM to procesor, o którym mowa w tym kontekście.Pamięci jądra (adresy wirtualne) w TLB?

Czy TLB zawiera adresy wirtualne zarówno jądra, jak i użytkownika? Pamięć jądra rozpoczyna się od 0xc000_0000 i przechodzi do 0xFFFF_FFFF , gdzie pierwsze 3 GB należy do przestrzeni użytkownika. Między przełączaniem kontekstów między procesami TLB jest przepłukiwany.

Czy TLB zawiera adresy wirtualne zarówno jądra, jak i użytkownika?

Pamięć jądra (wirtualna) bezpośrednio odpowiada pamięci fizycznej (tylko przesunięcie z 0xC000_0000 poda nam adres fizyczny). Czy konieczne jest posiadanie pamięci jądra (wirtualnej) w TLB (jeśli mówisz, że jest obecna w TLB)? Powinien mieć tylko adres miejsca użytkownika.

Odpowiedz

7

Głównym powodem, dlaczego mamy wirtualnych do fizycznych translacji adresów w nowoczesnych procesorach jest, aby bardziej wydajne i lepiej kontrolowane wykorzystanie pamięci, który umożliwia nam:

  1. Przeznaczyć żadnej fizycznej pamięci RAM, (przyległe lub nie) i udostępnić go w dowolnym miejscu w wirtualnej przestrzeni adresowej (w sposób ciągły lub nie), bez marnowania pamięci na fragmentację.
  2. Rozszerz pamięć fizyczną, RAM, dyskiem lub innymi pamięciami.
  3. Dopilnuj, aby niektóre części przestrzeni adresowej były tylko odczytywalne lub nie wykonywalne, lub tylko jądro itp. Itp. I zabezpiecz je przed nieautoryzowanym lub błędnym dostępem.
  4. Izoluj od siebie wspomnienia aplikacji, aby jeszcze bardziej poprawić ochronę, bezpieczeństwo i niezawodność.
  5. Udostępnianie pamięci. ...

I tabele sprawiają, że to wszystko jest możliwe.

Chcesz móc mapować i usuwać mapę pamięci fizycznej w wirtualnej przestrzeni adresowej w jądrze, a zazwyczaj ten mechanizm translacji działa w całym systemie. Oczywiście tłumaczenie ma swoją cenę, ponieważ musisz teraz skonsultować i utrzymywać tabele stron, co skutkuje spadkiem wydajności. Ale nie wszystko stracone:

  1. Koperty TLB zmniejszają ten problem do pewnego stopnia. Buforują tłumaczenia.
  2. Większe strony (na przykład ARMv7-A 'large pages i sections) pomagają bardziej, ponieważ wymagają mniej wpisów TLB na jednostkę przetłumaczonej pamięci.
  3. Istnieją również rzeczy takie jak global pages. Gdy przełączasz się między aplikacjami i musisz opróżnić bieżącą TLB, możesz uniknąć unieważniania globalnych stron z TLB, wykonując Invalidate TLB entries by ASID match z aplikacją ASID. Jeśli oznaczysz strony jądra jako globalne, nie unieważnisz ich tłumaczeń, a samo jądro nie cierpi z powodu niepotrzebnych unieważnień TLB.

Patrz, na przykład, "ARM® Architecture Reference Manual ARM®v7-A i ARM®v7-R edycja" dla konkretnych szczegółów związanych z ARM Virtual Memory System Architecture (VMSA), tablice stron, TLB, etc.

5

Istnieją dwa typy adresów wirtualnych że jądro Linux używa:

  1. co już wspomniano w wierszu „pamięci jądra (wirtualnym) bezpośrednio odpowiada fizycznej pamięci (tylko potrącenie z 0xC000_0000 będzie dać nasz adres fizyczny) ". To mapuje do sąsiadujących adresów fizycznych.
  2. Korzystanie z vmalloc.

Pierwszy odbywa się za pomocą makra:

include/asm-x86/page_32.h 

#define __pa(x) ((unsigned long)(x)-PAGE_OFFSET) 
#define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET)) 

_PA (x) ma wirtualną tłumaczenie fizycznej. Pamiętaj, że tłumaczenie to dzieje się podczas kompilacji. Nie ma tłumaczenia stronicowania. To ostatnie zdanie jest bardzo ważne.

Z drugiej strony, za pomocą drugiej metody można przydzielić pamięć, która jest ciągła w pamięci wirtualnej, ale może nie być tak w pamięci fizycznej. Teraz, w tym przypadku, pełne tłumaczenie tabeli strony jest wymagane, gdy uzyskujesz dostęp do adresu wirtualnego po raz pierwszy. Pytanie brzmi, kto to robi?

W przypadku maszyn CISC (takich jak x86), MMU (sprzęt) robi to w przypadku braku TLB (pierwszy dostęp do adresu wirtualnego) i aktualizuje tabelę stron. Dla wirtualnych adresów jądra (uzyskanych za pomocą vmalloc) są one przechowywane jako wpisy TLB. Są one nazywane pozycjami globalnymi, a gdy następuje przełączenie kontekstu procesu, są one w większości ignorowane i nie są przepłukiwane, tak jak pozostałe wpisy dotyczące przestrzeni procesowej. Jednak po wykonaniu polecenia vfree w celu zwolnienia powiązanej pamięci wirtualnej te wpisy zostaną usunięte.

W przypadku urządzenia RISC (takiego jak MIPS), tłumaczenie strony jest obsługiwane przez oprogramowanie. Po pominięciu TLB, sprzęt podnosi wyjątek. Uchwyt pułapki działa w trybie jądra, aby wykonać tłumaczenie i aktualizuje TLB za pomocą specjalnych instrukcji. Po powrocie z handlarza pułapek uruchamiana jest ta sama linia kodu i następuje trafienie TLB.

Patrz: http://pages.cs.wisc.edu/~remzi/OSFEP/vm-tlbs.pdf

Dolna linia jest, że nie wszystkie adresy jądra są odwzorowywane w sposób opisany. W twoim przypadku fizyczne adresy są generowane podczas kompilacji. Dlaczego więc dodać wpis TLB? Dla adresów z vmalloc znajdują się wpisy TLB. Gdy przełączanie kontekstu odbywa się między procesami, nie trzeba przepłukiwać całej TLB, a globalne wpisy wykonane przez wirtualny wirtualny plik jądra mogą zostać zachowane. Gdy używasz vfree, odpowiednie wpisy globalne są opróżniane.

+0

ARM jest maszyną RISC i wydaje mi się, że jest wykonana w taki sam sposób, jak opisano dla MIPS. Nie jestem jednak pewien. Uważam jednak, że na twoje pytanie można odpowiedzieć w sposób wystarczający bez uwzględnienia architektury procesora. – trans1st0r

+0

Wygląda na to, że [ARM wykonuje przechodnie strony sprzętowej] (http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0333h/I1029222.html). Poza oczywistą zaletą niższego narzutu dla brakującej TLB, pozwala to na spekulacyjne pobieranie wstępne TLB, co nie jest możliwe z obsługą błędów TLB. Również http://stackoverflow.com/questions/28019266/arm-mmu-and-arm-linux-page-table-walk. Doktor ARM, o którym wspomniałem, wspomniał coś o wyłączeniu fragmentu strony, więc być może ARM może korzystać ze spacerów oprogramowania, w przeciwieństwie do x86. –