Нет, Linux не выгружает память ядра. (По этой и другим подобным причинам, например, убедитесь, что обработчик ошибок страницы не запускается до какой-либо случайной инструкции, обращающейся к памяти).
Операционным системам, выполняющим некоторую часть памяти ядра, определенно потребуется хранить обработчик ошибок страниц, таблицы страниц и код дискового ввода-вывода в памяти ...
этот код обработчика исключений плюс связанные с ним данные также не будут присутствовать в TLB!
Вы объединяете обход страниц (при промахе TLB) с ошибками страниц (вход для виртуального входа).страница недействительна или имеет недостаточные разрешения, которые могут быть получены после обхода страницы при необходимости.
На x86 и большинстве (?) других ISA обход страниц осуществляется аппаратным обеспечением.См. Что происходит после пропуска L2 TLB? .
ОС предоставляет ЦП физический адрес таблицы страниц верхнего уровня (например, mov cr3, rax
).на x86), а процессор обрабатывает все остальное прозрачно.(Единственное программное управление TLB - это аннулирование записи, возможно, кэшированной после изменения записи таблицы страниц в памяти. Например, x86 invlpg
)
Аппаратное управление таблицей страниц позволяет ЦП умозрительно выполнять обход TLB, когда цикл над массивом приближается к границе страницы, вместо ожидания, пока фактическая загрузка не коснется следующей страницы.И для того, чтобы задержка при просмотре страниц была частично скрыта из-за неупорядоченного выполнения и множества хороших вещей.Skylake даже имеет 2 устройства для просмотра страниц, поэтому он может параллельно работать с двумя пропусками TLB (один или оба могут быть спекулятивными или требовать).
На ISA с программным обходом страницобработчик TLB-пропадания отделен от обработчика ошибок страницы.
Например, в MIPS существует специальный диапазон адресов, которые отображаются по-другому, чем обычные виртуальные адреса ядра:
Если адрес начинается с 0b100
[старшие 3 бита], переводится в нижние 512 Мбайт физической памяти и не проходит через TLB.(кэшируется и не отображается).Называется kseg0
.Используется для инструкций и данных ядра.
Обработка MIPS TLB - https://people.csail.mit.edu/rinard/teaching/osnotes/h11.html
(адреса MIPS с установленным старшим битом могут использоваться только кодом ядра, ошибками доступа к пользовательскому пространствуто есть ядро high-half запекается для MIPS.)
Это похоже на отображение огромной страницы объемом 512 МБ для памяти с низкой физической памятью, встроенной в аппаратное обеспечение.Очевидно, что ядро хотело бы сохранить свою структуру данных для поиска страниц в этом диапазоне, но оно могло бы использовать любую структуру данных, которую оно хотело, например, основанную на начале / длине.