Как мне реализовать управление памятью в ядре? - PullRequest
1 голос
/ 23 февраля 2020

Я не могу полностью понять, как реализовать виртуальную память и как выделить ее для ядра и процессов. Теперь меня интересует, как реализовать управление памятью на уровне ядра.

Как мне это представить: 1. Разделите доступную оперативную память на равные блоки (фреймы) по 4 КБ. 2. Затем, если мы хотим выделить определенный объем памяти для переменной в ядре, мы ищем определенное количество блоков (кадров) в памяти, общий размер которых не меньше, чем запрошенный объем памяти. Затем мы вводим адрес первого блока, количество блоков в определенной таблице и даем адрес первого блока для данных этого процесса.

И будет ли оптимальным go через все страницы памяти каждый раз в поисках свободной памяти? Правильно ли давать всю страницу сразу, если требуемый объем небольшой?

Как все это реализовать? В чем я не прав?

1 Ответ

1 голос
/ 02 марта 2020

Не совсем. Чтобы выделить определенное количество страниц, которые находятся непосредственно (друг за другом) в (виртуальной) памяти, мы сначала просим наш менеджер физической памяти (pmm) выделить несколько «случайных» страниц (то есть не позади друг друга). Затем каждая отдельная страница передается нашему менеджеру виртуальной памяти (vmm). У vmm есть указатель на текущий каталог страниц, который сам содержит несколько таблиц страниц. Таблица страниц содержит физический адрес (выровненный 4k) для каждого виртуального адреса, который он охватывает. Если мы теперь хотим сопоставить физический адрес с виртуальным адресом, мы можем сделать это путем вычисления индекса в каталоге страниц и в итоговой таблице страниц и установки правильных битов. Если мы теперь отображаем наши «случайно» распределенные страницы прямо друг за другом, у нас есть замечательный блок памяти только для нас самих. Теперь, если вы хотите переключаться между n процессами, вы можете просто поменять каталог текущей страницы.

Подводя итог, можно сказать, что vmm: Top level - это массив массивов физических адресов. Индекс каждого адреса сообщает ЦП, какой виртуальный адрес сопоставить. Кроме того, каждый массив содержит некоторые метаданные доступа.

Если вы хотите узнать больше, не стесняйтесь читать это , если вы еще этого не сделали.

...