Организация памяти в компьютерах типа ibm pc, страница 6

Дополнительная память

Дополнительная  память  (Expanded  memory), часто называемая EMS (Expanded Memory Specification)  или  LIM  (согласно ее  разработчикам: Lotus,  Intel  и Microsoft), представляет собой способ доступа к памяти, лежащей за пределами 1 Мб, посредством окна размером 64 Кбайт, лежащего в области служебных адресов между 640 Кб и 1 Мб. При этом используется так называемая схема коммутации банков памяти (bankswitching) – способ управления памятью, когда физическая память разбита на  несколько сегментов (банков) длиной, равной размеру адресного пространства процессора.  В  каждый  момент процессор работает с одним банком. Память EMS логически подразделяется на участки размером по 16 Кбайт, называемые страницами. В процессе работы с дополнительной памятью  часть содержимого банка размером в 4 страницы,  или в 64 Кб отображается в определенный регион, лежащий в пределах 1 Мб, чаще всего в регион E. Данный регион принято называть EMS-фреймом. EMS-фрейм как бы «скользит» по всему адресному пространству банка, что позволяет программам, физически обращаясь к адресам в пределах 1 Мб, получать, тем не менее, доступ ко всей памяти, которая установлена на компьютере.

Дополнительная память особенно полезна потому, что, в отличие от расширенной памяти, она использует только адреса ниже границы в 1MB, следовательно, она может использоваться на машинах с процессорами 8086/8088, кроме того, при программировании нет необходимости использовать адреса, лежащие за пределами 1 Мб. Их отображение в EMS-фрейм будет выполнено драйвером дополнительной памяти. Недостатком EMS-памяти является некоторое замедление при обращении к  памяти, которое объясняется накладными расходами, связанными с отображением страниц EMS в EMS-фрейм, переключением банков и т.д. Основными драйверами, обеспечивающими доступ к дополнительной памяти, являются EMM386 (Microsoft), QEMM (Quarterdeck) и 386MAX (Qualitas).

Область верхней памяти (HMA)

Начиная с процессора 80286 можно было наблюдать интересный эффект, связанный с тем, как происходит адресация в пределах 1 Мб. Согласно используемой при программировании в реальном режиме сегментной модели, все адресное пространство может быть представлено в виде пересекающихся между собой участков – сегментов размером в 64 Кб, которые должны начинаться с адреса, кратного 16. До тех пор, пока сегмент начинается с адресов, лежащих до 960 Кб включительно, все более или менее понятно. Однако, как быть в случае, когда сегмент начинается с адреса, лежащего выше 960 Кб? Ведь в этом случае все 64 Кб, входящие в сегмент, просто не уместятся в пределах 1 Мб. В случае с процессором 8086 просто-напросто происходил циклический возврат к началу. Например, если сегмент начинался, скажем, по адресу FB00 или  1028096 байт (1 Мб =  1048576 байт), то первые 4FFF или  20480 байт сегмента располагались в самом верху адресного пространства до 1 Мб включительно, а остальные B000 или  45056 байт – начиная опять с 0 адреса, то есть с самого начала адресного пространства процессора. В