Перемикання банків
Перемикання банків — спосіб збільшення кількості використовуваної пам'яті порівняно з кількістю, яку процесор може адресувати напряму[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 КБ ПЗП, тому пізні ігрові картриджі до неї містили власні схеми перемикання банків, щоб забезпечити використання більшого об'єму ПЗП і тим самим вмістити складніші (завдяки більшому обсягу програмного коду та ігрових даних, таких як графіка й рівні) ігри[13]. Приставка Nintendo Entertainment System містила модифікований процесор 6502, але її картриджі містили іноді мегабіт і більше ПЗП, адресованого через схему перемикання банків, яка звалася Multi-Memory Controller. Картриджі до Game Boy використовували мікросхему під назвою MBC (Memory Bank Controller), яка не лише виконувала перемикання банків ПЗП, але також і перемикання вбудованих банків статичного ОЗП, і навіть доступ до таких зовнішніх пристроїв, як інфрачервоні порти або вібродвигуни. Перемикання банків використовувалося і в пізніших ігрових системах.
Використання у відеоадаптерах
У деяких типах відеоадаптерів для поліпшення відтворення відео може використовуватися схожа техніка подвійної буферизації. У цьому випадку, поки процесор оновлює вміст однієї ділянки відеопам'яті, схема, що формує зображення, прочитує і відображає вміст другої ділянки. Коли процесор завершує оновлення, він подає схемі сигнал відеоадаптера перемкнути активні банки, так що момент зміни зображення не супроводжується артефактами або спотвореннями. У цьому випадку процесор може мати доступ до всієї відеопам'яті, але схема відеоадаптера використовує для доступу до різних ділянок відеопам'яті перемикання банків. Якщо два або більше банків відеопам'яті містять дещо відмінні зображення, швидке перемикання (перегортання) між ними дозволяє створити анімацію або інші візуальні ефекти, для виконання яких напряму продуктивності процесора може бути недостатньо.
Альтернативні методи і розвиток
Перемикання банків витіснено в багатьох 16-бітових системах сегментацією пам'яті, яка в свою чергу поступилася місцем блокам керування пам'яттю з підкачуванням сторінок. Проте, у вбудованих системах, перемикання банків все ще має популярність через свою простоту, дешевизну і часто більшу доречність у даній галузі, ніж у комп'ютерах загального призначення.
Комп'ютери, що використовують перемикання банків
- Amstrad CPC
- Amstrad PCW
- Бортовий комп'ютер Аполлона
- Apple II
- Apple III
- Atari 130XE
- BBC Micro
- Commodore 64
- Commodore 128
- Enterprise 64/128
- MSX
- PIC
- SAM Coupé
- TRS-80 Model 4
- ZX Spectrum 128
- Агат
- Корвет
- Оріон-128
Примітки
- Д. Гивоне, Р. Россер. Микропроцессоры и микрокомпьютеры. Вводный курс = Microprocessors/Microcomputers An Introduction. — М. : Мир, 1983. — С. 367.
- D. Aspinall, William Allan Clark. The Microprocessor and its application: an advanced course. — Cambridge University Press, 1978. — С. 47-50. — ISBN ISBN 0-521-22241-9.
- C. Gordon Bell, Allen Newell. Computer structures: readings and examples. — McGraw-Hill, 1971. — С. 156.
- Steve Heath. Embedded systems design. — Second edition. — Newnes, 2003. — С. 242. — 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 (3 листопада). — С. 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. — 3 листопада. — DOI: .
- 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 (3 листопада). — С. 15. — ISSN 0199-6649.
- Jeff Angus. EMS Update Gives DOS Improved Multitasking // InfoWorld. — InfoWorld Media Group, 1987. — Т. 9, № 33 (3 листопада). — С. 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. — ISBN 1-932266-83-6.