Банки памяти используются,
когда адресное пространство процессора мало, а приложение требует. При
этом стоимостные и электротехнические ограничения позволяют нам установить
в систему гораздо больше памяти, чем процессор может адресовать. Например,
у многих" микроконтроллеров адрес имеет длину всего 8 бит, однако
256 байт данных, и тем более 256 команд кода для большинства приложений
недостаточно. Многие из ранних персональных компьютеров, основанных на
8-разрядных микропроцессорах i8085 и Z80 с 16-разрядным адресом, имели
гораздо больше 64 Кбайт памяти. Например, популярные в годы детства авторов
компьютеры Yamaha имели до 2 Мбайт оперативной памяти.
Адресация дополнительной памяти в этой ситуации обеспечивается дополнительным
адресным регистром, который может быть как конструктивным элементом процессора,
так и внешним устройством. Этот регистр дает нам дополнительные биты адреса,
которые и обеспечивают адресацию дополнительной памяти. Регистр этот называется
расширителем адреса или селектором
банка, а область памяти, которую можно адресовать, не изменяя селектор
банка, - банком памяти. Значение регистра-селектора
Банковая адресация в 16-разрядных
микропроцессорах
Внимательный читатель, знакомый с системой команд Intel 8086, не может
не отметить, что "сегментные" регистры этого процессора имеют
мало общего с собственно сегментацией, описываемой в главе
5. Эти регистры более похожи на причудливый гибрид селектора банков
и базового регистра. Как и описываемый далее PIC, I8086 имеет команды
"ближних" (внутрибанковых) и "дальних" (межбанковых)
переходов, вызовов и возвратов.
Относящийся к тому же поколению процессоров Zylog 800 имеет полноценные
селекторы банков. Из всех изготовителей 16-разрядных микропроцессоров
только инженеры фирмы Motorola осмелились расширить адрес до 24 бит (это
потребовало увеличения разрядности регистров и предоставления команд 32-разрядного
сложения), все остальные так или иначе экспериментировали с селекторами
банков и вариациями на эту тему.
Работа с банками памяти данных обычно не представляет
больших проблем, за исключением ситуаций, когда нам нужно скопировать
из одного банка в другой структуру данных, которую невозможно разместить
в регистрах процессора. Существенно более сложную задачу представляет
собой передача управления между банками программной памяти.
В том случае, когда селектор банка программной памяти интегрирован в процессор,
предоставляются специальные команды, позволяющие перезагрузить одновременно
"младшую" (собственно регистр PC) и "старшую" (селектор
банка) части счетчика команд.
Банки команд в Р/С
У микроконтроллеров PIC арифметические операции производятся только над
младшими 8 битами счетчика команд, поэтому относительные и вычислимые
переходы допустимы только в пределах 256-командного банка. Однако полное
— с учетом селектора банка — адресное пространство для команд достигает
64 Кбайт, а у старших моделей и 16 Мбайт за счет использования двух регистров-расширителей.
Переключение банка осуществляется специальными командами "длинного"
— межбанкового — перехода.
Если банковая адресация реализована как внешнее устройство,
проблема межбанковой передачи управления встает перед нами в полный рост.
Поскольку мы не имеем команд межбанкового перехода, любой такой переход
состоит минимум из двух команд: переключения банка и собственно перехода.
Каждая из них нарушает порядок исполнения команд.
Рассмотрим ситуацию детальнее (рис. 2.15): из кода, находящегося в банке
1 по адресу OxlOaf, мы хотим вызвать процедуру, находящуюся в банке 2
по адресу 0x2000. Если мы сначала выполним переключение банка, мы окажемся
в банке 2 по адресу ОхЮЬО, не имея никакого представления о том, какой
же код или данные размещены по этому адресу. С той же проблемой мы столкнемся,
если сначала попытаемся сделать переход по адресу Oxlfff.
В качестве решения можно предложить размещение по адресу Oxlfff в банке
1 команды переключения на банк 2. Возможно, для этого придется переместить
какой-то код или данные, но мы попадем по желаемому адресу. Впро-Чем,
если мы постоянно осуществляем межбанковые переходы, этот подход Потребует
вставки команд переключения банка для каждой возможной точки входа во
всех остальных банках. Ручное (да и автоматизированное)размещение этих
команд — операция чрезвычайно трудоемкая, и возникает естественная идея:
сконцентрировать все эти вставленные команды и соответствующие им точки
входа в каком-то одном месте. Впрочем, даже эта идея не дает нам ответа
на вопрос, как же при такой архитектуре возвращать управление из процедур?
Вставлять команду переключения еще и для каждой команды вызова?
Рис. 2.15. Межбанковый переход
Развитие этой идеи приводит нас к чему-то, похожему на менеджер оверлеев (см.
разд. Оверлеи (перекрытия). программный
модуль, который присутствует во всех банках по одному и тому же адресу
(рис. 2.16). Если нам нужно вызвать известную процедуру в определенном
банке, мы передаем ее адрес и номер банка этому модулю, и он осуществляет
сохранение текущего банка, переключение и переход. Если процедура делает
возврат, она возвращает управление тому же модулю, который, в свою очередь,
восстанавливает исходный банк и возвращает управление в точку вызова.
Дальнейшее развитие этой идеи приводит к мысли, что самый простой способ
разместить этот код во всех банках — это усложнить схему работы селектора
банков, например, всегда отображать первый килобайт адресного пространства
на одни и те же физические адреса. Аппаратно это несложно: мы анализируем
старшие шесть битов адресной шины процессора. Если они не равны нулю,
мы подаем на старшие биты адресной шины памяти содержимое селектора банка,
если же равны — нулевые биты. Примерно этим способом и расширяют память
большинство микрокомпьютеров на основе 8-разрядных процессоров.
Поскольку мы вступили на путь анализа логического адреса, можно пойти
и дальше: разбить адресное пространство процессора на несколько банков,
каждый со своим селектором.
Рис. 2.16. Переключатель банков
Адресное пространство PDP-11
Машины серии PDP-11 имеют 16-разрядный адрес, который позволял адресовать
64 Кбайт. У старших моделей серии это пространство разбито на 8 сегментов
по 8 Кбайт каждый. Каждому из этих сегментов соответствует свой селектор
банка (в данном случае следует уже говорить о дескрипторе сегмента) (рис.
2.17). Физическое адресное пространство, которое может быть охвачено дескрипторами
сегментов, составляет 2 Мбайт, что намного больше адресов, доступных отдельному
процессу. На первый взгляд, эта конструкция представляет собой усложненную
реализацию банковой адресации, цель которой — только расширить физическое
адресное пространство за пределы логического, но тот факт, что, кроме
физического адреса, каждый сегмент имеет и другие атрибуты, в том числе
права доступа, заставляет нас признать, что это уже совсем другая история,
заслуживающая отдельной главы (см. главу
5).
Рис. 2.17. Виртуальная память PDP-11/20