В архитектуре 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 МБ.