jak określa się rozmiar strony w wirtualnej przestrzeni adresowej?


43

Linux używa wirtualnego systemu pamięci, w którym wszystkie adresy są adresami wirtualnymi, a nie adresami fizycznymi. Te adresy wirtualne są przetwarzane przez procesor na adresy fizyczne.

Aby ułatwić tłumaczenie, pamięć wirtualna i fizyczna są podzielone na strony. Każda z tych stron ma unikalny numer; numer ramki strony.

Niektóre rozmiary stron mogą wynosić 2 KB, 4 KB itp. Ale w jaki sposób określa się ten rozmiar strony? Czy wpływa na to wielkość architektury? Na przykład 32-bitowa magistrala będzie miała 4 GB przestrzeni adresowej.

Odpowiedzi:


56

Domyślny rozmiar strony systemu można znaleźć, sprawdzając jego konfigurację za pomocą getconfpolecenia:

$ getconf PAGE_SIZE
4096

lub

$ getconf PAGESIZE
4096

UWAGA: Powyższe jednostki są zwykle w bajtach, więc 4096 odpowiada 4096 bajtom lub 4 kB.

Jest to zapisane w źródle jądra Linux tutaj:

Przykład

$ more /usr/src/kernels/3.13.9-100.fc19.x86_64/include/asm-generic/page.h
...
...
/* PAGE_SHIFT determines the page size */

#define PAGE_SHIFT  12
#ifdef __ASSEMBLY__
#define PAGE_SIZE   (1 << PAGE_SHIFT)
#else
#define PAGE_SIZE   (1UL << PAGE_SHIFT)
#endif
#define PAGE_MASK   (~(PAGE_SIZE-1))

W jaki sposób zmiana biegów daje ci 4096?

Kiedy przesuwasz bity, wykonujesz mnożenie binarne przez 2. Zatem przesunięcie bitów w lewo ( 1 << PAGE_SHIFT) powoduje pomnożenie 2 ^ 12 = 4096.

$ echo "2^12" | bc
4096

2
Nowoczesny sprzęt obsługuje 2 MB, a niektóre 1 GB, rozmiary stron. Czy „PAGE_SHIFT” może być ustawiony na 21 dla 2 MB stron jako domyślny dla kompilacji jądra?
ReverseFlow

2
@ReverseFlow Aby uzyskać odpowiedź na takie pytanie, zadałbym osobne pytanie.
Kirill Bulygin

@sim, zastanawiasz się, dlaczego używa się tutaj manipulacji bitami? czytam, że kompilator zwykle konwertuje multiplikacje na manipulacje bitami, co daje taką samą wydajność.
InAFlash,

17

Sprzęt (w szczególności MMU , który jest częścią procesora) określa, jakie rozmiary stron są możliwe. Nie ma związku z rozmiarem rejestru procesora, a jedynie pośredni związek z rozmiarem przestrzeni adresowej (w tym, że MMU określa oba).

Prawie wszystkie architektury obsługują rozmiar strony 4kB. Niektóre architektury obsługują większe strony (a niektóre obsługują także mniejsze strony), ale 4kB jest bardzo rozpowszechnionym ustawieniem domyślnym.

Linux obsługuje dwa rozmiary stron:

  • Strony o normalnym rozmiarze, które moim zdaniem mają domyślnie 4 kB na wszystkich architekturach, chociaż niektóre architektury dopuszczają inne wartości, np. 16 kB na ARM64 lub 8 kB, 16 kB lub 64 kB na IA64 . Odpowiadają one najgłębszemu poziomowi deskryptorów na MMU (co Linux nazywa PTE ).
  • Ogromne strony , jeśli są wkompilowane ( CONFIG_HUGETLB_PAGEjest to konieczne, a CONFIG_HUGETLBFStakże do większości zastosowań). Odpowiada to drugiemu najgłębszemu poziomowi deskryptorów MMU (co Linux nazywa PMD) (a przynajmniej tak zwykle robi, nie wiem, czy dotyczy to wszystkich architektur).

Rozmiar strony to kompromis między zużyciem pamięci, zużyciem pamięci i szybkością.

  • Większy rozmiar strony oznacza więcej marnotrawstwa, gdy strona jest częściowo używana, więc system szybciej kończy się w pamięci.
  • Głębszy poziom deskryptorów MMU oznacza więcej pamięci jądra dla tabel stron.
  • Głębszy poziom deskryptorów MMU oznacza więcej czasu poświęcanego na przeglądanie stronicowania.

Większe rozmiary stron są niewielkie w przypadku większości aplikacji, a koszt jest znaczny. Dlatego większość systemów używa tylko stron o normalnym rozmiarze.

Można kwerendy (normalny) rozmiar strony w systemie z getconfnarzędzia lub funkcji C sysconf.

$ getconf PAGE_SIZE
4096

Korzystanie z dużych stron wymaga zamontowania tam hugetlbfssystemu plików i mmappingowania plików.


FYI: Używanie ogromnych stron nie wymaga montowania hugetlbfs, ponieważ na dole dokumentu jądra można również używać wywołań pamięci współużytkowanej lub flagi mmap. Co ciekawe, możesz włączyć przezroczyste ogromne strony, wtedy jądro automatycznie skonwertuje normalne strony na duże strony, jeśli to możliwe we wszystkich aplikacjach.
derobert

To jest naprawdę fundamentalna odpowiedź. Linux został tak zaprojektowany, aby dobrze wykorzystywać sprzęt stronicujący. Więcej szczegółów na temat stronicowania: stackoverflow.com/questions/18431261/how-does-x86-paging-work
Ciro Santilli 27 改造 中心 法轮功 六四 事件

0

Rozmiar strony zależy głównie od architektury procesora. Na x86, od czasów procesora 386, który wprowadził tryb chroniony, rozmiar strony wynosił 4 kB.

W trybie x64 mogą być także ogromne strony o wielkości 2 MB. Jednak korzystanie z nich jest nieco skomplikowane.

Więcej informacji na temat wielkości strony można znaleźć w artykule w Wikipedii


0

Procesor określa dostępne rozmiary stron. W większości przypadków rozmiar strony zaimplementowanej sprzętowo w procesorach x86 i x86_64 wynosi 4 kb. Jednak system operacyjny może przydzielić więcej niż jedną stronę na raz, jeśli chce, i tym samym skutecznie wdrożyć strony 8kb, 16kb lub 32kb w oprogramowaniu.

Procesory x86 i x86_64 mogą również odpowiednio mieszać strony 4 MB i 2 MB ze standardowymi stronami 4 KB. Jeśli ta funkcja zostanie w ogóle wykorzystana, byłaby przeważnie wykorzystana do przydzielenia przestrzeni jądra.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.