Как определяется размер страницы в виртуальном адресном пространстве?

43

Linux использует систему виртуальной памяти, где все адреса являются виртуальными, а не физическими адресами. Эти виртуальные адреса преобразуются в физические адреса процессором.

Для упрощения перевода виртуальная и физическая память разделены на страницы. Каждой из этих страниц присваивается уникальный номер; номер фрейма страницы.

Некоторые размеры страниц могут составлять 2 КБ, 4 КБ и т. Д. Но как определяется этот размер страницы? На это влияет размер архитектуры? Например, 32-битная шина будет иметь адресное пространство 4 ГБ.

JohnMerlino
источник

Ответы:

56

Вы можете узнать размер страницы системы по умолчанию, запросив ее конфигурацию с помощью getconfкоманды:

$ getconf PAGE_SIZE
4096

или

$ getconf PAGESIZE
4096

ПРИМЕЧАНИЕ . Вышеуказанные блоки обычно представлены в байтах, поэтому значение 4096 равно 4096 байтов или 4 КБ.

Это запрограммировано в источнике ядра Linux здесь:

пример

$ 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))

Как сдвиг дает вам 4096?

Когда вы сдвигаете биты, вы выполняете двоичное умножение на 2. Таким образом, в действительности сдвиг битов влево ( 1 << PAGE_SHIFT) выполняет умножение 2 ^ 12 = 4096.

$ echo "2^12" | bc
4096
SLM
источник
2
Современное оборудование поддерживает 2 МБ и около 1 ГБ страниц. Можно ли установить для PAGE_SHIFT значение 21 для страниц размером 2 МБ по умолчанию для сборки ядра?
ReverseFlow
2
@ReverseFlow Чтобы получить ответ, я бы задал отдельный вопрос.
Кирилл Булыгин
@ Сим, интересно, почему здесь используются битовые манипуляции? Я читал, что компилятор обычно преобразует умножения в битовые манипуляции, что дает одинаковую производительность.
InAFlash
17

Аппаратное обеспечение (в частности, MMU , который является частью CPU) определяет возможные размеры страниц. Нет никакого отношения к размеру регистра процессора и только косвенное отношение к размеру адресного пространства (в этом MMU определяет оба).

Почти все архитектуры поддерживают размер страницы 4 КБ. Некоторые архитектуры поддерживают страницы большего размера (а некоторые также поддерживают страницы меньшего размера), но 4 КБ - очень распространенное значение по умолчанию.

Linux поддерживает два размера страниц:

  • Страницы нормального размера, которые, по моему мнению, имеют размер 4 КБ по умолчанию на всех архитектурах, хотя некоторые архитектуры допускают другие значения, например, 16 КБ на ARM64 или 8 КБ, 16 КБ или 64 КБ на IA64 . Они соответствуют самому глубокому уровню дескрипторов в MMU (то, что Linux называет PTE ).
  • Огромные страницы , если скомпилированы в ( CONFIG_HUGETLB_PAGEнеобходимо, CONFIG_HUGETLBFSа также для большинства случаев). Это соответствует второму по глубине уровню дескрипторов MMU (то, что Linux называет PMD) (или, по крайней мере, обычно так и есть, я не знаю, применимо ли это ко всем архитектурам).

Размер страницы - это компромисс между использованием памяти, использованием памяти и скоростью.

  • Больший размер страницы означает больше потерь при частичном использовании страницы, поэтому системе не хватает памяти раньше.
  • Более глубокий уровень дескриптора MMU означает больше памяти ядра для таблиц страниц.
  • Более глубокий уровень дескриптора MMU означает больше времени, затрачиваемого на обход таблицы страниц.

Преимущества больших размеров страниц для большинства приложений незначительны, а стоимость значительна. Вот почему большинство систем используют только страницы нормального размера.

Вы можете запросить (нормальный) размер страницы на вашей системе с getconfутилитой или функции C sysconf.

$ getconf PAGE_SIZE
4096

Для использования огромных страниц требуется монтировать hugetlbfsфайловую систему и mmapпинговать туда файлы.

Жиль "ТАК - перестань быть злым"
источник
К сведению: использование огромных страниц не требует монтирования hugetlbfs, поскольку в примечаниях к документации ядра внизу вы также можете использовать вызовы из общей памяти или флаг mmap. Кроме того, что более интересно, вы можете включить прозрачные огромные страницы, тогда ядро ​​автоматически преобразует обычные страницы в огромные страницы, когда это возможно во всех приложениях.
Дероберт
Это действительно фундаментальный ответ. Linux просто спроектирован так, чтобы хорошо использовать пейджинговое оборудование. Подробнее о пейджинге: stackoverflow.com/questions/18431261/how-does-x86-paging-work
Чиро Сантилли at 改造 中心 法轮功 六四 事件
0

Размер страницы зависит в основном от архитектуры процессора. На x86, со времен процессора 386, который ввел защищенный режим, размер страницы составлял 4 кБ.

В режиме x64 также могут быть огромные страницы размером 2 МБ. Однако использовать их немного сложно.

Вы можете найти больше информации о размере страницы в статье Википедии

Теро Килканен
источник
0

Процессор определяет доступные размеры страницы. В большинстве случаев аппаратный размер страницы на процессорах x86 и x86_64 составляет 4 КБ. Однако операционная система может выделять более одной страницы за раз, если она этого хочет, и, таким образом, эффективно реализовывать страницы 8 КБ, 16 КБ или 32 КБ в программном обеспечении.

Процессоры x86 и x86_64 также могут смешивать страницы 4 МБ и 2 МБ соответственно со стандартными страницами 4 КБ. Если эта возможность используется вообще, она будет в основном использоваться для выделения пространства ядра.

Лесли
источник