Разделение виртуальных адресов Linux 3/1
-
11-09-2019 - |
Вопрос
Мне чего-то не хватает, когда дело доходит до понимания необходимости использования highmem для адресации более 1 ГБ ОЗУ.Может ли кто-нибудь указать, где я ошибаюсь?Спасибо!
Что я знаю:
1 ГБ виртуальной памяти процессов (область верхней памяти) зарезервировано для операций ядра.Пользовательское пространство может использовать оставшиеся 3 ГБ.Это разделение 3/1.
Функции виртуальной памяти виртуальной машины сопоставляют (непрерывные) страницы виртуальной памяти с физическими страницами (ОЗУ).
Чего я не знаю:
Какие операции используют виртуальную память ядра?Я полагаю, что такие вещи, как kmalloc(...) в пространстве ядра, будут использовать виртуальную память ядра.
Я думаю, что по этой схеме можно было бы использовать 4 ГБ ОЗУ.Я не понимаю, почему виртуальное пространство ядра размером 1 ГБ является ограничивающим фактором при обращении к физическому пространству.Здесь мое понимание ломается.Пожалуйста, порекомендуйте.
Я это читал(http://kerneltrap.org/node/2450), и это здорово.Но это не совсем отвечает моему вопросу, который мне нравится.
Решение
Причина, по которой виртуальное пространство ядра является ограничивающим фактором для используемой физической памяти, заключается в том, что ядру необходим доступ ко всей физической памяти, а способ доступа к физической памяти осуществляется через виртуальные адреса ядра.Ядро не использует специальные инструкции, обеспечивающие прямой доступ к ячейкам физической памяти — оно должно настроить записи таблицы страниц для любых физических диапазонов, с которыми оно хочет общаться.
В схеме «старого стиля» ядро настроило все так, чтобы таблицы страниц каждого процесса отображали виртуальные адреса из 0xC0000000
к 0xFFFFFFFF
непосредственно на физические адреса из 0x00000000
к 0x3FFFFFFF
(эти страницы были помечены так, что они были доступны только в кольце 0 — режиме ядра).Это «виртуальные адреса ядра».В соответствии с этой схемой ядро могло напрямую читать и записывать любую ячейку физической памяти без необходимости возиться с MMU для изменения сопоставлений.
В схеме HIGHMEM сопоставления виртуальных адресов ядра с физическими адресами не фиксированы — части физической памяти отображаются в виртуальном адресном пространстве ядра и за его пределами, поскольку ядру необходим доступ к этой памяти.Это позволяет использовать больше физической памяти, но за счет необходимости постоянно менять сопоставления виртуального и физического, что является довольно дорогостоящей операцией.
Другие советы
Отображение 1 ГБ ядра в каждом процессе позволяет процессам переключаться в режим ядра без выполнения переключения контекста.Ответы на системные вызовы, такие как read()
, mmap()
а другие затем могут быть соответствующим образом обработаны в адресном пространстве вызывающего процесса.
Если бы пространство для ядра не было зарезервировано в каждом процессе, переключение в «режим ядра» между выполнением кода пользовательского пространства было бы более дорогостоящим и не позволило бы использовать сопоставление виртуальных адресов через аппаратный MMU (блок управления памятью) для системных вызовов. обслуживается.
Системы с 32-битным ядром и физической памятью более 1 ГБ могут назначать ячейки физической памяти в ZONE_HIGHMEM
(примерно выше отметки 1 ГБ), что может потребовать от ядра выполнения определенных операций для взаимодействия с ними.Добавление PAE (расширение физического адреса) расширяет эту проблему, позволяя использовать до 64 ГБ физической памяти, уменьшая соотношение памяти в пределах 1 ГБ физической адресной памяти к областям, выделенным в ZONE_HIGHMEM
.