Где находится код src, где ядро Linux устанавливает отображение виртуально-физического адреса?
Как я знаю, когда программа пытается получить доступ к виртуальному адресу, на котором отсутствует соответствующий PTE, ядро вызовет сбой страницы, а обработчик сбоя страницы обработает его.
В обработчике, если ошибка вызвана отсутствием физического сопоставления с PTE, ядро должно выделить свободную физическую страницу и записать физический адрес в PTE.
Я нашел много функций, таких как __handle_mm_fault
или же handle_pte_fault
, но я не могу найти место, где ядро фактически выделяет физическую страницу. Кто-нибудь может дать какое-нибудь предложение?
Благодарю.
2 ответа
В ядре 3.18 процедура выглядит следующим образом: handle_mm_fault
->handle_pte_falut
->do_anonymous_page
->alloc_zeroed_user_highpage_movable
Основные функции для размещения страниц расположены в mm/page_alloc.c
Основная функция __alloc_pages()
(который на самом деле является вызовом макроса __alloc_pages_nodemask()
в текущих ядрах).
Ядро Linux использует зонированный распределитель друзей:
- Существует несколько зон для нескольких типов памяти (память ядра / пользователя, DMA, критерии, связанные с NUMA и т. Д.)
- Страницы размещаются в определенных порядках (т. Е. Порядок n равен 2^n страницам)
- В начале доступны блоки свободной памяти высокого порядка.
- Если фрагмент запрашиваемого заказа недоступен, попробуйте разделить больший фрагмент или использовать несколько фрагментов более низкого порядка для удовлетворения запроса.
- Если блок освобождается, распределитель пытается объединить его с
buddies
(т. е. блоки, из которых он был выделен при распределении), чтобы пополнить чанк более высокого порядка из него.
Фрилист - это структура памяти, в которой хранятся бесплатные страницы. Инициализируется в зависимости от архитектуры (т.е. для intel/amd в arch/x86/mm/init_*.c
)