Где находится код 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)

Другие вопросы по тегам