OSDev Wiki
Регистрация
Advertisement

Область верхней памяти (HMA, High Memory Area) — область оперативной памяти объёмом 65520 байтов (64 Кбайта без 16 байт), расположенная по адресам 0010_0000 — 0010_FFEF, т.е. сразу свыше 1 Мбайта. Её нередко именуют верхней памятью, что может создать путаницу, поскольку перекликается с английским термином Upper Memory, имеющим другой смысл.

Из всей оперативной памяти ПК именно HMA была выделена в особую область из-за ошибки, допущенной инженерами Intel при разработке микропроцессора 80286. Суть её заключается в следующем.

Как известно, в реальном режиме физический адрес памяти формируется путём суммирования сдвинутого влево на 4 бита содержимого одного из сегментных регистров процессора с 16-разрядным смещением по следующей схеме (SSSS означает содержимое сегментного регистра, xxxx — смещение, а AAAAA — физический адрес, по которому производится обращение к памяти):


  SSSS0
+
  0xxxx
  -----
  AAAAA

Сложности возникают, если сегментный регистр содержит очень большую величину. Например, посмотрим, как формируется физический адрес для сегмента FFFFh и смещения 0010h:

  FFFF0
+
  00010
  -----
 100000

Как видим, для представления результата сложения необходим 21 бит, однако в микропроцессорах 8086/8088 и 80186 шина адреса имела ширину 20 бит. В этом случае «лишний» бит просто отбрасывался: для указанных значений сегмента и смещения обращение произойдёт по физическому адресу 0.

Ошибка же в 80286 заключалась в том, что этот микропроцессор не отбрасывал «лишний» бит, даже если работал в реальном режиме, когда он теоретически должен быть полностью совместим с более ранними процессорами. В результате появилась возможность обращаться из реального режима к той самой области физической памяти, которая получила название HMA.

«Ошибочной» возможностью воспользовалась фирма Microsoft, обеспечившая размещение части MS DOS в HMA, что существенно (практически на 10%) увеличило объём ОЗУ, доступный для прикладных программ. Поэтому в целях совместимости ошибку в последующих процессорах исправлять не стали. Однако некоторые программы могли из-за этого работать некорректно (случалось ли такое на практике, доподлинно неизвестно). Чтобы обеспечить возможность работы таких программ, но не исключать возможность обращения к HMA, в ПК добавили специальную схему, которая принудительно обнуляет 20-й разряд шины адреса. Эта схема получила название Gate A20 (вентиль или шлюз линии A20). Понятно, что при запрещённой линии A20 нельзя использовать память свыше 1 Мбайта, поскольку адреса, выходящие за эту границу, могут быть неправильными.

В BIOS Setup старых компьютеров был предусмотрен специальный пункт, позволявший с помощью этого вентиля разрешить или запретить линию A20; кроме того, состояние вентиля можно менять программно уже после загрузки ОС. В современных компьютерах управление вентилем A20 через BIOS Setup не предусмотрено: линия A20 всегда разрешена. Физически вентиль A20 в современных компьютерах может и отсутствовать, поскольку реальной необходимости в нём уже давным-давно нет. Тем не менее, для гарантированного обеспечения работоспособности программ, рассчитанных на использование памяти свыше 1 Мбайта, следует всегда включать вентиль A20.

Advertisement