Включение управления памятью

При введении в действие процессора или при перзапуске его после команды HALT блок управления памятью не работает. Он активизируется установкой бита включения управления памятью, а именно нулевого бита регистра состояния управления памятью номер 0; заметьте, что пока управление памятью выключено, автоматическое подлючение седьмой страницы позволяет нам обращаться к регистру R0, как к виртуальному адресу 177572. Поэтому включение блока управления памятью достигается так:

          R0=177572
          . . . .
          BIS #1, @#RO

Рассмотрим теперь такую последовательность команд:

          R0=177572
          R7=172356
          . . . . .
          CLS  R7
          BIS #1, @#R0
          BIC #1, @#RO

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

Нужно помнить однако, что сбрасывание битов регистра производилось при отключенном блоке управления памятью. Поэтому ссылка в следующей проверке на регистр R0, как на виртуальный адрес 177572 аппаратно приводит к физической ячейке с адресом 77572. Следовательно, эфект от выполнения команды BIS сохраняется.

Следуещей командой BIC мы попытались отключить блок управления. Именно к такому результату привело бы сбрасывание первого бита ячейки 77572 общей шины. Но в нашей команде мы адресуем к 177572. Предыдущая команда привела к отключению автоматичсекой привязки вирутуального адреса 177572 к физической ячейке 77572. Поэтому аппаратура, заметив, что 177572 есть виртуальный адрес в седьмой странице, обратится к регистру R7, чтобы определить, как его надо преобразовать. Мы намеренно воздержались от записи в регистр R7 необходимого смещения. В итоге команда BIC обратится не к регистру состояния, а к некоторой другой физической ячейке памяти и не выполнит возложенную на нее фукцию.

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


Формирование физического адреса

При включенном блоке управления памятью каждая ячейка, к которой адресуются из программы, расматривается аппаратурой как состоящая из двух полей. Биты с 13-го по 15-й определяют номер страницы виртуального адреса. Это так называемое поле текущей страницы. Пусть виртуальный адрес равен 177566. Биты с 13-го по 15-й в нем равны 1, что соотвествует двоичной записи числа 7, т. е. данный адрес задает седьмую страницу. Поэтому аппаратура обращается к регистру R7 за базовым адресом страницы 7. Он кодируется битами с 0-го по 11-й регистра адреса страницы (остальные биты не используются). Для получения действительного значения смещения это двенадцатиразрядное поле сдвигается на 6 битов влево.

Оставшиеся 13 битов виртуального адреса (с 0-го по 12-й) представляют собой поле смещения внутри данной страницы. Значение этого поля складывается с базовым адресом и в результате формируется физический адрес, соотвествующий данному виртуальному.

Обратите внимание на то, что все действия выполняются аппаратно. Программисту только необходимо только настроить регистры. Обычно операционная система заносит в регистр R7 число 7600. Пусть опять витуальный (программный) адрес равен 177566. Он распадается на два поля:

         1 1 1 1 1 1 1 1 0 1 1 1 0 1 1 0
       │─│─│─│─│─│─│─│─│─│─│─│─│─│─│─│─│
       │─────│─────────│───────────────│
             │
     Страница│<──────── Смещение──────>

которые определяют седьмую страницу и смещение 17566. Отметим, что смещение всегда задается (в байтах) между 0 и 17777, так как длина страницы составляет 8 К (=О2000) байтов или 4 К слов. Смещая содержимое регистра R7 (т. е. 7600) на 6 битов влево, получим базовый адрес данной страницы, равный 76000. Следовательно, физическим адресом, соотвествующим данному виртуальному, будет:

        +  Базовый адрес        76000
           Смещение              1756
    ─────────────────────────────────────
          Физический адрес      87756

Страница виртуальной памяти всегда содержит 200 квантов. Порция в 100 байтов есть наименьшая величина смещения, и поэтому в блоке управления памятью она служит квантом. Блок управления памятью распределит первый квант страницы, вычислив базовый адрес по описанной выше схеме. Но он не будет выполнять ту же операцию с остальными квантами до особой команды. В результате адресация к ячейкам 000100 по 017776 не достигнет цели, поэтому что им не будут поставлены в соответствие реальные ячейки памяти. Ссылки же на адреса с 0200000 по 020076 будут реализованы.

Чтобы задать количество квантов данной страницы виртуальных адресов, которое должно быть приведено к физическим ячейкам памяти, необходимо обратиться к регистру описания страницы. В его старший байт программист заносит требуемое число квантов (помимо первого). По команде:

          BIS #77400, @#R7

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

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

Таким образом, последовательность команд:

          MOV #7600, @#R7
          BIC #6, R7
          BIS #1, @R0

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

Заметьте, что замена #6 на #77400 в команде BIC дает тот же эфект. Только один квант седьмой страницы будет привязан к физической памяти, а все адреса выше 76076 окажутся недоступными.

Понятно, что под регистры ввода-вывода можно приспособитть произвольно выбранную страницу. Для этого достаточно настроить все регистры. Так как они находятся в одном и том же месте памяти, то предварительно придется либо отключить управление памятью, либо получить к ним доступ через другую страницу.

Напишем программу вывода на терминал буквы В, на этот раз адресуясь к буферу печати, как ячейке памяти с виртуальным адресом 34566. Виртуальный адрес рападается на поле с номером 1 и на поле смещения 1456. Следлвательно, чтобы виртуальный адрес 34566 соответствовал физическому адресу 77566, необходимо в R1 задать базовый адрес, который определяется так:

         Физический адрес          77566
        - Смещение                - 1456
    ──────────────────────────────────────
         Базовый адрес             76110

И, следовательно, в R7 нужно занести значение 76110. Вся программа, на момент входа в которую предполагается, что блок управления памятью отключен, такова:

          R1=17232
          R0=17572
  START:  MOV #76110, @#R1
          MOV #1456, @#R1
          BIS #1, @#R0
          MOVB #102, @#34566
          HALT
          .END

 
proj/bk/1801vm1-z.txt · Последние изменения: 2010/07/30 19:36
 
Copyright (C) 1996-2009 Serge Vakulenko
serge@vak.ru