Текст книги "Основы AS/400"
Автор книги: Фрэнк Солтис
Жанр:
ОС и Сети
сообщить о нарушении
Текущая страница: 26 (всего у книги 41 страниц)
Трансляция адреса
Перед обращением в память виртуальный адрес в любой вычислительной системе должен быть транслирован в реальный. Ранее мы говорили, что в архитектуре PowerPC есть еще один уровень адресов, которые называются эффективными и используются программами. Эффективный адрес должен быть сначала транслирован в виртуальный, и только после этого – в реальный. В этом разделе мы рассмотрим, как выполняются эти трансляции. Приготовьтесь, некоторые детали могут показаться Вам слишком «острыми».
Характеристики модели памяти
Мы уже познакомились с некоторыми характеристиками памяти AS/400. Приведем снова список этих характеристик вместе с другими, которые мы еще пока не рассматривали, но обязательно сделаем это.
Размер страницы – 212 байта (4
Диапазон эффективных адресов – 264 байта:
число эффективных сегментов – 240;
размер эффективного сегмента – 224 байта (16 MБ).
•Два специальных типа эффективных адресов, отменяющих трансляцию, для идентификации которых используются 12 старших разрядов (3 шестнадцатиричные цифры):
800h – эффективный=реальный (E=R) отображают всю реальную память, для них выделено 228 эффективных сегментов;
801h – эффективный=прямое-сохранение (E=DS) отображают пространство ввода-вывода, для них выделено 228 эффективных сегментов.
•Диапазон виртуальных адресов – 264 байта:
число виртуальных сегментов – 240 -229;
размер виртуального сегмента – 224 байта (16 MБ).
•Диапазон реальных адресов – 252 байта.
Все характеристики приведены для используемого в AS/400 режима активных тегов 64-разрядных процессоров.
Регистр состояния машины
Процесс трансляции адресов управляется режимом активных и неактивных тегов и состоянием процессора. Состояние процессора определяется специальным регистром, называемым регистром состояния машины MSR (Machine State Register). Разряды этого регистра управляют некоторыми операциями процессора, в том числе трансляцией адреса. В главе 9 мы рассмотрим этот регистр и способ изменения его разрядов. А пока, чтобы лучше понять трансляцию адреса, затронем лишь несколько разрядов MSR, а именно:
•Разряд 64-разрядного режима (MSRSF):
– процессор работает 32-разрядном режиме;
– процессор работает 64-разрядном режиме.
•Разряд перемещения команд (MSRIR):
– трансляция адреса команды отключена;
– трансляция адреса команды: включена.
•Разряд перемещения данных (MSRDR):
– трансляция адреса данных отключена;
– трансляция адреса данных включена.
•Разряд защиты C2 (MSRC2):
– защита C2 отключена;
– защита C2 включена.
•Проблемное состояние (MSRPR):
– процессор может исполнять любые команды;
– процессор может исполнять только непривилегированные команды.
•Пользовательское состояние (MSRUS):
– исполняется код ОС;
– исполняется пользовательский код.
Для определения размера адреса в процессе его трансляции используется разряд 64-разрядного режима (MSRSF). Например, в 32-разрядном режиме архитектура PowerPC определяет, что эффективный адрес имеет длину лишь 32 разряда. В режиме активных тегов процессоров AS/400 аппаратура поддерживает только 64-разрядный режим. Таким образом, SLIC, управляющий значениями разрядов MSR, будет устанавливать только 64-разрядный режим.
Разряды перемещения команд (MSRIR) и данных (MSRDR) позволяют процессору работать в режиме реальной адресации. Когда SLIC отключает перемещение, механизмы трансляции адреса не используются, и младшие 52 разряда эффективного адреса передаются как реальный адрес непосредственно подсистеме памяти. Подсистема памяти состоит из памятей кэша и основной. В архитектуре PowerPC для команд и данных – раздельные кэши, и соответственно отдельные разряды перемещения. Такая модель называется гарвардским кэшем[ 70 ]70
В начале 40-х годов Гарвардский Университет (Harvard University) разработал серию компьютеров Mark (проект финансировался IBM). Компьютеры Mark-III и Mark-IV имели раздельные памяти для команд и данных. Термин «гарвардская архитектура» до сих пор используется для обозначения машин с раздельной памятью.
[Закрыть].
Первоначально бит защиты С2 (MSRC2) предназначался для того, чтобы вынуждать механизм трансляции адреса использовать сегментные регистры для всех пользовательских обращений, если процессор работает в режиме активных тегов и защита С2 включена. Использование системных таблиц гарантировало, что при включенной защите С2 ОС может контролировать и регистрировать доступ пользователей к любым объектам. Хотя данный разряд по-прежнему присутствует в некоторых процессорах PowerPC, он не используется для аудита С2. Вместо этого на уровне защиты 50 (защита С2) мониторинг и регистрацию пользовательского доступа компонент защиты SLIC осуществляет непосредственно, без использования сегментных регистров.
Разряд проблемного состояния (MSRPR) используется в процессе трансляции адреса и для защиты памяти. Он определяет, может ли процессор исполнять привилегированные команды PowerPC. Не следует путать эти привилегированные команды с привилегированными командами MI (такими как «PWRDWNSYS,» с которой мы встречались в главе 7) – привилегированные команды PowerPC исполняет только SLIC. Примером привилегированных команд PowerPC могут служить команды работы с тегами, например «lq».
Разряд пользовательского состояния (MSRUS) поддерживает уровни защиты AS/ 400 от 40 и выше. Он позволяет различать системное и пользовательское состояние процесса. Разряд пользовательского состояния определяет, могут ли полномочия быть помещены в указатель, и может ли процесс выполнять привилегированные команды MI. Данный разряд используется также для защиты памяти. Обратите внимание, что разряд пользовательского состояния также задействован только в режиме активных тегов.
Обзор трансляции адреса
На рисунке 8.3 показана трансляция адреса PowerPC в режиме активных тегов. Аппаратура определяет, является ли 64-разрядный адрес, используемый программой, транслируемым адресом, адресом E = R или адресом E = DS. Для классификации используются старшие 12 разрядов (3 шестнадцатиричные цифры) эффективного адреса. Если эти три старшие цифры равны 800, то это адрес E = R. Некоторые компоненты SLIC, которым нужен доступ ко всем частям памяти, работают с реальными адресами, как и большая часть кода управления памятью. Часть пространства эффективных адресов зарезервирована для адресов E = R. Не случайно именно 252 этих адресов (64 разряда – 12 старших разрядов для 800 = 252) соответствуют диапазону реальных адресов.
Рисунок 8.3. Трансляция адреса в режиме активных тегов
Когда аппаратура обнаруживает адрес E=R, она проверяет разряд проблемного состояния, чтобы определить, может ли процесс, сгенерировавший такой адрес, выполнять привилегированные команды: PowerPC (MSRPR = 0). Если это так, то остальные 52 разряда адреса E=R передаются непосредственно основной памяти как реальный адрес. Если MSRPR = 1, то в зависимости от версии процессора, он будет либо генерировать прерывание, либо рассматривать адрес как транслируемый – разные процессоры PowerPC реагируют по-разному. Если использование адреса E=R допустимо, то накладных расходов при трансляции адреса не возникает. Мы любим говорить, что число 800 – ключ, открывающий бесплатный доступ к памяти.
Для доступа к пространству ввода-вывода, которое мы кратко обсудили в главе 2, в архитектуре PowerPC используется диапазон адресов, называемых адресами прямого сохранения. Это внешнее адресное пространство, которое для процессора выглядит как часть памяти. На самом деле, оно, конечно, таковым не является; эти адреса используются для обозначения подключенных к системе устройств ввода-вывода.
Обычно, устройства в любой системе подключены к шине ввода-вывода. В главе 10 мы расскажем, что устройства AS/400 подключены к процессорам ввода-вывода, которые, в свою очередь, подключены к шинам ввода-вывода. Таким образом, адрес прямого сохранения используется в AS/400 для идентификации как шины ввода-вывода, так и подключенного к ней процессора ввода-вывода.
В архитектурах данного типа, которые часто называют вводом-выводом, отображенным в память, специальный набор команд процессора для работы с устройствами не требуется. Взамен для передачи команд и данных применяют любые команды загрузки или сохранения в это внешнее адресное пространство.
Если старшие три шестнадцатиричные цифры эффективного адреса равны 801, то это адрес E = DS. Обнаружив этот адрес, аппаратура проверяет разряд проблемного состояния, чтобы определить, может ли процесс, сгенерировавший адрес, выполнять привилегированные команды PowerPC (MSRPR= 0). Если это так, то остальные 52 разряда адреса E = DS передаются непосредственно пространству ввода-вывода. Как и адреса E = R, адреса E = DS имеют 228 эффективных сегмента. Если MSRPR = 1, то в зависимости от версии процессора, он будет либо генерировать прерывание, либо рассматривать адрес как транслируемый.
Если три старшие шестнадцатиричные цифры не равны ни 800, ни 801, то это транслируемый адрес. Так как система находится в режиме активных тегов, то эффективный адрес является виртуальным. Для трансляции виртуального адреса в реальный используется таблица страниц.
Рисунок 8.4. Этапы трансляции адреса (режим активных тегов)
На рисунке 8.4 представлены этапы трансляции адреса в режиме активных тегов. Старшие 40 разрядов эффективного адреса называются идентификатором эффективного сегмента (ESID), а младшие 24 – смещением. Как показано на рисунке, смещение подразделяется на страничное и байтовое. Каждое из полей смещения имеет длину 12 разрядов. Страничное смещение задает страницу сегмента, а байтовое – байт страницы.
Первый шаг процесса трансляции – создание идентификатора виртуального сегмента (VSID). В режиме активных тегов это просто ESID. Виртуальный адрес, как и эффективный, имеет размер 64 разряда и включает 24-разрядное смещение. VSID и страничное смещение виртуального адреса составляют номер виртуальной страницы (VPN). На рисунке 8.4 видно, что VPN имеет длину 52 разряда. VPN используется для определения номера реальной страницы (RPN) по таблице страниц. RPN – это номер страничного фрейма в памяти, а не номер страницы на диске. Байтовое смещение всегда передается от эффективного адреса виртуальному и затем реальному без изменений. Оно задает байт на 4-килобайтной странице и никогда не участвует в процессе трансляции.
Для сравнения на рисунке 8.5 показаны этапы трансляции адреса в режиме неактивных тегов. Данный механизм трансляции не используется в AS/400, но все же полезно представлять себе как сходство, так и различие трансляции адреса в AS/400 и в таких ОС, как AIX. В данном случае, ESID используется для обращения к таблице сегментов, из которой извлекается VSID. Обращение к таблице страниц, которое мы скоро рассмотрим, в режимах активных и неактивных тегов выполняется одинаково. Следует также отметить размер полей адреса. В режиме неактивных тегов порции смещения (поля страницы и байта) эффективного и виртуального адреса равны 28 разрядам, в режиме активных тегов – 24. 28 разрядов были выбраны в соответствии с числом разрядов смещения в прежней 32-разрядной архитектуре Power и по-прежнему используются на некоторых процессорах RS/6000.
Рисунок 8.5. Этапы трансляции адреса (режим неактивных тегов)
Мы не станем подробно рассматривать таблицу сегментов и сосредоточим свое внимание на таблице страниц. Ее реализация очень похожа на реализацию таблицы сегментов, где для поиска записи применяется тот же общий подход.
В AS/400 трансляция виртуального адреса в реальный, использующая таблицу страниц, более важна, чем трансляция сегментов, так как большинство эффективных адресов обходят таблицу сегментов.
Трансляция адреса виртуальный—реальный
Таблица страниц – структура данных в памяти, содержащая RPN. При построении таблицы страниц в большинстве отличных от AS/400 реализаций виртуальной памяти, каждой странице виртуальной памяти соответствует одна запись в таблице. Номер виртуальной страницы – VPN – используется как индекс в таблице страниц для выбора одной из записей. Выбранная запись содержит номер реальной страницы – RPN, который затем становится частью реального адреса.
Описанная структура страничных таблиц используется многими системами, например System/370. Предположим, что у нас есть компьютер с 32-разрядным виртуальным адресом и 4-килобайтной страницей. Размер VPN для этого адреса – 20 разрядов. Если далее предположить, что одна запись страничной таблицы занимает 4 байта, то размер всей таблицы составит 4 МБ. Такая таблица очень велика, но все-таки приемлема для систем с большими объемами памяти. Однако, если виртуальный адрес больше 32 разрядов (48 или 64), то размер обычной страничной таблицы становится неприемлемо большим.
System/38 была первой из массовых вычислительных систем, где использовалась инвертированная таблица страниц. В такой таблице содержится по одной записи на каждую реальную страницу (страничный фрейм) памяти, а не на каждую виртуальную страницу памяти, расположенную на диске. Общий размер такой инвертированной таблицы прямо зависит от размера памяти. Чем больше память, тем больше размер таблицы, но доля памяти, занятая таблицей остается неизменной.
Самое сложное в инвертированной таблице страниц – нахождение нужной записи. Теперь нельзя напрямую использовать VPN как индекс в таблице, так как нет однозначного соответствия между VPN и записью таблицы. Необходим какой-то иной способ. Прием, используемый в AS/400, заключается в применении к VNP для определения записи страничной таблицы хеш-функции.
Хеширование
Хеширование всегда было концепцией, трудной для объяснения. Хеш-функция AS/ 400 сначала выполняет над несколькими старшими и младшими разрядами VPN операцию «Исключающее или». Затем между полученным значением и разрядами маски из специального регистра, содержащего размер страничной таблицы, выполняется операция «И». Наконец, для результата и реального адреса страничной таблицы выполняется операция «Или», которая и дает 52-разрядный реальный адрес в страничной таблице. Очень мало людей по-настоящему понимает, зачем и как работает хеш-функция. Тем не менее, желающих проникнуть в ее секреты всегда было достаточно.
Несколько лет назад, раздумывая нет тем, как объяснить хеширование раз-вв" работчикам System/38, я бродил по магазину Sears в Рочестере. Чуть раньше ш я отправил заказ в отдел продаж по каталогу и хотел узнать, был ли он полу-
чен. Когда я поинтересовался об этом в столе заказов, у меня спросили две последние цифры моего телефона. Я назвал: «83». На стене за спиной служа-
щего располагалось сто отделений, пронумерованных от 00 до 99. Работник магазина вытащил стопку бумаги из отделения 83 и начал искать мой заказ. После того как заказ был найден, мне сказали, что выписанный товар еще не
получен. Я немедленно выпалил в ответ: «У Вас только что произошла страничная ошибка». Сотрудник Sears ничего не понял и был несколько удивлен. Зато я внезапно осознал, как объяснить хеширование.
Sears использовал хеш-функцию для отслеживания полученных заказов, точно так же, как мы отслеживаем, какие страницы находятся в памяти. Было решено уникально идентифицировать клиента по имени и номеру телефона. Вместо того, чтобы хранить запись о каждом клиенте, который мог бы сделать заказ, компания решила хранить записи только о тех клиентах, которые сделали заказ, но еще не забрали его. Для ускорения поиска сотрудник выбрал только часть полной идентификации клиента – две последние цифры телефонного номера. Таким образом, все сделанные заказы были отсортированы по этим двум последним цифрам. Чтобы получить информацию о выполнении заказа, необходимо было в поисках имени заказчика просмотреть лишь одно из 100 отделений.
Функция, использовавшаяся Sears (выбор двух последних цифр телефонного номера), давала достаточно равномерное распределение заказов по ста отделениям, то есть для поиска в каждом из отделений требовалось примерно одинаковое количество времени. Если бы, например, Sears использовал первые две цифры телефонного номера, то некоторые отделения были бы просто забиты, а остальные – пусты (почти в каждой местности большинство телефонов начинается одинаково), так что выбор первых двух цифр дал бы плохое распределение. Аналогично, комбинация операций, используемых для создания хеш-кода в AS/400, гарантирует равномерное распределение по «отделениям» таблицы страниц.
В AS/400 эквивалент отделения Sears – группа записей страничной таблицы (PTEG). Каждая PTEG содержит восемь записей таблицы (PTE). Алгоритм хеширования определяет одну из таких PTEG. Затем, необходимо просмотреть восемь записей группы, чтобы найти VPN, совпадающий с VPN транслируемого виртуального адреса. Данный поиск необходим, так как на одну и ту же PTEG отображается много виртуальных адресов. Аналогичная ситуация в Sears – одни и те же две цифры могут быть последними в телефонных номерах нескольких клиентов. Номер отделения говорит лишь о том, что все заказы в данном отделении принадлежат людям, телефонные номера которых заканчиваются на две эти цифры. Для того чтобы найти заказ конкретного клиента, необходимо просмотреть все заказы в отделении.
Число сделанных, но не полученных клиентами заказов может изменяться в течение дня, и Sears пришлось это учесть. Они использовали фиксированное число отделений с переменным числом записей в каждом. AS/400 тоже использует фиксированное число отделений, но как мы только что видели, число записей в отделении также фиксировано. Данный VPN может быть, а может и не быть найден в одном из восьми PTE. Если число записей не умещается в PTEG, то используется вторичная таблица страниц, которая содержит переменное число записей.
В большинстве реализаций AS/400 количество PTEG равно, как минимум, половине общего количества реальных страниц памяти. Учитывая, что в каждой PTEG 8 записей, таблица данного размера способна отображать в четыре раза больше страниц, чем может поместиться в память. Другими словами, среднее число используемых PTE на PTEG равно лишь двум. Это среднее значение подразумевает, что функция хеширования обеспечивает равномерное распределение по всем PTEG. Впрочем, могут возникнуть и ситуации, когда на одну или несколько PTEG будет приходиться более восьми записей. В таких случаях, дополнительные записи хранятся во вторичной таблице страниц. Представьте себе, что одно из отделений Sears слишком переполнено, и все заказы в нем не помещаются. Тогда некоторые из заказов необходимо хранить не в отделении, а где-то еще. Это «где-то еще» и есть эквивалент вторичной таблицы страниц.
В AS/400 если PTE не найдена ни в первичной, ни во вторичной таблице страниц, значит в памяти ее нет, и мы имеем дело со страничной ошибкой. Компонент управления памятью SLIC должен обратиться к диску и перенести запрошенную страницу в память. Необходимо также обновить таблицу страниц, чтобы отразить присутствие новой страницы в памяти. Конечно, для освобождения места под новую страницу компонент управления памятью должен удалить какую-то другую страницу.
Следующие три раздела содержат по-настоящему «острую» информацию, так что я пометил их тремя перцами.
В первом рассматривается процесс трансляции виртуального адреса в реальный и использование для этого записей таблицы страниц. Этот раздел предназначается тем читателей, которые любят «играть» с битами.
Следующий раздел описывает, как SLIC или транслятор могут управлять доступом к памяти каждой страницы. Такое управление требуется многоканальным RISC-процессорам с многоуровневой памятью, выполняющим операции с памятью не в том порядке, в какой они следуют в потоке команд. В архитектуре PowerPC имеется четыре бита управления режимами, которые могут использоваться программами, и я кратко опишу их, несмотря на то, что тема может показаться очень сложной.
Наконец, третий раздел касается защиты доступа к странице. Каждая страница может рассматриваться как страница чтения/записи, страница только для чтения или недоступная страница, в зависимости от текущего состояния процессора и ключей защиты в таблице сегментов и страничной таблице. Это тема также крайне сложна.
Итак, если Вам хочется чего-то более «острого», чем предыдущие несколько разделов. то попробуйте один из следующих трех или их все.
Запись страничной таблицы
Каждая PTE занимает 16 байтов, как показано на рисунке 8.6. Первое поле каждой записи состоит из 57 разрядов и называется сокращенным номером виртуальной таблицы AVPN (abbreviated virtual page number). Внимательные читатели помнят по рисунку 8.4, что полный VPN содержит только 52 разряда. Как же сокращенная форма может быть длиннее? Дело в том, что архитектура PowerPC разработана для поддержки виртуальных адресов длиной до 80 разрядов. Для 80-разрядного виртуального адреса VPN должен состоять из 68 разрядов, так что 57 разрядов – это действительно сокращенная форма. AVPN может использоваться вместо полного VPN, так как, по крайней мере, 11 младших разрядов VPN применяются хеш-функцией и их повторения не требуется. Вспомните пример с магазином: Sears не был обязан включать последние две цифры номера телефона клиента в форму заказа, так как эти цифры используются хеш-функцией и их не нужно заново проверять при поиске. AVPN для 64-разрядного виртуального адреса в AS/400 составляет лишь 41 разряд, а его старшие 16 разрядов установлены в 0.
Рисунок 8.6. Формат записи страничной таблицы
Все PTE в PTEG последовательно просматриваются для сравнения VPN с виртуальным адресом. Если в одной из PTE обнаружен нужный AVPN и разряд действительности установлен (V=1), то 40-разрядный RPN из этой записи передается аппаратуре адресации памяти, где к нему присоединяется 12-разрядное смещение для получения реального адреса.
Другие биты PTE предоставляют дополнительную информацию о странице. Биты SW зарезервированы для использования компонентом управления памятью SLIC. Бит H определяет, находится ли данная запись в первичной или во вторичной страничной таблице страниц, которые используют несколько различающиеся хеш-функции. Бит TS задает, содержит ли данная страница указатели и, таким образом, имеет некоторые биты тега равными 1. Бит AC, если он включен, приводит в действие механизм сравнения адреса, который позволяет обнаруживать загрузки и сохранения в блок памяти. Аппаратура устанавливает биты R и C в 1 всякий раз при обращении к данной странице (бит R) или при ее изменении (бит C). Оставшиеся биты имеют отношение к режимам доступа и защите страницы (мы рассмотрим их несколько позже).
Следует несколько задержаться на битах R и С. Управление памятью использует их значения для определения страницы, которую следует удалить из памяти, когда возникает страничная ошибка и в память необходимо считать новую страницу. Управление памятью также использует эти разряды: всякий раз, когда другой компонент SLIC или транслированная программа MI запрашивает операции переноса, очистки или сброса.
Для ускорения поиска кандидата на замещение, управление памятью поддерживает «список поиска» всех страничных фреймов, которые могут быть замещены. При страничной ошибке (или при выполнении операций переноса и очистки) управление памятью вначале ищет в этом списке страничный фрейм, для которого оба бита R и С равны 0. Данная комбинация означает, что в недавнем прошлом страница не использовалась и не была изменена – значит, это лучший кандидат на замещение. После замещения страницы все биты R устанавливаются в значение 0. Таким образом, биты R позволяют определить, к каким страницам происходило обращение после последнего замещения страницы. Для тех страниц, которые не использовались недавно, значения R равны 0.
Если алгоритм замещения страницы в процессе просмотра списка поиска обнаруживает страничный фрейм, который был изменен, но давно не использовался (R=0, C=1), то такой фрейм помещается в «список изменений». Когда в этом списке набирается достаточное число страниц, запускаются одна или несколько задач откачки страниц. Страницы записываются на диск и возвращаются в список поиска (с С равным 0), где становятся кандидатами на замещение, если будут снова востребованы. Откачка страниц предотвращает заполнение памяти измененными страницами, к которым давно не было обращений.
Ясно, что поиск по таблице страниц занимает много времени – настолько много, что выполнять его при каждом обращении к памяти слишком накладно. По счастью, если страница недавно была востребована, велика вероятность, что в ближайшем будущем обращение к ней последует снова. Этот принцип лежит в основе использования справочных буферов: если Вы хотите снова использовать данную запись таблицы страниц, храните ее в регистре, чтобы обращение к ней происходило быстро. Для высокой производительности аппаратно поддерживается справочный буфер трансляции (TLB), содержащий PTE, использованные недавно. Поиск в TLB выполняется перед поиском в таблице страниц. Время поиска в TLB очень мало по сравнению с временем поиска в таблице страниц. Обычно, размер TLB достаточно велик, с расчетом, чтобы не менее 95 процентов трансляций выполнялось без необходимости обращения к таблице страниц.