Логическая структура оперативной памяти


Логическая структура оперативной памяти.




Михаил Тычков aka Hard



Доброго времени суток.

По сути дела, эта статья является продолжением статьи «DRAM». Только сегодня я буду рассказывать Вам о логическом строении оперативной памяти. Делится она на несколько областей (зон, разделов):

    1. Conventional memory – основная память;

    2. UMA (Upper Memory Area) – верхняя память;

    3. HMA (High Memory Area) – область верхней памяти или область верхних адресов;

    4. XMS (eXtended Memory Specification) – дополнительная память;

    5. EMS (Expanded Memory Specification) – расширенная память;

Зачем нужен весь этот геморрой с разделением памяти на области? Тянется это еще с компьютеров PC/XT, когда рабочее пространство оперативной памяти составляло 1 Мбайт. Это пространство было разделено на области, в одну область грузились специальные программы DOS, в другую – все остальное. Деление, по началу было пополам: по 512 Кбайт для каждой области. Затем было решено, что для обслуживания системы вполне хватит 384 Кбайт. Это означало, что для всего остального оставалось уже 640 Кбайт. Сегодня объем оперативной памяти шагнул за сотни мегабайт, но деление осталось и еще более усложнилось.

Что бы рассказывать дальше о зонах памяти, необходимо сделать большое отступление. Тот, кто разбирается в адресации, может этот абзац не читать, потому как сейчас пойдет разговор именно о ней. Если Вам кто-либо сказал, что оперативная память и адресное пространство одно и тоже – плюньте ему в рожу! Адресное пространство – это набор адресов, который может формировать процессор. Зачем? Хороший вопрос. Дело в том, что каждая ячейка памяти имеет адрес. И что бы считать (или записать) хранимую в ней информацию, надобно к ней обратится по ее адресу. Адреса делятся на виртуальные (логические) и физические. Физические адреса – это реальные адреса реальных ячеек памяти. Программам глубоко параллельно до таких адресов, так как они оперируют символьными именами, которые затем транслятором преобразовываются в виртуальные адреса. Потом виртуальные адреса преобразовываются в физические. Делается это аппаратным способом, а вот как - я сейчас рассказывать не буду, потому что это тема отдельной статьи. Логические адреса представляются в шестнадцатеричной форме и состоят из двух частей. Почему из двух? Объясню. Дело в том, что логически оперативная память разделена на сегменты. Так вот первая часть логического адреса – начало сегмента, а вторая – смещение от этого начала (сегмент:смещение). Выглядит это примерно так: D000:7FFF. Кстати, записать подобный адрес можно и по-другому, сложив обе части. Получим D7FFF – это будет полный, а точнее линейный адрес (вообще-то в шестнадцатеричной системе счисления принято еще буковку h в конце адреса добавлять, но мы же с Вами не идиоты и я этого делать не буду). Объем адресуемой памяти не безграничен. Он зависит от адресной шины процессора, а точнее от ее разрядности. Давайте-ка посчитаем. В процессоре 8086 использовалась 20 разрядная адресная шина. Так как в компьютерах используется двоичная система, то возведя 2 в степень 20, получим максимальный адресуемый объем памяти для 8086 процессора. Это будет 1 048 576 байт или 1 Мбайт. Для современных процессоров максимальный адресуемый объем памяти равен 64 Гбайт. Ну да фиг с ним. Нам и надо было только себе уяснить, что из себя представляют адреса. Двигаемся дальше!

Основная память (Conventional memory)

Начинается с адреса 00000 (0000:0000) и до 90000 (9000:0000). Это занимает 640 Кбайт. В эту область грузится в первую очередь таблица векторов прерываний, начиная с 00000 и занимает 1 Кбайт, далее следуют данные из BIOS (счетчик таймера, буфер клавиатуры и т. д.), а затем уж всякие 16 разрядные программы DOS (для них 640 Кбайт – барьер, за который могут выскочить только 32 разрядные проги). На данные BIOS’а отводится 768 байт. С этой байдой закончили :).

Верхняя память (UMA)

Начинается с адреса А0000 и до FFFFF. Занимает она 384 Кбайт. Сюда грузится инфа, связанная с аппаратной частью компьютера. UMA можно разделить на 3 части по 128 Кбайт. Первая часть (от А0000 до BFFFF) предназначена для видеопамяти. В следующую часть (от C0000 до DFFFF) грузятся программы BIOS адаптеров. Последняя часть (от E0000 до FFFFF) зарезервирована для системной BIOS. Тут есть одна фишка. Дело в том, что последние 128 Кбайт не полностью используются. В большинстве случаев под BIOS задействованы только последние 64 Кбайт. Свободная же часть UMB управляется драйвером EMM386.EXE и используется для нужд операционной системы.

А вот теперь, что бы двигаться дальше, надо сделать еще одно отступление. В стародавние времена первых персональных компьютеров, процессоры могли выполнять только лишь 16 разрядные команды, а адресовать не более 1 Мбайта памяти, так как использовали 20 разрядную адресную шину (где-то я уже говорил это). Операционная система DOS и все прикладные программы были на это рассчитаны. При этом, выполняться могла только одна программа – это так называемый однозадачный режим. Никакой защиты от перезаписи ячеек памяти одной программы другой не было. Такой режим назвали реальный (тоже мне, мля, название). Затем на свет появился первый 32 разрядный процессор 80386, который мог уже работать с 32 разрядными приложениями. Но так же и возможность работать со старыми программами была оставлена. В новом процессоре адресная шина была либо 24 разрядной (386SX, 386SL) или 32 разрядной (386DX). Понятно, что адресовать он мог уже большее пространство. При этом была решена задача защиты данных в ячейках памяти от перезаписи. Такой вот режим назвали защищенным. Отступление закончили.

XMS

Основная и верхняя память занимают 1 Мбайт памяти в общей сложности. Что бы работать с областью свыше 1 Мбайта, процессор должен работать в защищенном режиме. Эта область называется дополнительная память (XMS). Что бы работать в XMS используя DOS, для процессоров был разработан еще один режим – виртуальный. Помните, еще в начале статьи я говорил, что DOS не может переплюнуть барьер в 640 Кбайт? Так вот, виртуальный режим позволяет разбить дополнительную память на части по 1 Мбайту. В каждую часть грузится по программе DOS и там они варятся в реальном режиме но уже не мешая друг другу выполнятся одновременно. 32 разрядным приложениям на барьер в 640 Кбайт начихать и для них деление XMS ни к чему. Отвечает за перевод режимов процессора драйвер EMM386.EXE, а за организацию самой области – HIMEM.SYS. Посмотреть, что творится у Вас в XMS можно с помощью SysInfo из набора Norton Utilities.

HMA

Но это еще не все. В дополнительной области, в самом начале ее первого мегабайта выделена зона, объем которой равен 64 Кбайт минус 16 байт. Называется эта фигня областью верхних адресов (HMA). История появления этой области лежит корнями глубоко и тянется аж к 80286 процессору, а точнее к ошибке в его схеме. Я уже говорил, что процессоры 8086 и 8087 имели 20 разрядную адресную шину, работали в реальном режиме и могли максимально обратится по адресу FFFFF (FFFF:000F). А вот 80286 процессор имел уже 24 разрядную шину адреса, работал в реальном и защищенном режимах и мог адресовать до 16 Мбайт памяти. Теперь рассмотрим такую вот ситуевину: возьмем сегментный адрес FFFF:FFFF и переведем его в линейный, получим 10FFEF. Такой адрес 8086 камень адресовать не мог, так как это уже во втором мегабайте памяти. В подобных случаях делалось просто – откидывался старший разряд. Получится 0FFEF, а это уже обращение на 16 байт от конца первого сегмента в 64 Кбайт первого мегабайта памяти. И все зашибись. 80286 процессор работая в реальном режиме должен был поступать также. Но геморрой заключался в том, что в этом режиме 21 линия шины адреса (А20) не отключалась и оставалась в работе. А значит получалось в данном случае обращение на 16 байт от конца первого сегмента в 64 Кбайт второго мегабайта памяти. Не все проги могли тогда работать таким образом и инженеры нашли способ включать и отключать линию А20. Для этих целей использовался специальный контроллер. Для управления HMA используется уже известный нам HIMEM.SYS.

EMS

Ну и наконец еще одна область – расширенная память (EMS). Вообще то эта фигня на сегодняшний день мало кому нужна и мало кем используется. Поэтому я только лишь коротенько пробегусь по данной теме. Находится эта область в верхней памяти и занимает порядка 64 Кбайт. Использовалась она лишь в старых компах с оперативной памятью до 1 Мбайта. В силу своей спецификации это достаточно медленная область. Дело в том, что расширенная память – это один из многих коммутируемых сегментов. После того, как сегмент заполнится, происходит смена использованного сегмента новым. Но работать можно только с одним сегментом, а это, Вы сами должны понимать, не совсем хорошо, удобно и быстро. Как правило первый сегмент EMS находится по адресу D000.

А теперь изображу-ка я все, о чем говорил выше в графическом виде. Мне кажется наглядная агитация не повредит Вам.

логическая структура оперативной памяти

Ну, поняли что-нибудь? Если да, то значит не зря я просидел два дня над этой статьей! Все, пишите письма мелким почерком. Удачи.

29.10.02

читать еще по теме