Istnieją dwa typy adresów wirtualnych że jądro Linux używa:
- 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.
- 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.
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
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. –