Пространство памяти в PC-совместимых компьютерах используется для размещения собственно памяти (ОЗУ, ПЗУ), а также регистров (и областей локальной памяти) периферийных устройств. Распределение пространства памяти PC обусловлено особенностями системы адресации процессоров семейства х86 и требованиями обратной совместимости PC с ПО всех предшествующих поколений. Адресуясь в пространстве памяти, центральный процессор и активные устройства (мастера шин) могут обращаться и к памяти периферии, отображенной на это пространство. Отметим, что в логическом распределении памяти фигурирует физическая память (оперативная и постоянная), а кэш является лишь «прозрачным» средством повышения ее производительности и не представляет отдельно адресуемых областей.
Процессоры 8086/88, применявшиеся в первых моделях PC, имели доступное адресное пространство 1 Мбайт (20 бит шины адреса). Эти процессоры использовали сегментную модель памяти, унаследованную и позднейшими моделями в реальном режиме. Согласно этой модели, исполнительный (линейный) адрес вычисляется по формуле Addr == Seg • 16 + Offset, где Seg и Offset — содержимое сегментного и адресного регистров (16-разрядных). Таким образом обеспечивался доступ к адресному пространству Addr = 00000 - FFFFFh при помощи пары 16-битных регистров. Заметим, что при Seg = FFFFh и Offset = FFFFh данная формула дает адрес lOFFEFh, но ввиду 20-битного ограничения на шину адреса эта комбинация в физической памяти указывает на адрес OFFEFh. Таким образом, адресное пространство как бы сворачивается в кольцо с небольшим «нахлестом». Начиная с процессора 80286, шина адреса была расширена до 24 бит, а впоследствии (386DX, 486 и выше) до 32 и даже 36 (у процессоров Р6). В реальном режиме процессора, используемом в DOS, применяется та же сегментная модель памяти и формально доступен лишь 1 Мбайт памяти, что является недостаточным для большинства современных приложений. Процессоры 80286, с которых началась жизнь IBM PC/AT, эмулируют 8086 с ошибкой: та самая единица в бите А20, которая отбрасывалась в процессорах 8086/88, теперь попадает на шину адреса и в результате максимально доступный линейный адрес в реальном режиме достигает lOFFEFh. За эту ошибку с радостью ухватились разработчики PC, поскольку дополнительные (64 К - 16) байты оперативной памяти, адресуемой в реальном режиме, оказались подарком, позволяющим освободить дефицитное пространство оперативной памяти для прикладных программ. В эту область (lOOOOOh - lOFFEFh), названную высокой памятью (High Memory Area, HMA), стали помещать часть операционной системы и небольшие резидентные программы. Однако для полной совместимости с процессором 8086/88 в схему PC ввели вентиль линии А20 шины адреса — GateA20> который либо пропускает сигнал от процессора, либо принудительно обнуляет линию А20 системной шины адреса. Старшие биты такой «заботы» не требуют, поскольку переполнение при суммировании 16-битных компонентов адреса по данной схеме до них не распространяется. Управление этим вентилем подключили к свободному программно-управляемому выходному биту 1 контроллера клавиатуры 8042, ставшего стандартным элементом архитектуры PC, начиная с AT. Предполагалось, что этим вентилем часто пользоваться не придется. Однако жизнь внесла свои поправки, и оказалось, что переключение вентиля в многозадачных ОС, часто переключающих процессор между защищенным режимом, реальным режимом и режимом V86, контроллером клавиатуры выполняется слишком медленно. Так появились альтернативные методы быстрого переключения вентиля, специфичные для различных реализаций системных плат (например, через порт 92h). Кроме того, иногда использовали и аппаратную логику быстрого декодирования команды на переключение бита, поступающую к контроллеру клавиатуры. Для определения способа переключения в утилиту CMOS Setup ввели соответствующие параметры (см. 6.6), позволяющие выбрать между стандартным, но медленным способом и менее стандартизованным, но быстрым, в зависимости от используемого ПО.
Поскольку ошибка эмуляции 8086 была радостно принята и широко использовалась, ее повторили в 386 и в следующих моделях процессоров. А для упрощения внешних схем в процессоры, начиная с 486, ввели и вентиль GateA20 с соответствующим внешним управляющим выводом.
Распределение памяти PC, физически адресуемой процессором, проиллюстрировано рис. 4.2 и представляется следующим образом:
♦ Адреса 00000h-9FFFFh (640 Кбайт) — стандартная, или базовая, память (conventional, или base, memory). Доступна DOS и программам реального режима. В некоторых системах с видеоадаптером MDA верхняя граница сдвигается к AFFFFh (704 Кбайт). Иногда верхние 128 Кбайт стандартной памяти (область 80000h-9FFFFh) называют расширенной базовой памятью (extended conventional memory).
♦ Адреса AOOOOh-FFFFFh (384 Кбайт) — верхняя память (Upper Memory Area, UMA). Зарезервирована для системных нужд. В ней размещаются об ласти буферной памяти адаптеров, подключенных к шине ISA (например, видеопамять), и постоянная память (BIOS с расширениями). Эта область, обычно используемая не в полном объеме, ставит архитектурный барьер на пути непрерывной (нефрагментированной) памяти, удобной для программного применения.
Память выше lOOOOOh — дополнительная, или расширенная, память (extended memory). Непосредственно доступна только в защищенном (и в «большом реальном») режиме для компьютеров с процессорами 286 и выше. В ней выделяется область lOOOOOh-lOFFEFh — высокая память (НМА) — единственная область расширенной памяти, доступная 286+ в реальном режиме при открытом вентиле Gate A20.
Область памяти выше первого мегабайта в различных источниках называется по-разному. Ее современное английское название — extended memory — пересекается с названием одной из спецификаций ее использования — extended memory specification. В то же время название другой спецификации — expanded memory specification — в прямом переводе на русский язык неотличимо от перевода предыдущего термина (оба термина, и «extended» и «expanded», переводятся как «расширенный»). Будем придерживаться терминологии, укрепившейся в литературе, выпущенной издательством «Питер», и область всей физической памяти, расположенной в адресном пространстве выше первого мегабайта, назывем дополнительной памятью. Ее объем указывалтся строкой Extended Memory xxxxx Kbyte в таблице, выводимой после прохождения теста POST, и в меню стандартной конфигурации CMOS Setup. В современных компьютерах указывается общий объем оперативной памяти
Верхняя граница адресуемой памяти определяется разрядностью шины адреса процессора и системной шины; эти разрядности могут и не совпадать (ограничение дает компонент с минимальной разрядностью). В старших адресах памяти находится образ ПЗУ BIOS: в нем располагается программа начального запуска компьютера (POST), стартующая с фиксированного адреса. Оперативная память начинается с младших адресов, что обусловлено фиксированным положением таблицы векторов прерываний в реальном режиме (она начинается с нулевого адреса). Области пространства памяти, отводящиеся для отображения периферии, находятся в местах, не занятых оперативной и постоянной памятью.
Для первых компьютеров на процессорах 8086/88 с 20-битной шиной адреса верхняя граница адресуемой памяти — OF FFFFh. Область ПЗУ BIOS расположена по адресам ОЕ OOOOh-OF FFFFh; для оперативной памяти доступны область стандартной памяти (640 К) и некоторые области UMA. Память периферийных устройств может располагаться только в UMA.
Для компьютеров класса АТ-286 с 24-битной шиной адреса верхняя граница адресуемой памяти — FF FFFFh. Область FE OOOOh-FF FFFFh содержит ПЗУ BIOS (ROM BIOS Area), обращение к этой области эквивалентно обращению к ROM BIOS по адресам ОЕ OOOOh-OF FFFFh. В этих компьютерах для оперативной памяти доступна и область дополнительной памяти, максимальный размер ОЗУ может достигать 15,9 Мбайт. Однако последний мегабайт (кроме области BIOS) может быть отдан для областей памяти периферии (дополнительно к UMA), так что объем ОЗУ окажется меньше 15 Мбайт.
Для процессоров 386+ и 32-битной шины адреса верхняя граница адресуемой памяти — FFFF FFFFh (4 Гбайт). Здесь образ BIOS находится в адресах FFFE OOOOh-FFFF FFFFh, для ОЗУ и памяти периферии остается почти 4 Гбайт. Для обеспечения совместимости BIOS дополнительно проецируется и в адреса Е OOOOh-F FFFFh (для программ, вызывающих сервисы BIOS по фиксированным адресам). Для периферии доступна область UMA, не занятая BIOS, и область, находящаяся выше границы ОЗУ (но ниже границы 4 Гбайт). Периферия, расположенная на шине PCI и ее «родственниках», может быть приписана к любым адресам (на PCI доступно все адресное пространство). Периферия на шине ISA с ее 20-разрядным адресом может располагаться только в пределах первых 16 Мбайт: в UMA или в 16-м мегабайте памяти. Для адаптеров ISA в CMOS Setup предусмотрен параметр Memory Hole At 15-16M, его установка запрещает отображение на эти адреса оперативной памяти. В современных версиях BIOS эта «дырка» не мешает использованию ОЗУ объемом свыше 15 Мбайт.
Современные процессоры с 64-битным расширением, как и 32-разрядные процессоры с 36-битной шиной адреса, позволяют адресовать память и выше 4-гигабайтной границы. Объем установленного ОЗУ также может превышать 4 Гбайт, но для периферийных устройств предусмотрено «окно» под границей 4 Гбайт. В процессорах с 64-битным расширением есть пара специальных регистров, определяющих нижние границы адресов для устройств ввода-вывода, отображенных на память, для двух областей: под границей 4 Гбайт и под границей физически адресуемой памяти (зависящей от модели процессора).
Иногда (в некоторых версиях BIOS для 32-разрядных процессоров) в CMOS Setup можно включить проекцию BIOS на область FE OOOOh-FF FFFFh (как в АТ-286). Особого смысла в этом нет (программы реального режима задействуют образ в Е OOOOh-F FFFFh), однако включение этого параметра может создать трудности для использования более 16 Мбайт ОЗУ (система воспринимает только найденную непрерывную область оперативной памяти).
Объем установленной оперативной памяти определяется тестом POST при начальном включении (перезагрузке) компьютера, начиная с младших адресов. Натолкнувшись на отсутствие памяти (ошибку), тест останавливается и сообщает системе объем реально работающей памяти. Установленные в Setup «дырки» под 16-м мегабайтом современные версии BIOS успешно обходят. Современные системные платы позволяют установить ОЗУ, объем которого исчисляется уже гигабайтами. Возможность использования тех или иных областей оперативной памяти определяется типом операционной системы: ОС реального (MS-DOS и аналогичные) или защищенного режима (Windows, Unix, Linux).
Физическое распределение адресного пространства выполняется программированием регистров чипсета системной платы и мостов шин расширения. Северный хаб (или мост) чипсета определяет диапазоны адресов, которые обслуживает контроллер памяти (с «вырезами» в области UMA и другими «дырками»). Распределением оставшейся части занимаются мосты иерархии шин PCI (в эту иерархию входят мосты AGP, PCI-X и PCI-E), к которым могут подключаться и мосты старых шин (ISA).
Память для режима SMM
Компьютеры, использующие режим системного управления (System Management Mode, SMM), поддерживаемый большинством процессоров последних поколений, имеют еще одно адресное пространство памяти — SMRAM (System Management RAM). Это адресное пространство «параллельно» пространству обычной памяти и при работе доступно процессору только в режиме SMI. Память SMRAM может представлять собой часть физической оперативной памяти, хотя может быть реализована и отдельной микросхемой памяти. Объем памяти для режима SMM может варьироваться в диапазоне от 32 Кбайт (минимальные потребности SMM) до 4 Гбайт. SMRAM располагается, начиная с адреса SMIBASE, и распределяется следующим образом:
♦ SMIBASE+(FEOOh-FFFFh) — область сохранения контекста процессора (рас пределяется, начиная со старших адресов по направлению к младшим). По пре рывании SMI здесь сохраняются почти все регистры процессора, но сохране ние регистров FPU/MMX не производится.
♦ SMIBASE+8000h — точка входа в обработчик (SMI handler).
SMIBASE+(0-7FFFh) - свободная область.
После сброса процессора устанавливается SMIBASE = 0003 OOOOh, и первое же прерывание SMI вызовет сохранение контекста в область 0003 FEOOh - 0003 FFFFh и запуск обработчика по адресу 0003 8000h. При этом процессор генерирует специальный выходной сигнал SMIACT#, означающий доступ к памяти SMRAM. Код обработчика, естественно, должен быть помещен в эту область до вызова SMI. Если для SMRAM используется системное ОЗУ, то область SMRAM перемещают в старшие адреса. Это можно сделать только обработчиком прерывания SMI, заменив образ регистра SMIBASE в сохраненной области контекста. После выхода из прерывания SMI это назначение вступит в силу, и следующий вход в SMM уже будет производиться по новым адресам. Область SMRAM должна исключаться из области ОЗУ, доступной операционной системе (обработчик SMI является более низкоуровневой процедурой, чем драйверы ОС).
Верхняя память — UMA
Верхняя память имеет области различного назначения, которые могут быть заполнены буферной памятью адаптеров, постоянной памятью или оставаться незаполненными. В первое время эти «дыры» не использовали из-за сложности «фигурного выпиливания» адресуемого пространства. С появлением механизма страничной переадресации (у процессоров 386 и выше) их стали по возможности заполнять «островками» оперативной памяти, названными блоками верхней памяти (Upper Memory Block, UMB). Эти области доступны DOS для размещения резидентных программ и драйверов через драйвер EMM386, который отображает в них доступную дополнительную память.
Стандартное распределение верхней памяти выглядит следующим образом (рис. 4.3):
♦ Адреса AOOOOh-BFFFFh (128 Кбайт) - видеопамять (Video RAM, VRAM). Обычно используется не полностью.
♦ Адреса COOOOh-DFFFFh (128 Кбайт) — резерв для адаптеров (adapter ROM и adapter RAM), использующих собственные модули ROM BIOS или/и спе циальное ОЗУ, разделяемое с системной шиной.
♦ Адреса EOOOOh-EFFFFh (64 Кбайт) — свободная область, иногда занятая под системные модули BIOS (system BIOS).
♦ Адреса FDOOOh-FDFFFh - ESCD (Extended System Configuration Data) - область энергонезависимой памяти, используемая для конфигурирования устройств Plug and Play. Эта область имеется только при наличии РпР BIOS, ее положение и размер жестко не заданы.
В области UMА практически всегда присутствует графический адаптер. В зависимости от модели он занимает следующие области:
♦ MDA RAM - BOOOOh-BOFFFh.
♦ CGA RAM - B8000h-BBFFFh.
♦ EGA ROM - C0000h-C3FFFh/C7FFFh.
♦ VGA ROM - C0000h-C7FFFh.
♦ EGA, VGA RAM — AOOOOh-BFFFFh, в зависимости от видеорежима исполь зуются следующие области:
• Graphics - AOOOOh-AFFFFh;
• Color Text - B8000h-BFFFFh;
• Mono Text - B0000h-B7FFFh.
Также распространенным потребителем UMA являются расширения ROM BIOS, расположенные на платах дисковых контроллеров, а еще микросхемы удаленной загрузки (boot ROM) на платах адаптеров ЛВС. Обычно они занимают область C8000h — CBFFFh/C9FFFh/C8FFFh (для дисковых контроллеров), но могут и перемещаться при конфигурировании адаптеров.
Размер области, занимаемой системными модулями ROM BIOS, колеблется от 8 Кбайт у PC/XT до 128 Кбайт, однако разумное значение — 64 Кбайт. Большая область использовалась «на радостях» от появления микросхем ROM и флэш-памяти объемом 1 Мбит (128К х 8), но при этом размер доступной памяти UMA сократился. Тогда стали микросхемы того же (и большего) объема отображать только на область FOOOOh-FFFFFh (64 Кбайт), а иногда и меньшую. Это оказалось возможным, поскольку не все содержимое микросхемы ROM BIOS должно быть доступно одновременно. Таким образом удалось примирить интересы пользователей UMB с необходимостью расширения объема BIOS, связанной с усложнением технических средств.