Как сосуществуют расширенная (4 МБ) и обычная (4 КБ) подкачка страниц?

Как сосуществуют расширенная (4 МБ) и обычная (4 КБ) подкачка страниц?

В архитектуре x86 «Расширенная подкачка» позволяет использовать страничные кадры (физическую память) размером 4 МБ вместо 4 КБ.

В книге «Понимание ядра Linux, 3-я» в главе 2 «Адресация памяти», подразделе «Страничная разбивка в Linux», разделе «Таблицы страниц ядра» объясняется, что для окончательной таблицы страниц ядра, когда размер оперативной памяти меньше 896 МБ:

[...]ядро может обращаться к оперативной памяти, используя большие страницы (см. раздел «Расширенная подкачка страниц» ранее в этой главе).

Однако в разделе «Расширенный пейджинг» (подглава «Пейджинг в оборудовании») написано:

Расширенное пейджинговое взаимодействие сосуществует с обычным пейджинговым взаимодействием.

Я на самом деле не понимаю, как сосуществуют расширенная и обычная пейджинговая подкачка. Может кто-нибудь объяснить эти вопросы:

  • В каких случаях ядро ​​использует страницы размером 4 МБ или 4 КБ?
  • Какой размер фрейма страницы будет использоваться для операций kmalloc? для vmalloc?
  • Если предположить, что исходный код и данные (сегменты ядра, предварительные таблицы страниц и 128 КБ для динамических данных) помещаются в первые 8 МБ ОЗУ (как в примере, приведенном в книге), что, если реальный объем кода и данных составляет всего 5 МБ: потратит ли ядро ​​впустую 8 - 5 = 3 МБ?

решение1

1. В каких случаях ядро ​​использует страницы размером 4 МБ или 4 КБ?

Приложение может подать заявку на огромную страницу, ядро ​​не определит размер страницы, если не скомпилировать PAGE_SIZE в исходный код ядра. Использование флагов mmap может определить размер страницы в исходном коде приложения.

2. Какой размер фрейма страницы будет использоваться для операций kmalloc? для vmalloc?

kmalloc использует размер страницы по умолчанию в ядре Linux, то есть PAGE_SIZE в ядре, который компилируется или определяется во время выполнения. То же самое для vmalloc.

3. Если предположить, что исходный код и данные (сегменты ядра, предварительные таблицы страниц и 128 КБ для динамических данных) помещаются в первые 8 МБ ОЗУ (как в примере, приведенном в книге), что, если реальный объем кода и данных составляет всего 5 МБ: будет ли ядро ​​тратить впустую 8 - 5 = 3 МБ?

Размер неиспользуемой памяти определяется PAGE_SIZE и данными: если размер страницы составляет 4 МБ, данных — 5 МБ, размер неиспользуемой памяти составит (PAGE_SIZE*N) — 5 МБ = 3 МБ.

Связанный контент