stringtranslate.com

Блок управления памятью

MMU 68451 , который можно использовать с Motorola 68010

Блок управления памятью ( MMU ), иногда называемый блоком управления страничной памятью ( PMMU ), [1] представляет собой аппаратное устройство компьютера , которое проверяет все ссылки на память на шине памяти , преобразуя эти запросы, известные как адреса виртуальной памяти , в физические адреса в основной памяти .

В современных системах программы обычно имеют адреса, которые обращаются к теоретическому максимуму памяти компьютерной архитектуры , 32 или 64 бита. MMU отображает адреса из каждой программы в отдельные области физической памяти, которые, как правило, намного меньше теоретического максимума. Это возможно, поскольку программы редко используют большие объемы памяти в любой момент времени.

Большинство современных операционных систем (ОС) работают совместно с MMU для обеспечения поддержки виртуальной памяти (VM). MMU отслеживает использование памяти в блоках фиксированного размера, известных как страницы , и если программа ссылается на местоположение на странице, которое не находится в физической памяти, MMU вызовет прерывание в операционной системе . Затем ОС выберет менее используемый блок в памяти, запишет его в резервное хранилище , например, на жесткий диск, если он был изменен с момента считывания, прочитает страницу из резервного хранилища в этот блок и настроит MMU для сопоставления блока с первоначально запрошенной страницей, чтобы программа могла ее использовать. Это известно как подкачка по требованию .

Современные MMU обычно выполняют также дополнительные задачи, связанные с памятью. Защита памяти блокирует попытки программы получить доступ к памяти, которую она ранее не запрашивала, что не позволяет программе-неправильно вести себя израсходовать всю память или вредоносному коду считывать данные из другой программы. Они также часто управляют кэшем процессора , который хранит недавно использованные данные в очень быстрой памяти и, таким образом, снижает необходимость обращения к более медленной основной памяти. В некоторых реализациях они также отвечают за арбитраж шины , контролируя доступ к шине памяти среди многих частей компьютера, которые хотят получить доступ.

До того, как системы VM стали широко распространены в 1990-х годах, более ранние конструкции MMU были более разнообразными. Распространенной среди них была страничная трансляция, которая была похожа на современную страничную трансляцию по требованию тем, что использовала блоки фиксированного размера, но имела список страниц фиксированного размера, которые разделяли память; это означало, что размер блока был функцией количества страниц и установленной памяти. Другой распространенной техникой, встречающейся в основном на более крупных машинах, была сегментированная трансляция, которая позволяла использовать блоки памяти переменного размера, которые лучше отображались на запросы программ. Это было эффективно, но не отображалось так же хорошо на виртуальную память. Некоторые ранние системы, особенно 8-битные системы, использовали очень простые MMU для переключения банков .

Обзор

Схема работы MMU [2] : 186 и далее. 

Современные MMU обычно делят виртуальное адресное пространство (диапазон адресов, используемых процессором) на страницы , каждая из которых имеет размер, являющийся степенью числа 2, обычно несколько килобайт , но они могут быть и намного больше. Программы ссылаются на память, используя естественный размер адреса машины, обычно 32 или 64 бита в современных системах. Нижние биты адреса (смещение внутри страницы) остаются неизменными. Верхние биты адреса являются номерами виртуальных страниц. [3]

Большинство MMU используют таблицу элементов в памяти, называемую таблицей страниц , содержащую одну запись таблицы страниц (PTE) на виртуальную страницу, для сопоставления номеров виртуальных страниц с номерами физических страниц в основной памяти. Многоуровневые таблицы страниц часто используются для уменьшения размера таблицы страниц. Ассоциативный кэш PTE называется буфером трансляции (TLB) и используется для избежания необходимости доступа к основной памяти каждый раз, когда отображается виртуальный адрес. [4]

Другие MMU могут иметь частный массив памяти, [5] регистры [6] или статическую оперативную память [7] , которая содержит набор информации о сопоставлении.

Номер виртуальной страницы может быть напрямую использован в качестве индекса в таблице страниц или другой информации о сопоставлении, или он может быть дополнительно разделен, при этом биты на данном уровне используются в качестве индекса в таблице таблиц более низкого уровня, в которой биты на следующем уровне ниже используются в качестве индекса, с двумя или более уровнями индексации.

Номер физической страницы объединяется со смещением страницы, чтобы получить полный физический адрес. [3]

Запись таблицы страниц или другая информация о странице может также включать информацию о том, была ли страница записана ( грязный бит ), когда она последний раз использовалась ( бит доступа для алгоритма замены страниц , которые использовались как наименее недавно (LRU) ), какие процессы ( пользовательский режим или режим супервизора ) могут читать и записывать ее, и следует ли ее кэшировать . [8]

Иногда запись таблицы страниц или другая информация о странице запрещает доступ к определенной виртуальной странице, возможно, потому что для этой виртуальной страницы не выделена физическая память с произвольным доступом (RAM). В этом случае MMU сигнализирует процессору об ошибке страницы . Затем операционная система (ОС) обрабатывает ситуацию, возможно, пытаясь найти свободный кадр RAM и настроить карту страниц для ее сопоставления с запрошенным виртуальным адресом. Если свободной памяти нет, может потребоваться выбрать существующую страницу (известную как жертва ) , используя некий алгоритм замены , и сохранить ее на диске (процесс, называемый подкачкой ). В некоторых MMU также может быть нехватка PTE, и в этом случае ОС должна будет освободить одну для нового сопоставления. [8] [3]

MMU также может генерировать ошибки несанкционированного доступа или ошибки недействительной страницы при несанкционированном или несуществующем доступе к памяти, что приводит к ошибкам сегментации или ошибкам шины при обработке операционной системой.

Преимущества

VLSI VI475 MMU Apple HMMU из Macintosh II, используемый с Motorola 68020

В некоторых случаях ошибка страницы может указывать на программную ошибку , которую можно предотвратить, используя защиту памяти как одно из ключевых преимуществ MMU: операционная система может использовать ее для защиты от ошибочных программ, запрещая доступ к памяти, к которой конкретная программа не должна иметь доступа. Обычно операционная система назначает каждой программе свое собственное виртуальное адресное пространство. [3]

Страничный MMU также смягчает проблему внешней фрагментации памяти. После того, как блоки памяти были выделены и освобождены, свободная память может стать фрагментированной (прерывистой), так что самый большой непрерывный блок свободной памяти может быть намного меньше общего объема. С виртуальной памятью непрерывный диапазон виртуальных адресов может быть сопоставлен нескольким ненепрерывным блокам физической памяти; это ненепрерывное выделение является одним из преимуществ страничного обмена . [8] [3]

Однако страничное отображение вызывает другую проблему — внутреннюю фрагментацию . Это происходит, когда программа запрашивает блок памяти, который не отображается чисто на страницу, например, если программа запрашивает буфер размером 1 КБ для выполнения работы с файлом. В этом случае запрос приводит к тому, что вся страница отводится в сторону, хотя только 1 КБ страницы будет когда-либо использован; если страницы больше 1 КБ, оставшаяся часть страницы тратится впустую. Если делается много небольших распределений такого рода, память может быть использована, хотя большая ее часть остается пустой. [4]

В некоторых ранних конструкциях микропроцессоров управление памятью выполнялось отдельной интегральной схемой, такой как VLSI Technology VI475 (1986), Motorola 68851 (1984), используемой с процессором Motorola 68020 в Macintosh II , или Z8010 [9] и Z8015 (1985) [10] [11], используемых с семейством процессоров Zilog Z8000 . Более поздние микропроцессоры (такие как Motorola 68030 и Zilog Z280 ) помещали MMU вместе с процессором на одну интегральную схему, как это делали Intel 80286 и более поздние микропроцессоры x86 .

Старые концепции

Хотя эта статья концентрируется на современных MMU, обычно основанных на страничном доступе по требованию, ранние системы использовали адресацию базы и границ , которая в дальнейшем развилась в сегментацию , или использовали фиксированный набор блоков вместо загрузки их по требованию. Разница между этими двумя подходами заключается в размере непрерывного блока памяти; страничные системы разбивают основную память на ряд блоков одинакового размера, в то время как сегментированные системы обычно допускают переменные размеры. [4]

Сегментированный перевод

Ранние системы управления памятью, часто реализованные в программном обеспечении, выделяли часть памяти для хранения ряда отображений. Они состояли из пар значений, базы и предела , хотя использовались и многие другие термины. Когда операционная система запрашивала память для загрузки программы или программа запрашивала больше памяти для хранения данных из файла, например, она вызывала библиотеку обработки памяти . Она проверяла отображения, чтобы найти область в основной памяти, достаточно большую для хранения запроса. Если такой блок был найден, в таблицу вносилась новая запись. С этого момента, когда эта программа обращалась к памяти, все ее адреса смещались на базовое значение. Когда программа заканчивала работу с запрошенной памятью и освобождала ее, или программа завершала работу, связанные с ней записи освобождались. [4]

Этот стиль доступа со временем стал обычным на рынке мэйнфреймов [ требуется ссылка ] и был известен как сегментированная трансляция , хотя здесь также используются различные термины. Этот стиль имеет преимущество простоты; блоки памяти являются непрерывными, и поэтому необходимо хранить только два значения, базовое и предельное. Каждая запись соответствует блоку памяти, используемому одной программой, а трансляция невидима для программы, которая видит основную память, начинающуюся с адреса ноль и простирающуюся до некоторого фиксированного значения. [4]

Недостатком этого подхода является то, что он приводит к эффекту, известному как внешняя фрагментация . Это происходит, когда выделяемая память освобождается, но не является непрерывной. В этом случае может быть достаточно памяти для обработки запроса, но она разбросана и не может быть выделена. В системах, где программы запускаются и останавливаются с течением времени, это может в конечном итоге привести к тому, что память будет сильно фрагментирована и не останется больших блоков. Для решения этой проблемы был разработан ряд алгоритмов. [4]

Сегментация широко использовалась на платформах микрокомпьютеров 1980-х годов. Среди MMU, которые использовали эту концепцию, были Motorola 68451 и Signetics 68905, [4] но существует много других примеров. Она также поддерживалась в программных реализациях; одним из примеров является MultiFinder от Apple , выпущенный в 1987 году для платформы Macintosh . Каждой программе выделялся объем памяти, который был предварительно выбран в Finder , а перевод из виртуальной в физическую выполнялся внутри программ с использованием дескрипторов . [12]

Более распространенным примером является Intel 8088, используемый в IBM PC . Он реализовал очень простой MMU внутри ЦП с четырьмя регистрами процессора , содержащими базовые значения, к которым программа обращалась напрямую. Они отображали только верхние 4 бита 20-битного адреса, и не было эквивалента предела, который представлял собой просто нижние 16 бит адреса и, таким образом, фиксированные 64 КБ. [13] Более поздние записи в серии архитектуры x86 использовали другие подходы.

Сегментация плюс пейджинг

Некоторые системы, такие как GE 645 и ее последователи, использовали как сегментацию, так и разбиение на страницы. Таблица сегментов, вместо того, чтобы содержать записи по сегментам, дающие физический базовый адрес и длину сегмента, содержит записи, дающие физический базовый адрес таблицы страниц для сегмента, в дополнение к длине сегмента. Физическая память разделена на страницы фиксированного размера, и те же методы, которые использовались для чисто страничного разбиения по запросу, используются для сегментно- и страничного разбиения по запросу.

Постраничный перевод

Другой подход к работе с памятью заключается в разбиении основной памяти на непрерывную серию блоков фиксированного размера. Это похоже на современную систему страничного обмена по требованию, в которой результатом является серия страниц, но в этих более ранних системах список страниц был фиксированного размера и обычно хранился в какой-либо форме быстрой памяти, например, в статической оперативной памяти, для повышения производительности. В этом случае две части адреса, хранящиеся в MMU, известны как номер сегмента и индекс страницы . [4]

Рассмотрим конструкцию процессора с 24-битной адресацией, например, оригинальный Motorola 68000. В такой системе MMU разбивает виртуальный адрес на части, например, 13 наименее значимых бит для индекса страницы и оставшиеся 11 наиболее значимых бит как номер сегмента. Это приводит к списку из 2048 страниц по 8 КБ каждая. [4] При таком подходе запросы памяти приводят к предоставлению одной или нескольких страниц этой программе, которые могут не быть смежными в основной памяти. MMU поддерживает список номеров страниц, первоначально выраженных программой, и фактических номеров страниц в основной памяти. Когда он пытается получить доступ к памяти, MMU считывает номер сегмента с шины памяти процессора, находит соответствующую запись для этой программы во внутренней памяти и выражает отображенную версию значения на шине памяти, в то время как младшие биты исходного адреса передаются без изменений. Как и в случае сегментации, программы видят свою память как один непрерывный блок. [4]

У этого подхода есть два недостатка. Во-первых, по мере расширения виртуального адресного пространства увеличивается и объем памяти, необходимой для хранения отображения. Например, в 68020 адреса имеют ширину 32 бита, то есть номер сегмента для того же размера страницы 8 КБ теперь составляет верхние 19 бит, а таблица отображения расширяется до размера 512 КБ, [4] намного больше того, что можно было реализовать на оборудовании за разумные деньги в 1980-х годах. Эту проблему можно уменьшить, сделав страницы больше, скажем, 64 КБ вместо 8. Теперь индекс страницы использует 16 бит, а результирующая таблица страниц составляет 64 КБ, что более податливо. Переход к большему размеру страницы приводит ко второй проблеме — повышенной внутренней фрагментации. Программе, которая генерирует ряд запросов на небольшие блоки, будут назначены большие блоки, и тем самым будет тратиться большой объем памяти. [4]

Подход страничного перевода широко использовался микропроцессорными MMU в 1970-х и начале 80-х годов, включая Signetics 68905 (который мог работать в любом режиме). И Signetics, и Philips выпустили версию 68000, которая объединяла 68905 на одном физическом чипе, 68070. [4]

Другое применение этой техники — расширение размера физического адреса, когда виртуальный адрес слишком мал. Например, изначально PDP-11 имел 16-битный адрес, что делало его слишком маленьким, поскольку размеры памяти увеличились в 1970-х годах. Это было решено путем расширения физической шины памяти до 18 бит и использования MMU для добавления еще двух бит на основе других контактов на шине процессора , чтобы указать, какая программа обращается к памяти. [14]

Другое использование этой же техники, хотя и не называемое страничным доступом, а переключением банков , широко использовалось ранними 8-битными микропроцессорами, такими как MOS 6502. Например, Atari MMU выражал дополнительные биты на адресной шине для выбора среди нескольких банков памяти DRAM на основе того, какой из чипов был активен в данный момент, обычно CPU или ANTIC . Это использовалось для расширения доступной памяти на Atari 130XE до 128 КБ. [15] Commodore 128 использовал аналогичный подход.

Примеры

Большинство современных систем делят память на страницы размером 4–64 КБ , часто с возможностью использования так называемых огромных страниц размером 2 МБ или 1 ГБ (часто возможны оба варианта). Переводы страниц кэшируются в буфере поиска перевода (TLB). Некоторые системы, в основном старые конструкции RISC , попадают в ОС, когда перевод страницы не найден в TLB. Большинство систем используют аппаратный обходчик дерева. Большинство систем позволяют отключать MMU, но некоторые отключают MMU при попадании в код ОС.

IBM System/360 Model 67, IBM System/370 и их преемники

IBM System/360 Model 67 , представленная в августе 1965 года, включала MMU, называемый блоком динамической трансляции адресов (DAT). [16] [17] Он имеет необычную функцию хранения доступных и грязных битов вне таблицы страниц (вместе с четырехбитным ключом защиты для всех процессоров S/360). Они относятся к физической памяти, а не к виртуальной, и к ним обращаются с помощью специальных инструкций. [17] Это снижает накладные расходы для ОС, которой в противном случае пришлось бы распространять доступные и грязные биты из таблиц страниц в более физически ориентированную структуру данных. Это упрощает виртуализацию на уровне ОС , позже названную паравиртуализацией .

Начиная с августа 1972 года, IBM System/370 имеет похожий MMU, хотя изначально он поддерживал только 24-битное виртуальное адресное пространство вместо 32-битного виртуального адресного пространства System/360 Model 67. Он также хранит доступные и грязные биты вне таблицы страниц. В начале 1983 года архитектура System/370-XA расширила виртуальное адресное пространство до 31 бита, а в 2000 году была представлена ​​64-битная z/Architecture с адресным пространством, расширенным до 64 бит; они продолжают хранить доступные и грязные биты вне таблицы страниц.

ВАКС

Страницы VAX имеют размер 512 байт, [18] : 199  , что очень мало. Операционная система может обрабатывать несколько страниц так, как если бы они были одной большой страницей. Например, Linux на VAX группирует восемь страниц вместе. Таким образом, система рассматривается как имеющая страницы размером 4 КБ . VAX делит память на четыре области фиксированного назначения, каждая размером 1 ГБ . Они следующие: [18] : 200–201 

Пространство P0
Используется для универсальной памяти для каждого процесса, например, кучи.
Пространство P1
(Или пространство управления), которое также является попроцессным и обычно используется для супервизора, исполнительного, ядра , пользовательских стеков и других структур управления попроцессами, управляемых операционной системой.
S0 пространство
(Или системное пространство), которое является глобальным для всех процессов и хранит код и данные операционной системы, независимо от того, выгружаются они на страницу или нет, включая таблицы страниц.
Пространство S1
Который не используется и «зарезервирован для цифровых технологий ». [18] : 200–201 

Таблицы страниц представляют собой большие линейные массивы. [18] : 209–215  Обычно это было бы очень расточительно, когда адреса используются на обоих концах возможного диапазона, но таблицы страниц для пространства P0 и P1 хранятся в страничном пространстве S0. [18] : 211–212  Таким образом, фактически существует двухуровневое дерево , позволяющее приложениям иметь разреженную структуру памяти, не тратя много места на неиспользуемые записи таблицы страниц. В отличие от записей таблицы страниц в большинстве MMU, записи таблицы страниц в VAX MMU не имеют доступного бита. [18] : 203–205  Операционные системы, реализующие подкачку страниц, должны найти какой-то способ эмулировать доступный бит, если они хотят работать эффективно. Обычно ОС периодически отменяет отображение страниц, чтобы можно было использовать ошибки отсутствия страницы, чтобы ОС могла установить доступный бит.

РУКА

Процессоры приложений на базе архитектуры ARM реализуют MMU, определенный архитектурой системы виртуальной памяти ARM. Текущая архитектура определяет PTE для описания страниц размером 4 КБ и 64 КБ , разделов размером 1 МБ и суперразделов размером 16 МБ ; устаревшие версии также определяли крошечную страницу размером 1 КБ . ARM использует двухуровневую таблицу страниц, если использует страницы размером 4 КБ и 64 КБ , или просто одноуровневую таблицу страниц для разделов размером 1 МБ и разделов размером 16 МБ .

Обновления TLB выполняются автоматически с помощью оборудования для обхода таблицы страниц. PTE включают разрешение на чтение/запись на основе привилегий, информацию о кэшировании, бит NX и незащищенный бит. [19]

ДЭК Альфа

Процессоры DEC Alpha делят память на 8 КБ , 16 КБ , 32 КБ или 64 КБ ; размер страницы зависит от процессора. [20] : 3–2  [21] : 3–2  страницы. После промаха TLB низкоуровневый машинный код прошивки (здесь называемый PALcode ) проходит по таблице страниц.

OpenVMS AXP PALcode и DEC OSF/1 PALcode обходят трехуровневую древовидную таблицу страниц. Адреса разбиваются на неиспользуемый набор битов (содержащий то же значение , что и самый верхний бит индекса в корневом уровне дерева), набор битов для индексации корневого уровня дерева, набор битов для индексации среднего уровня дерева, набор битов для индексации листового уровня дерева и оставшиеся биты, которые проходят через физический адрес без изменений, индексируя байт на странице. Размеры полей зависят от размера страницы; все три поля индекса дерева имеют одинаковый размер. [20] : 3-2–3-3  [21] : 3-1–3-2  OpenVMS AXP PALcode поддерживает полные биты разрешений на чтение и запись для режимов пользователя, супервизора, руководителя и ядра, а также поддерживает биты сбоя при чтении/записи/выполнении. [20] : 3-3–3-6  DEC OSF/1 PALcode поддерживает полные биты разрешений на чтение и запись для режимов пользователя и ядра, а также поддерживает биты сбоя при чтении/записи/выполнении. [21] : (II-B) 3-3-3-6 

Код Windows NT AXP PALcode может проходить по одноуровневой таблице страниц в виртуальном адресном пространстве или по двухуровневой таблице страниц в физическом адресном пространстве. Верхние 32 бита адреса игнорируются. Для одноуровневой таблицы страниц адреса разбиваются на набор бит для индексации таблицы страниц и оставшиеся биты, которые проходят по физическому адресу без изменений, индексируя байт внутри страницы. Для двухуровневой таблицы страниц адреса разбиваются на набор бит для индексации корневого уровня дерева, набор бит для индексации верхнего уровня дерева, набор бит для индексации листового уровня дерева и оставшиеся биты, которые проходят по физическому адресу без изменений, индексируя байт внутри страницы. Размеры полей зависят от размера страницы. [22] : 3-2–3-4  Код Windows NT AXP PALcode поддерживает страницу, доступную только из режима ядра или доступную из пользовательского и режима ядра, а также поддерживает бит ошибки записи. [22] : 3-5 

MIPS

Архитектура MIPS поддерживает от одной до 64 записей в TLB. Количество записей TLB настраивается при настройке ЦП перед синтезом. Записи TLB являются двойными. Каждая запись TLB сопоставляет номер виртуальной страницы (VPN2) с одним из двух номеров кадров страницы (PFN0 или PFN1) в зависимости от младшего бита виртуального адреса, который не является частью маски страницы . Этот бит и биты маски страницы не хранятся в VPN2. Каждая запись TLB имеет свой собственный размер страницы, который может быть любым значением от 1 КБ до 256 МБ , кратным четырем. Каждый PFN в записи TLB имеет атрибут кэширования, грязный и допустимый биты состояния. VPN2 имеет глобальный бит состояния и назначенный ОС идентификатор, который участвует в сопоставлении записи TLB виртуального адреса, если глобальный бит состояния установлен в ноль. PFN хранит физический адрес без битов маски страницы.

Исключение пополнения TLB генерируется, когда в TLB нет записей, соответствующих сопоставленному виртуальному адресу. Исключение недействительного TLB генерируется, когда есть совпадение, но запись помечена как недействительная. Исключение измененного TLB генерируется, когда инструкция сохранения ссылается на сопоставленный адрес, а грязный статус соответствующей записи не установлен. Если исключение TLB возникает при обработке исключения TLB, исключения двойной ошибки TLB, оно отправляется в свой собственный обработчик исключений .

MIPS32 и MIPS32r2 поддерживают 32 бита виртуального адресного пространства и до 36 бит физического адресного пространства. MIPS64 поддерживает до 64 бит виртуального адресного пространства и до 59 бит физического адресного пространства.

Солнце ММУ

Оригинальный Sun-1 — это одноплатный компьютер, построенный на базе микропроцессора Motorola 68000 и представленный в 1982 году. Он включает в себя оригинальный блок управления памятью Sun 1, который обеспечивает трансляцию адресов, защиту памяти, совместное использование памяти и распределение памяти для нескольких процессов, работающих на ЦП. Весь доступ ЦП к частной встроенной оперативной памяти, внешней памяти Multibus , встроенному вводу -выводу и вводу-выводу Multibus осуществляется через MMU, где трансляция адресов и защита выполняются единообразно. MMU реализован аппаратно на плате ЦП.

MMU состоит из регистра контекста, карты сегмента и карты страницы. Виртуальные адреса из ЦП транслируются в промежуточные адреса картой сегмента, которые, в свою очередь, транслируются в физические адреса картой страницы. Размер страницы составляет 2 КБ , а размер сегмента — 32 КБ , что дает 16 страниц на сегмент. Одновременно может быть отображено до 16 контекстов. Максимальное логическое адресное пространство для контекста составляет 1024 страницы или 2 МБ. Максимальный физический адрес, который может быть отображен одновременно, также составляет 2 МБ.

Регистр контекста важен в многозадачной операционной системе, поскольку он позволяет ЦП переключаться между процессами без перезагрузки всей информации о состоянии трансляции. 4-битный регистр контекста может переключаться между 16 разделами карты сегмента под управлением супервизора, что позволяет отображать 16 контекстов одновременно. Каждый контекст имеет свое собственное виртуальное адресное пространство. Совместное использование виртуального адресного пространства и межконтекстные коммуникации могут быть обеспечены путем записи тех же значений в карты сегмента или страницы различных контекстов. Дополнительные контексты могут быть обработаны путем обработки карты сегмента как кэша контекста и замены устаревших контекстов на основе наиболее редко используемых.

Регистр контекста не делает различий между состояниями пользователя и супервизора. Прерывания и ловушки не переключают контексты, что требует, чтобы все допустимые векторы прерываний всегда отображались на странице 0 контекста, а также допустимый стек супервизора. [23]

Рабочие станции Sun-2 похожи; они построены на базе микропроцессора Motorola 68010 и имеют схожий блок управления памятью с 2 КБ страницами и 32 КБ сегментами. Регистр контекста имеет 3-битный системный контекст, используемый в состоянии супервизора, и 3-битный пользовательский контекст, используемый в состоянии пользователя. [24]

Рабочие станции Sun-3 , за исключением Sun-3/80, Sun-3/460, Sun-3/470 и Sun-3/480, построены на базе Motorola 68020 и имеют схожий блок управления памятью. Размер страницы увеличен до 8 КБ . (Более поздние модели построены на базе Motorola 68030 и используют встроенный в 68030 MMU.)

Рабочие станции Sun-4 построены на базе различных микропроцессоров SPARC и имеют блок управления памятью, аналогичный блоку рабочих станций Sun-3.

PowerPC

В PowerPC G1, G2, G3 и G4 страницы обычно имеют размер 4 КБ. После промаха TLB стандартный PowerPC MMU начинает два одновременных поиска. Один поиск пытается сопоставить адрес с одним из четырех или восьми регистров трансляции адресов блоков данных (DBAT) или четырех или восьми регистров трансляции адресов блоков инструкций (IBAT), в зависимости от ситуации. Регистры BAT могут отображать линейные фрагменты памяти размером до 256 МБ и обычно используются ОС для отображения больших частей адресного пространства для собственного использования ядра ОС. Если поиск BAT успешен, другой поиск останавливается и игнорируется.

Другой поиск, напрямую не поддерживаемый всеми процессорами этого семейства, осуществляется через так называемую инвертированную таблицу страниц , которая действует как хэшированное внечиповое расширение TLB. Во-первых, верхние четыре бита адреса используются для выбора одного из 16 сегментных регистров. Затем 24 бита из сегментного регистра заменяют эти четыре бита, создавая 52-битный адрес. Использование сегментных регистров позволяет нескольким процессам совместно использовать одну и ту же хэш-таблицу .

52-битный адрес хэшируется, затем используется в качестве индекса в таблице вне чипа. Там группа из восьми записей таблицы сканируется на предмет совпадения. Если ни одна из них не совпадает из-за чрезмерных коллизий хэша , процессор пытается снова с немного другой хэш-функцией . Если и это не удается, ЦП переходит в ОС (с отключенным MMU), чтобы проблема могла быть решена. ОС должна удалить запись из хэш-таблицы, чтобы освободить место для новой записи. ОС может сгенерировать новую запись из более обычной древовидной таблицы страниц или из структур данных per-mapping, которые, вероятно, будут медленнее и более компактными. Поддержка управления без выполнения находится в сегментных регистрах, что приводит к гранулярности 256 МБ .

Основная проблема этой конструкции — плохая локальность кэша , вызванная хэш-функцией. Древовидные конструкции избегают этого, размещая записи таблицы страниц для смежных страниц в смежных местах. Операционная система, работающая на PowerPC, может минимизировать размер хэш-таблицы, чтобы уменьшить эту проблему.

Также довольно медленно удалять записи таблицы страниц процесса. ОС может избегать повторного использования значений сегментов, чтобы отсрочить решение этой проблемы, или может решить пострадать от траты памяти, связанной с хэш-таблицами для каждого процесса. Чипы G1 не ищут записи таблицы страниц, но они генерируют хэш, ожидая, что ОС будет искать стандартную хэш-таблицу с помощью программного обеспечения. ОС может записывать в TLB. Чипы G2, G3 и ранние чипы G4 используют аппаратное обеспечение для поиска в хэш-таблице. Последние чипы позволяют ОС выбирать любой из методов. На чипах, которые делают это необязательным или вообще не поддерживают его, ОС может выбрать использование исключительно древовидной таблицы страниц.

IA-32 / x86

Архитектура x86 развивалась в течение очень долгого времени, сохраняя полную совместимость программного обеспечения, даже для кода ОС. Таким образом, MMU чрезвычайно сложен, с множеством различных возможных режимов работы. Нормальная работа традиционного ЦП 80386 и его преемников ( IA-32 ) описана здесь.

Процессор в первую очередь делит память на страницы по 4 КБ . Регистры сегментов, фундаментальные для старых конструкций MMU 8088 и 80286 , не используются в современных ОС, за одним важным исключением: доступ к данным, специфичным для потока , для приложений или к данным, специфичным для процессора, для ядер ОС, что осуществляется с явным использованием регистров сегментов FS и GS. Весь доступ к памяти включает в себя регистр сегмента, выбираемый в соответствии с исполняемым кодом. Регистр сегмента действует как индекс в таблице, которая обеспечивает смещение, добавляемое к виртуальному адресу. За исключением случаев использования FS или GS, ОС гарантирует, что смещение будет равно нулю.

После добавления смещения адрес маскируется так, чтобы он не превышал 32 бита. Результат можно найти с помощью древовидной таблицы страниц, при этом биты адреса будут разделены следующим образом: 10 бит для ветви дерева, 10 бит для листьев ветви и 12 младших бит будут напрямую скопированы в результат. Некоторые операционные системы, такие как OpenBSD с функцией W^X и Linux с патчами Exec Shield или PaX , также могут ограничивать длину сегмента кода, как указано в регистре CS, чтобы запретить выполнение кода в изменяемых областях адресного пространства.

Незначительные изменения MMU, представленные в Pentium, позволили создавать очень большие страницы размером 4 МБ , пропуская нижний уровень дерева (это оставляет 10 бит для индексации первого уровня иерархии страниц, а оставшиеся 10+12 бит напрямую копируются в результат). Незначительные изменения MMU, представленные в Pentium Pro, представили функцию расширения физического адреса (PAE), позволяющую использовать 36-битные физические адреса с 2+9+9 битами для трехуровневых таблиц страниц и 12 младшими битами, напрямую копируемыми в результат. Большие страницы ( 2 МБ ) также доступны, пропуская нижний уровень дерева (что приводит к 2+9 битам для двухуровневой иерархии таблиц, а оставшиеся 9+12 младших бит копируются напрямую). Кроме того, таблица атрибутов страниц позволяла определять кэшируемость, просматривая несколько старших битов в небольшой таблице на ЦП.

Поддержка no-execute изначально предоставлялась только на основе сегмента, что делало ее очень неудобной в использовании. Более поздние чипы x86 предоставляют бит no-execute на страницу в режиме PAE. Механизмы W^X , Exec Shield и PaX , описанные выше, эмулируют поддержку non-execute на страницу на компьютерах с процессорами x86, не имеющими бита NX, устанавливая длину сегмента кода, что приводит к потере производительности и сокращению доступного адресного пространства.

x86-64

Гетерогенная системная архитектура (HSA) создает единое виртуальное адресное пространство для центральных процессоров, графических процессоров и цифровых сигнальных процессоров, устраняя необходимость в методах сопоставления и копирования данных.

x86-64 — это 64-битное расширение x86, которое почти полностью устраняет сегментацию в пользу плоской модели памяти, используемой почти всеми операционными системами для процессоров 386 или более новых. В длинном режиме все смещения сегментов игнорируются, за исключением сегментов FS и GS. При использовании страниц размером 4 КБ дерево таблицы страниц имеет четыре уровня вместо трех.

Виртуальные адреса делятся следующим образом: 16 бит не используются, по девять бит на четыре уровня дерева (всего 36 бит) и 12 младших бит напрямую копируются в результат. При использовании страниц размером 2 МБ есть только три уровня таблицы страниц, всего 27 бит используются для подкачки и 21 бит смещения. Некоторые новые процессоры также поддерживают страницу размером 1 ГБ с двумя уровнями подкачки и 30 бит смещения. [25]

CPUID можно использовать для определения того, поддерживаются ли страницы размером 1 ГБ . Во всех трех случаях 16 старших бит должны быть равны 48-му биту, или, другими словами, младшие 48 бит расширены по знаку до старших бит. Это делается для того, чтобы обеспечить будущее расширение адресуемого диапазона без ущерба для обратной совместимости. На всех уровнях таблицы страниц запись таблицы страниц включает бит невыполнения .

Альтернативы

Системы Burroughs B5000 series, B6x00/B7x00/B5900/A-series/Unisys MCP

Burroughs B5000 1961 года была первой коммерческой системой, поддерживающей виртуальную память (после Atlas ), не нуждающейся во внешнем MMU. [26] B5000 и ее последователи вплоть до современных систем Unisys ClearPath MCP (Libra) обеспечивают две функции MMU — адреса виртуальной памяти и защиту памяти — с другим архитектурным подходом. Вместо того, чтобы добавлять виртуальную память в процессор, не предназначенный для виртуальной памяти, она интегрируется в основную конструкцию процессора/системы, поэтому нет необходимости во внешнем блоке для добавления функциональности трансляции адресов или проверки границ, что приводит к беспрецедентной безопасности и надежности памяти.

Во-первых, при отображении адресов виртуальной памяти, вместо необходимости в MMU, машины основаны на дескрипторах . [27] [28] Самый верхний бит 48-битного слова памяти в системах серии Burroughs B5000 указывает, является ли слово пользовательскими данными или дескриптором/управляющим словом; дескрипторы были доступны только для чтения пользовательским процессам и могли обновляться только системой (аппаратной или операционной системой). Слова памяти в системах B6x00/B7x00/B5900/A-series/Unisys MCP имеют 48 бит данных и 3 бита тега (а более поздние системы до настоящего времени имеют 4 бита тега), слова, тег которых является нечетным числом, доступны только для чтения пользовательским процессам — дескрипторы имеют тег 5, а кодовые слова имеют тег 3.

Каждому выделенному блоку памяти присваивается главный дескриптор со свойствами блока — физическим адресом, размером и тем, присутствует ли он в основной памяти или нет, в этом случае при первом доступе блок должен быть выделен, или, если есть адрес, это адрес на вторичном хранилище, который должен быть загружен в основную память. Все ссылки на код и данные делаются с помощью дескриптора. Когда делается запрос на доступ к блоку для чтения или записи, оборудование проверяет его наличие с помощью бита присутствия (pbit) в дескрипторе.

Pbit [29] = 1 указывает на наличие блока. В этом случае доступ к блоку можно получить через физический адрес основной памяти в дескрипторе. Если pbit равен нулю, генерируется прерывание pbit [30] для MCP (операционной системы), чтобы сделать блок присутствующим. Если поле адреса равно нулю, это первый доступ к этому блоку, и он выделяется (init (начальный) pbit). Если поле адреса не равно нулю, это адрес на диске блока, который был ранее развернут — блок извлекается с диска, pbit устанавливается в единицу, а адрес физической памяти обновляется, чтобы указывать на блок в памяти. Это делает дескрипторы эквивалентными записи таблицы страниц в системе MMU, но дескрипторы свободны от таблицы.

Производительность системы можно контролировать с помощью количества прерываний pbit, которое представляет собой количество обращений к дескрипторам с нулевым битом. Биты 'Init' pbit указывают на начальные выделения или новые блоки памяти, но высокий уровень 'other' pbits указывает на то, что системе пришлось загрузить блок из вторичного хранилища виртуальной памяти. При нормальной работе это будет происходить нечасто. Если количество других pbits выше среднего, система может пробуксовывать, что указывает на перегрузку системы. В производственных системах загрузка машины будет более постоянной, и, таким образом, система будет сконфигурирована или настроена так, чтобы избежать пробуксовки.

Таким образом, все распределение памяти полностью автоматическое (одна из особенностей современных систем [31] ), и нет способа выделить блоки, кроме этого механизма. Нет таких вызовов, как malloc или dealloc, поскольку блоки памяти также автоматически выделяются при прерывании pbit или отбрасываются. Схема также является ленивой , поскольку блок не будет выделен, пока на него фактически не ссылаются. Когда память почти заполнена, MCP проверяет рабочий набор, пробуя сжатие (поскольку система сегментирована, а не разбита на страницы), освобождая сегменты, доступные только для чтения (например, сегменты кода, которые можно восстановить из их исходной копии) и, в крайнем случае, выкатывая грязные (то есть обновленные) сегменты данных на диск.

Другой способ, которым эти системы обеспечивают функцию MMU, — это защита. Поскольку все доступы осуществляются через дескриптор, оборудование может проверить, что все доступы находятся в пределах границ, а в случае записи — что процесс имеет разрешение на запись. Система MCP изначально безопасна и, таким образом, не нуждается в MMU для обеспечения этого уровня защиты памяти.

Блоки могут совместно использоваться процессами через дескрипторы копирования в стеках процессов (стек — это особая системная структура, представляющая состояние выполнения процесса). Таким образом, некоторые процессы могут иметь разрешение на запись, а другие — нет. Сегменты кода доступны только для чтения, поэтому являются реентерабельными и совместно используются процессами. Дескрипторы копирования содержат 20-битное адресное поле, дающее индекс главного дескриптора в массиве главных дескрипторов. Это также реализует очень эффективный и безопасный механизм межпроцессного взаимодействия (IPC). Блоки можно легко перемещать, поскольку при изменении статуса блока требуется обновление только главного дескриптора.

Другим аспектом является производительность – обеспечивают ли системы на основе MMU или не на основе MMU лучшую производительность? Системы MCP могут быть реализованы поверх стандартного оборудования, которое имеет MMU (например, стандартный ПК). Даже если реализация системы каким-то образом использует MMU, это не будет видно на уровне MCP.

Смотрите также

Ссылки

  1. ^ Блок управления памятью в бесплатном онлайн-словаре по вычислительной технике
  2. ^ Таненбаум, Эндрю С. (2009). Современные операционные системы . Верхняя Сэддл-Ривер (Нью-Джерси): Prentice-Hall. ISBN 978-0-13-600663-3.
  3. ^ abcde Фрэнк Уеда (2009). "Лекция 7: Управление памятью" (PDF) . CSE 120: Принципы операционных систем . Калифорнийский университет в Сан-Диего . Получено 04.12.2013 .
  4. ^ abcdefghijklm Zehr, Gregg (ноябрь 1986 г.). «Модули управления памятью для архитектур 68000» (PDF) . Byte . стр. 127–135.
  5. Руководство по процессору Spectra 70 70-46 (PDF) . RCA . Март 1968. С. 5–6 . Получено 15 августа 2013 г. .
  6. ^ Справочное руководство, компьютер SDS 940 (PDF) . Научные системы данных . 1966. С. 8–10.
  7. Руководство по проектированию оборудования для платы ЦП 2060 (PDF) . Sun Microsystems . 10 мая 1987 г., стр. 121–129.
  8. ^ abc Эта статья основана на материале, взятом из раздела Memory+management+unit в Free On-line Dictionary of Computing до 1 ноября 2008 года и включенном в соответствии с условиями «перелицензирования» GFDL версии 1.3 или более поздней.
  9. ^ "Спецификация продукта блока управления памятью MMU Z8010 Z8000" (PDF) . Zilog . Апрель 1985 г.
  10. ^ "1983/84 Data Book" (PDF) . Zilog. стр. 215–234 . Получено 27.04.2021 .
  11. ^ Шмидт, Стивен (апрель 1983 г.). «Виртуальная память для микрокомпьютеров». Байт . Т. 8, № 4. С. 234–235.
  12. Руководство пользователя MultiFinder . Apple. 1987. С. 20–22, 24.
  13. ^ Декодирование адреса памяти (Технический отчет). Университет Нью-Мексико. 1996.
  14. ^ Белл, Гордон. «Ретроспектива того, чему мы научились у PDP-11».
  15. ^ MCU, блок управления памятью, FREDDIE (технический отчет). Atari. 1983.
  16. ^ "Архивы IBM: даты и характеристики System/360". 03.ibm.com . 23 января 2003 г. Архивировано из оригинала 16 января 2005 г. Получено 2017-05-03 .
  17. ^ ab "IBM System/360 Model 67 Functional Characteristics, Third Edition" (PDF) . Февраль 1972 г. GA27-2719-2 . Получено 29 октября 2021 г. .
  18. ^ abcdef "Глава 4 Управление памятью". Справочное руководство по архитектуре VAX (PDF) . Digital Equipment Corporation . 1987. ISBN 0-932376-86-X. EY-3459E-DP.
  19. ^ "Cortex-A8 Technical Reference Manual" (PDF) . Infoventer.arm.com . Получено 2017-05-03 .
  20. ^ abc "Часть II-A / Программное обеспечение OpenVMS AXP". Архитектура Alpha AXP (PDF) (Второе издание). Digital Press . 1995. ISBN 1-55558-145-5. EY-TI32E-DP.
  21. ^ abc "Часть II-B / Программное обеспечение DEC OSF/1". Архитектура Alpha AXP (PDF) (Второе издание). Digital Press . 1995. ISBN 1-55558-145-5. EY-TI32E-DP.
  22. ^ ab «Часть II-C / Программное обеспечение Windows NT AXP». Архитектура Alpha AXP (PDF) (Второе изд.). Цифровая пресса . 1995. ISBN 1-55558-145-5. EY-TI32E-DP.
  23. Руководство пользователя платы Sun 68000, Sun Microsystems, Inc., февраль 1983 г., редакция B
  24. ^ "Sun-2 Architecture Manual" (PDF) . Sun Microsystems . 15 декабря 1983 г. стр. 9–12.
  25. ^ "Руководство программиста по архитектуре AMD64. Том 2: Системное программирование" (PDF) . Март 2017 г. Получено 05.12.2017 .
  26. ^ Таненбаум, Эндрю С.; Гердер, Йоррит Н.; Бос, Герберт (май 2006 г.). «Можем ли мы сделать операционные системы надежными и безопасными?». Computer . 39 (5): 44–51. CiteSeerX 10.1.1.112.3028 . doi :10.1109/MC.2006.156. S2CID  99779. 
  27. ^ "Дескриптор" (PDF) . Bitsavers .
  28. ^ "Дескриптор Unisys". Unisys .
  29. ^ "Pbits". Unisys .
  30. ^ "Pbit прерывание". Unisys .
  31. ^ Дэниел Х. Х. Ингаллс (август 1981 г.). «Принципы проектирования Smalltalk». Журнал Byte . Архивировано из оригинала 27.09.2007.