Аппаратное обеспечение обеспечивает Блок управления памятью .Это часть схемы, которая может перехватывать и изменять любой доступ к памяти.Всякий раз, когда процессор обращается к ОЗУ, например, чтобы прочитать следующую команду для выполнения или как доступ к данным, инициированный инструкцией, он делает это по некоторому адресу , который, грубо говоря, является 32-битным значением.32-разрядное слово может иметь чуть более 4 миллиардов различных значений, поэтому адресное пространство составляет 4 ГБ: это число байтов, которые могут иметь уникальный адрес.
Таким образом, процессор отправляет запрос в свою подсистему памяти, как «получить байт по адресу x и вернуть его мне».Запрос проходит через MMU, который решает, что делать с запросом.MMU фактически разделяет пространство 4 ГБ на страниц ;размер страницы зависит от используемого оборудования, но типичные размеры составляют 4 и 8 кБ.MMU использует таблицы, которые сообщают ему, что делать с доступом к каждой странице: либо доступ предоставляется с переписанным адресом (запись на странице гласит: «Да, страница, содержащая адрес x , существует, она находится вфизическая память по адресу y") или отклонена, после чего ядро вызывается для дальнейшей обработки.Ядро может решить уничтожить нарушающий процесс или выполнить некоторую работу и изменить таблицы MMU, чтобы можно было повторить попытку доступа, на этот раз успешно.
Это основа для виртуальной памяти : с точки зрения, процесс имеет некоторое ОЗУ, но ядро переместило его на жесткий диск, в «пространство подкачки».Соответствующая таблица помечается как «отсутствующая» в таблицах MMU.Когда процесс получает доступ к своим данным, MMU вызывает ядро, которое извлекает данные из свопа, помещает их обратно в некоторое свободное пространство в физической памяти и изменяет таблицы MMU так, чтобы они указывали на это пространство.Затем ядро возвращается к коду процесса, прямо по инструкции, которая запустила все это.Код процесса не видит ничего общего с бизнесом, за исключением того, что доступ к памяти занял довольно много времени.
MMU также обрабатывает права доступа, которые не позволяют процессу читать или записывать данные, принадлежащие другим процессам, илиядро.Каждый процесс имеет свой собственный набор таблиц MMU, и ядро управляет этими таблицами.Таким образом, каждый процесс имеет свое собственное адресное пространство, как если бы он был один на машине с 4 ГБ ОЗУ, за исключением того, что процесс не имел доступа к памяти, которую он не выделял по праву из ядра, поскольку соответствующие страницы помеченыкак отсутствует или запрещено.
Когда ядро вызывается через системный вызов какого-либо процесса, код ядра должен выполняться в адресном пространстве процесса;поэтому код ядра должен находиться где-то в адресном пространстве каждого процесса (но защищенный: таблицы MMU препятствуют доступу к памяти ядра из непривилегированного пользовательского кода).Поскольку код может содержать жестко закодированные адреса, ядру лучше быть по адресу с одинаковым для всех процессов;условно в Linux этот адрес равен 0xC0000000.Таблицы MMU для каждого процесса отображают эту часть адресного пространства в любые блоки физических RAM, которые ядро фактически загружало при загрузке.Обратите внимание, что память ядра никогда не выгружается (если сам код, который может считывать данные из пространства подкачки, сам поменяется, все станет довольно быстро).
На ПК все может быть немного большесложный, потому что есть 32-битный и 64-битный режимы, и регистры сегментов, и PAE (который действует как своего рода MMU второго уровня с огромными страницами).Основная концепция остается неизменной: каждый процесс получает свое собственное представление о виртуальном адресном пространстве 4 ГБ, а ядро использует MMU для сопоставления каждой виртуальной страницы с соответствующей физической позицией в ОЗУ или вообще нигде.