Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Л12_13_14_15КУТО.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
29.81 Mб
Скачать

2.2.4. Разрешение и запрещение страничного преобразования

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

Каталог страниц и таблицы страниц создаются и размещаются удобном месте. Таблицы занимают блоки линейного адресного пространства и требуют таких дескрипторов сегментов, которые альтернативно именуют их как данные с разрешенными операциям считывания и записи. При запуске системы страничное преобразование обычно разрешается (включается) последним из основных средств процессора. Для этого применяется привилегированная команда MOV, которая устанавливает в 1 старший бит в регистре CF (бит PG PaGing); со следующей команды начинается страничное преобразование. При этом могут возникнуть неожиданные события если преобразование не является тождественным. Когда действует страничное преобразование, память как бы появляется в одном месте, а фактически находится в другом. Команда разрешения страничного преобразования может «увести» программу по такому адресу, где ее невозможно найти. Следовательно, необходимо выделить диапазон адресов, которые никогда не изменяются, и всегда находиться на этом «островке безопасности».

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

  1. Запретить аппаратные прерывания, включая немаскируемое прерывание NMI (если, конечно, это допускают внешние схемы). Это гарантирует непрерываемое выполнение следующих действий.

  2. Разрешать страничное преобразование только из страницы с тождественным отображением. Она обеспечивает равенство линейных и физических адресов после разрешения страничного преобразования.

  3. Сразу после команды MOV, которая устанавливает в 1 бит PG, следует очистить очередь команд устройства опережающей выборки. Этим предотвращаются неверные обращения к памяти уже выбранных из памяти команд.

Приведенные выше действия реализует программный фрагмент:

pushfd ;Сохранить состояние флажка IF

cli ;Запретить прерывания

mov eax,dir_base ;Загрузить в регистр CR3 физический

mov сгЗ,еах ; адрес каталога страниц

mov еах,сгО ;Установить в 1 бит PG регистра CR0

bts eax,31 ; и разрешить страничное

mov crO,еах ; преобразование

jmp next ;Очистить очередь предвыборки next:

пор

popfd восстановить состояние флажка IF

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

2.2.5. Ассоциативный кэш-буфер страничного преобразования

Очевидно, при разрешенном страничном преобразовании без принятия специальных мер каждое обращение к памяти со стороны программы потребует два дополнительных считывания из памяти для передачи в процессор нужного элемента PDE и для передачи нужного элемента РТЕ. Чтобы не ухудшать производительность процессора, в схемы управления страничным преобразованием встроен ассоциативный кэш-буфер TLB, рассчитанный на 32 элемента РТЕ. Когда программа формирует линейный адрес, который отображен на находящийся в кэш-буфере элемент РТЕ, преобразование выполняется без дополнительных обращений к памяти.

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

Кэш-буфер TLB представляет собой 32-элементную четырехнаправленную (или четырехблочную) ассоциативную по множеству память. Процессор хранит элементы РТЕ в четырех блоках, чтобы быстрее отыскивать нужный элемент. Очевидно, после некоторого времени работы с разрешенным страничным преобразованием процессору потребуется более 32 элементов РТЕ. При этом он должен обратиться к памяти и добавить 33-й элемент в кэш-буфер. Но для этого ему придется освободить место, т.е. удалить один из находящихся в буфере элементов РТЕ. При выборе удаляемого элемента РТЕ применяется алгоритм LRU (Least Recently Used), т.е. удаляется тот элемент, который наиболее давно использовался для страничного преобразования (если Можно так сказать, «наиболее состарившийся»). Процессор всегда поддерживает в кэш-буфере 32 самых «свежих» элемента РТЕ и вероятность их успешного использования очень велика.

Хранение элементов РТЕ во внутреннем кэш-буфере таит в себе одну опасность, связанную с модификацией элементов РТЕ «на лету», т.е. в ходе выполнения программы. Предположим, что в программе предусматривается вносить изменения в каталог страниц или в таблицы страниц. После подготовки необходимых таблиц и разрешения страничного преобразования процессор будет загружать элементы РТЕ до заполнения кэш-буфера. Затем по мере необходимости процессор заменяет старые элементы новыми. Пусть теперь программа изменила (в памяти, конечно) некоторый элемент РТЕ. Если измененный элемент уже находится в кэш-буфере, процессор будет пользоваться его старым, неизмененным значением, так как он не может узнать о модификации элемента РТЕ в памяти.

Для преодоления этой трудности после всей подготовки и изменения элемента РТЕ необходимо сразу же просто перезагрузить регистр CR3 с помощью команд

mov eax,cr3 ;Эти две команды опустошают mov cr3,eax ; кэш-буфер

На первый взгляд кажется, что действия этих команд не дают ничего полезного. На самом же деле для процессора любая загрузка регистра CR3 служит сигналом об использовании нового каталога страниц (ведь он не знает о повторной загрузке прежнего адреса). Поэтому процессор считает все элементы в кэш-буфере полностью устаревшими («мусором») и начинает кэшировать новые элементы. Подробнее о структуре кэш-буфера TLB и его проверке см. гл. 8.