2012-09-23 12 views
5

Czytam poprzez książki "Understanding Linux Kernel" przez Boveta i Cesati. W drugim rozdziale, w dziale "Paging in Linux", autor wspomina, w jaki sposób strona Middle i Upper katalogi są eliminowane w 32 architekturach bez włączonego PAE. Mam problemy z podążaniem za tym, co autor ma na myśli.Poziomy Linux Kernel Memory Zarządzanie przywoławcze

Zostały one luźno w ich leczeniu, a nie czyni całe mnóstwo intuicyjnym sensie.

Dla architektur 32-bitowych bez rozszerzenia adresu fizycznego wystarczają dwa poziomy stronicowania. Linux zasadniczo eliminuje pola Page Upper Directory i Middle katalogu strony, mówiąc, że zawierają one zero bitów. Jednak pozycje Page Upper Directory i Middle Directory w sekwencji wskaźników są zachowywane, aby ten sam kod mógł działać na architekturach 32-bitowych i 64-bitowych. Jądro utrzymuje pozycję dla katalogu Page Upper i Middle Directory, ustawiając liczbę wpisów w nich na 1 i odwzorowując te dwa wpisy na właściwe wprowadzenie strony Global Directory.

Czy ktoś może wyjaśnić to w łatwiejszy sposób?

+0

Okej, więc zastanowiłem się trochę i zobacz, czy to ma sens. Zasadniczo masz sprzęt MMU przechodzący przez hierarchię stron w systemie TLB, dla którego zasadniczo pojedynczy wpis PMD i PUD są niepomne. Jednak w przypadku pozostałej części kodu jądra musimy przedstawić jednolity interfejs stronicowania czteropoziomowego.Tak więc mamy pojedynczy PUD wejścia i pojedynczy wpis PMD, z których emulowany jest tak, by zawierał dokładnie tę samą wartość odpowiadającego wpisu PGD dla tego adresu. – subramanian

+0

Tak. Na procesorach bez PAE, MMU oczekuje tylko niższych dwóch tabel, ale jądro oczekuje wszystkich czterech, więc dwa górne muszą zostać utworzone za pomocą tylko jednego wpisu. Pamiętaj, aby dodać komentarz jako odpowiedź, gdy tylko możesz. – ughoavgfhw

+0

Myślę, że moje wyjaśnienie miało dziury, które Linuxios wyjaśnia mi wyraźnie. więc oznaczę jego odpowiedź jako poprawną. – subramanian

Odpowiedz

2

Myślę, co oznacza, że ​​jądro jest zawsze korzysta z 4 poziomów tablic stron, które mogą pomieścić zarówno normalne 32 bit, PAE i tryb długi. Myślę, że mają na myśli to, że PM4L i PDT są ustawione na długość jednego wpisu, który wskazuje na następny. To znaczy, że w normalnym 32 bit, to masz:

       /-> Page table 
PM4L -> PDT -> Page Directory --> Page table 
           \-> Page table 

Ale w PAE, to masz:

PM4L -> PDT -> 512 Page Directories -> 1024 Page tables 

A w trybie Długie, to masz:

PM4L -> 512 PDTs -> 512 Page Directories -> 1024 Page tables 

Ale z powodu 4 poziomów zawsze, reszta jądra ma ujednolicony interfejs w 32-bitowym, PAE i długim trybie.

+0

ah! teraz widzę, gdzie byłem zdezorientowany. Książka wydawała się wyjaśniać, że środkowe 2 stoły były nieaktywne. To nie wydaje się mieć żadnego sensu. Twoja odpowiedź wyjaśnia, dzięki! – subramanian

0

Obecnie czytam tę samą książkę i nie chcę, aby zadać nowe pytanie, ponieważ ten rozwiązuje dokładnie mój problem.
Zazwyczaj kolejność tabel jest następująca:

PML4 (Linux: PGD) -> PDPT (Linux: PUD) -> PD (Linux: PMD) -> PT 

W tekście mówi się, że dwa poziomy są wystarczające i dlatego PUD i PMD są „wyeliminowany”, ale każdy z tych dwóch tabel ma długość jednego i jest utrzymywana we właściwej kolejności sekwencji.
W moim rozumieniu oznacza to, że pML4 (PGD) odpowiada PD (PMD) i składa się z bezpośrednich odnośników do PT. Tak więc PUD i PMD są "pomijane". Ale moje zrozumienie nie odpowiada poprawnej odpowiedzi na pierwotne pytanie.
Jak ten adres zostanie rozwiązany, jeśli aplikacja 32-bitowa wykona syscall i przełączy się w tryb jądra 64-bitowego? W tym przypadku MMU oczekuje czterech warstw, a nie dwóch.
Jest oczywiste, że coś jest nie tak z moim zrozumieniem, bo rzeczy nie może pracować w taki sposób. Mam nadzieję, że ktoś może to wyjaśnić.