Банки памяти Банки памяти используются,
когда адресное пространство процессора мало, а приложение требует. При этом стоимостные
и электротехнические ограничения позволяют нам установить в систему гораздо больше
памяти, чем процессор может адресовать. Например, у многих" микроконтроллеров
адрес имеет длину всего 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 |