Переключение банков
Переключение банков — способ увеличения количества используемой памяти по сравнению с количеством, которое процессор может адресовать напрямую[1][2]. Этот способ может использоваться чтобы изменять конфигурацию системы: например ПЗУ, требующееся для загрузки системы с дискеты, может быть отключено, когда оно больше не нужно. В игровых приставках переключение банков позволяет разработать игры большего размера для использования на текущем поколении консолей.
Переключение банков впервые появилось в мини-компьютерах[3]. Многие современные микроконтроллеры и микропроцессоры используют переключение банков для управления ОЗУ, ПЗУ, устройствами ввода-вывода и регистрами системного управления в небольших встраиваемых системах. Данный способ широко использовался в 8-битных микрокомпьютерах. Переключение банков также может использоваться если ширина шины адреса ограничена искусственно и есть аппаратные ограничения, не позволяющие увеличить число линий адреса. В некоторых микроконтроллерах поддержка переключения банков встроена аппаратно, что позволяет сократить число адресных бит, используемых в инструкциях.
В отличие от механизма «подкачки страниц», данные не выгружаются на устройство хранения (жесткий диск). Данные в неизменном виде остаются в недоступной в данный момент процессору области памяти (хотя эта область может быть доступна видеоконтроллеру, контроллеру DMA или другим подсистемам компьютера).
Принцип действия
Переключение банков можно рассматривать как способ расширения шины адреса процессора с помощью внешнего регистра. Например, процессор с 16-битной внешней шиной адреса может адресовать 216 = 65536 ячеек памяти. Если к системе добавлен внешний триггер, с его помощью можно управлять, к какому из двух наборов блоков памяти по 65536 ячеек каждый будет выполняться доступ. Процессор может переключать используемый набор блоков, устанавливая или сбрасывая триггер.
Триггер может сбрасываться или устанавливаться несколькими способами: путём обращения к определённому адресу памяти, либо, в процессорах с выделенными инструкциями ввода-вывода, путём обращения к определённому порту ввода-вывода. Несколько триггеров, управляющих переключением банков, могут быть объединены в регистр, при этом каждый разряд регистра может примерно удвоить число адресуемых ячеек.
Так как триггер (регистр) выбора банка напрямую не связан с счётчиком команд процессора, он не меняет своего состояния автоматически при переполнении счётчика программ. Переполнение не может быть обнаружено внешним триггером, так как счётчик программ это внутренний регистр процессора. Программы не могут воспользоваться дополнительной памятью без модификации. Так как длина внутренних регистров процессора не меняется, процессор не может напрямую адресовать ячейки памяти всех банков за счёт, например, инкремента внутреннего регистра[4]. Вместо этого процессор должен явно выполнить операцию переключения банков для доступа к большим объектам в памяти. Есть и другие ограничения. Обычно система с переключением банков будет содержать один блок памяти программ, общий для всех банков. Вне зависимости от выбранного в данный момент банка, часть адресного пространства будет отображаться на одну и ту же область памяти. В этой области будет находиться код, управляющий переключением банков и выполняющий обработку прерываний.
В отличие от технологии виртуальной памяти управление переключением банков должно явно осуществляться выполняющейся программой или операционной системой. Аппаратная часть процессора не может автоматически определить, что требуются данные, недоступные в данный момент через выбранный банк. Прикладная программа должна отслеживать, какой банк памяти содержит требуемые данные, и вызывать процедуру переключения банков, чтобы сделать этот банк активным[5]. В то же время, переключение банков позволяет получить доступ к данным быстрее, чем, например, подгрузка страниц с диска.
Использование в микрокомпьютерах
Процессоры с 16-битной шиной адреса (Z80, 6502, 6809 и другие), широко применявшиеся в первых игровых приставках и домашних компьютерах могли адресовать напрямую только 64 КБ. В системах, имевших больше памяти, приходилось разбивать адресное пространство на блоки, которые можно было динамически отображать на блоки внутри большего адресного пространства. Блоки памяти разных размеров подключались и отключались с помощью регистров выбора банка или похожих механизмов. Обычно некоторые блоки всегда оставались доступны. Требовалась осторожность, чтобы не нарушить корректность вызова подпрограмм, обработку прерываний, целостность стека вызовов, и т.п. В то время, как содержимое отключенного блока памяти становилось недоступно процессору, оно могло использоваться другим аппаратным обеспечением, например видеоконтроллером, контроллером DMA, устройствами ввода-вывода. Последняя версия CP/M, выпущенная в 1982 году поддерживала переключение банков, чтобы использовать более 64КБ памяти, которые могли адресовать процессоры 8080 и Z80 [6].
Переключение банков позволило добавлять в конструкцию компьютера дополнительную память и функции без необходимости перехода на процессор с более широкой шиной адреса с вытекающими отсюда проблемами удорожания и несовместимости. Например, компьютер Commodore 64 использовал переключение банков чтобы использовать все 64 КБ ОЗУ и при этом использовать ПЗУ и отображение регистров ввода-вывода на память. Atari 130XE позволял процессору 6502 и видеоконтроллеру ANTIC получать доступ к раздельным банкам ОЗУ, за счёт чего основной процессор мог подготовить графические объекты в банке памяти и затем отключить его, а видеоконтроллер продолжал использовать эти объекты, хотя банк памяти был уже не виден основному процессору.
Марсоход Соджорнер использует процессор 80C85 с внешней схемой переключения банков, позволяющей адресовать более 512 КБ памяти через страницы размером 16 КБ[7]. Другой прототип марсохода использует микроконтроллер 80C51 с внешней схемой переключения банков для доступа к 256 КБ статического ОЗУ[8].
Использование в IBM PC-совместимых компьютерах
В 1985 году компании Lotus Software и Intel представили спецификацию расширенной памяти (англ. Expanded Memory Specification, EMS) версии 3.0 для использования в IBM PC-совместимых компьютерах под управлением MS-DOS. При выпуске версий 3.2 в 1986 году и 4.0 в 1987, к этой группе присоединилась компания Microsoft и спецификация стала известна как Lotus-Intel-Microsoft EMS или LIM EMS[5][9][10]. Расширенная память — это плата памяти для шины ISA, использующая переключение банков и позволяющая использовать более 640 КБ ОЗУ, разрешённых оригинальной архитектурой IBM PC. Доступ к расширенной памяти производится через «окно» в адресном пространстве размером 64 КБ, размещённом в «верхней области памяти»[11]. Эти 64 КБ разделены на четыре «страницы» по 16 КБ, которые могут переключаться независимо. Многие прикладные программы и компьютерные игры, выпущенные до начала 90-х годов, использовали расширенную память. Хотя на данный момент EMS является устаревшей технологией, в 32-битных версиях операционной системы Microsoft Windows её поддержка обеспечивается до сих пор.
Позже была стандартизирована спецификация дополнительной памяти (англ. eXtended Memory Specification, XMS), на данный момент также устаревшая. XMS позволяет приложениям MS-DOS, работающим в реальном режиме, получить доступ к памяти за пределами первого мегабайта адресного пространства. Блоки дополнительной памяти могут копироваться в основную и обратно, а также отображаться в области верхней памяти, имитируя переключение банков («банки» в данном случае могут быть произвольного размера). Для обеспечения совместимости с приложениями, использующими EMS память, в составе MS-DOS начиная с версии 4.01 появился драйвер EMM386, использующий XMS память для имитации техники переключения банков EMS памяти. Поддержка XMS сохранена в текущих 32-битных версиях операционной системы Microsoft Windows.
Использование в игровых приставках
Переключение банков также использовалось в некоторых игровых приставках[12]. Например, Atari 2600 позволяла адресовать только 4 КБ ПЗУ, поэтому поздние игровые картриджи к 2600 содержали собственные схемы переключения банков, чтобы обеспечить использование большего объёма ПЗУ и тем самым уместить более сложные (за счет большего объёма программного кода и игровых данных, таких как графика и уровни) игры[13]. Приставка Nintendo Entertainment System содержала модифицированный процессор 6502, но её картриджи содержали иногда мегабит и более ПЗУ, адресуемого через схему переключения банков, называвшуюся Multi-Memory Controller. Картриджи к Game Boy использовали микросхему под названием MBC (Memory Bank Controller), которая не только выполняла переключение банков ПЗУ, но также и переключение встроенных банков статического ОЗУ, и даже доступ к таким внешним устройствам, как инфракрасные порты или вибромоторы. Переключение банков использовалось и в более поздних игровых системах.
Использование в видеоадаптерах
В некоторых типах видеоадаптеров для улучшения воспроизведения видео может использоваться схожая техника двойной буферизации. В этом случае, пока процессор обновляет содержимое одной области видеопамяти, схема, осуществляющая формирование изображения, считывает и отображает содержимое второй области. Когда процессор завершает обновление, он подаёт схеме видеоадаптера сигнал переключить активные банки, так что момент смены изображения не сопровождается артефактами или искажениями. В данном случае процессор может иметь доступ ко всей видеопамяти, но схема видеоадаптера использует для доступа к разным областям видеопамяти переключение банков. Если два или более банков видеопамяти содержат слегка отличающиеся изображения, быстрое переключение (перелистывание) между ними позволяет создать анимацию или другие визуальные эффекты, для выполнения которых напрямую производительности процессора может быть недостаточно.
Альтернативные методы и развитие
Переключение банков было вытеснено во многих 16-битных системах сегментацией памяти, которая в свою очередь уступила место блокам управления памятью с подкачкой страниц. Тем не менее, во встраиваемых системах, переключение банков всё ещё пользуется популярностью из-за своей простоты, дешевизны и часто большей уместности в данной области, чем в компьютерах общего назначения.
Компьютеры, использующие переключение банков
Примечания
- Д. Гивоне, Р. Россер. Микропроцессоры и микрокомпьютеры. Вводный курс = Microprocessors/Microcomputers An Introduction. — М.: Мир, 1983. — С. 367. — 464 с.
- D. Aspinall, William Allan Clark. The Microprocessor and its application: an advanced course. — Cambridge University Press, 1978. — С. 47-50. — 420 с. — ISBN ISBN 0-521-22241-9.
- C. Gordon Bell, Allen Newell. Computer structures: readings and examples. — McGraw-Hill, 1971. — С. 156. — 668 с.
- Steve Heath. Embedded systems design. — Second edition. — Newnes, 2003. — С. 242. — 430 с. — ISBN ISBN 0-7506-5546-1.
- Scott Mueller. Upgrading and Repairing PCs. — Second Edition. — Que Books, 1992. — С. 699-700. — ISBN ISBN 0-88022-856-3.
- Paul Freiberger. Digital Research offers CP/M upgrade // Info World. — InfoWorld Media Group, 1982. — Т. 4, № 42. — С. 1. — ISSN 0199-6649.
- Jake Matijevic и др. "Mars Pathfinder Frequently Asked Questions: Sojourner Rover". 1997.
- Edward W. Tunstel, Richard V. Welch, Brian H. Wilcox. Embedded control of a miniature science rover for planetary exploration. — 1998. — doi:10.1.1.52.8645.
- Christine McGeever. New 1-2-3 Gets 4 Megabytes of Memory, Lotus, Intel Break PC-DOS Memory Barrier // InfoWorld. — InfoWorld Media Group, 1985. — Т. 7, № 17. — С. 15. — ISSN 0199-6649.
- Jeff Angus. EMS Update Gives DOS Improved Multitasking // InfoWorld. — InfoWorld Media Group, 1987. — Т. 9, № 33. — С. 5. — ISSN 0199-6649.
- The Handbook of Software for Engineers and Scientists / под ред. Paul W. Ross. — CRC Press, 1995. — С. 26. — ISBN ISBN 0-8493-2530-7.
- Charles W., Jr. Carey. American inventors, entrepreneurs & business visionaries. — Infobase Publishing, 2002. — С. 322-324. — ISBN 0-8160-4559-3.
- Joe Grand, Kevin D. Mitnick, Ryan Russell. Hardware hacking: have fun while voiding your warranty. — Syngress, 2004. — С. 229. — 448 с. — ISBN 1-932266-83-6.