Организация памяти в компьютере



Память в компьютере

Память – способность компьютера обеспечивать хранение данных. Все объекты, над которыми выполняются команды, как и сами команды, хранятся в памяти. 

Память состоит из ячеек, в каждой из которых содержится 1 бит информации, принимающий одно из двух значений: 0 или 1. Биты обрабатывают группами фиксированного размера. Для этого группы бит могут записываться и считываться за одну базовую операцию.  

Группа из 8 бит называется байт.

1 килобайт (Кбайт) = 210 = 1 024 байт

1 мегабайт (Мбайт) = 210 Кбайт = 220 байт = 1 048 576 байт

1 гигабайт (Гбайт) = 210 Мбайт = 230 байт = 1 073 741 824 байт

Для доступа к памяти с целью записи или чтения отдельных элементов информации используются идентификаторы, определяющие расположение в памяти этих элементов. Каждому идентификатору в соответствие ставится адрес. В качестве адресов используются числа из диапазона от 0 до 2k-1 со значением k, достаточным для адресации всей памяти компьютера. Все 2k адресов составляют адресное пространство компьютера.

Способы адресации байтов

Существует прямой и обратный способы адресации байтов.

При обратном способе адресации байты адресуются слева направо, так что самый старший (левый) байт слова имеет наименьший адрес (рисунок).

Прямым способом называется противоположная система адресации (рисунок ниже). Компиляторы высокоуровневых языков поддерживают прямой способ адресации.

Объект занимает целое слово. Поэтому для того, чтобы обратиться к нему в памяти, нужно указать адрес, по которому этот объект хранится.

 

Организация стека

Стек – это такая структура данных в памяти, которая используется для временного хранения информации. Программа может поместить слово в стек (команда PUSH) или извлечь его из стека (команда POP). 

Данные в стеке упорядочиваются специальным образом. Извлекаемый из стека элемент данных – это всегда тот элемент, который был записан туда последним. Такая организация хранения данных сокращенно обозначается LIFO (Last In, First Out – последний поступивший удаляется первым). Если мы поместим в стек два элемента: сначала A, а затем B, то при первом обращении к стеку извлекается элемент B, а при следующем – A. Информация выбирается из стека в обратном по отношению к записи порядке.

В ЭВМ за стеком резервируется блок памяти, адресуемый регистром SS и указатель, называемый указателем стека SP (Stack Pointer). Указатель стека используется программой для того, чтобы фиксировать самый последний записанный в стек элемент данных. При выполнении команды POP или PUSH значение указателя стека соответственно увеличивается или уменьшается на 4 (рисунок).

 

Организация памяти

Физическая память, к которой микропроцессор имеет доступ по шине адреса, называется оперативной памятью (ОП) (или оперативным запоминающим устройством - ОЗУ). Механизм управления памятью полностью аппаратный, т.е. программа сама не может сформировать физический адрес памяти на адресной шине.

Микропроцессор аппаратно поддерживает несколько моделей использования оперативной памяти:

- сегментированная модель;

- страничная модель;

- плоская модель.

В сегментированной модели память для программы делится на непрерывные области памяти, называемые сегментами. Программа может обращаться только к данным, которые находятся в этих сегментах. Сегмент представляет собой независимый, поддерживаемый на аппаратном уровне блок памяти.

Сегментация - механизм адресации, обеспечивающий существование нескольких независимых адресных пространств как в пределах одной задачи, так и в системе в целом для защиты задач от взаимного влияния.

Каждая программа в общем случае может состоять из любого количества сегментов, но непосредственный доступ она имеет только к 3 основным сегментам и к 3 дополнительным сегментам, обслуживаемых 6 сегментными регистрами. К основным сегментам относятся:

- Сегмент кодов (.CODE) – содержит машинные команды для выполнения. Обычно первая выполняемая команда находится в начале этого сегмента, и операционная система передает управление по адресу данного сегмента для выполнения программы. Регистр сегмента кодов (CS) адресует данный сегмент.

- Сегмент данных (.DATA) – содержит определенные данные, константы и рабочие области, необходимые программе. Регистр сегмента данных (DS) адресует данный сегмент.

- Сегмент стека (.STACK). Стек содержит адреса возврата как для программы (для возврата в операционную систему), так и для вызовов подпрограмм (для возврата в главную программу). Регистр сегмента стека (SS) адресует данный сегмент. Адрес текущей вершины стека задается регистрами SS:ESP.

Регистры дополнительных сегментов (ES, FS, GS), предназначены для специального использования.

Для доступа к данным внутри сегмента обращение производится относительно начала сегмента линейно, т.е. начиная с 0 и заканчивая адресом, равным размеру сегмента. Для обращения к любому адресу в программе, компьютер складывает адрес в регистре сегмента и смещение - расположение требуемого адреса относительно начала сегмента. Например, первый байт в сегменте кодов имеет смещение 0, второй байт – 1 и так далее.

Таким образом, для обращения к конкретному физическому адресу ОЗУ необходимо определить адрес начала сегмента и смещение внутри сегмента. 

Физический адрес принято записывать парой этих значений, разделенных двоеточием:

сегмент:смещение.

Регистры дополнительных сегментов (ES, FS, GS), предназначены для специального использования. 

На рисунке ниже графически представлены регистры SS, DS и S. Последовательность регистров и сегментов на практике может быть иной. Три сегментных регистра содержат начальные адреса соответствующих сегментов, и каждый сегмент начинается на границе параграфа.

Операционная система размещает сегменты программы в ОП по определенным физическим адресам, а значения этих адресов записывает в определенные места, в зависимости от режима работы микропроцессора:

 

- в реальном режиме адреса помещаются непосредственно в сегментные регистры (cs, ds, ss, es, gs, fs);

- в защищенном режиме - в специальную системную дескрипторную таблицу (Элементом дескрипторной таблицы является дескриптор сегмента. Каждый сегмент имеет дескриптор сегмента -8 байт. Существует три дескрипторные таблицы. Адрес каждой таблицы записывается в специальный системный регистр).

Для доступа к данным внутри сегмента обращение производится относительно начала сегмента линейно, т.е. начиная с 0 и заканчивая адресом, равным размеру сегмента. Этот адрес называется смещением (offset) (рисунок).

Двухбайтовое смещение (16-бит) может быть в пределах от 0000h до FFFFh или от 0 до 65535. Для обращения к любому адресу в программе, компьютер складывает адрес в регистре сегмента и смещение. Например, первый байт в сегменте кодов имеет смещение 0, второй байт – 01 и так далее.

 

В качестве примера адресации допустим, что регистр сегмента данных содержит 045Fh, и некоторая команда обращается к ячейке памяти внутри сегмента данных со смещением 0032h. Несмотря на то, что регистр сегмента данных содержит 045Fh, он указывает на адрес 045F0, то есть на границу параграфа. Действительный адрес памяти поэтому будет следующий:

Адрес в DS:                       045F0

Смещение:                         0032.

Реальный адрес:                04622.

Адрес указывается как DS: 0032h.

ОС строит для каждого исполняемого процесса соответствующую таблицу дескрипторов сегментов и при размещении каждого из сегментов в ОП или внешней памяти в дескрипторе отмечает его текущее местоположение (бит присутствия).

Дескриптор содержит поле адреса, с которого сегмент начинается и поле длины сегмента. Благодаря этому можно осуществлять контроль:

1. размещения сегментов без наложения друг на друга;

2. обращается ли код исполняющейся задачи за пределы текущего сегмента.

В дескрипторе содержатся также данные о правах доступа к сегменту (запрет на модификацию, можно ли его предоставлять другой задаче) и защита.

Достоинства сегментной организации памяти:

1. общий объем виртуальной памяти превосходит объем физической памяти;

2. возможность размещать в памяти как можно больше задач (до определенного предела) увеличивает загрузку системы, т. е. более эффективно использовать ресурсы системы.

Недостатки:

1. увеличивается время на доступ к искомой ячейке памяти, т.к. необходимо вначале прочитать дескриптор сегмента, после чего, используя его данные, можно вычислить физический адрес (для уменьшения этих потерь используется кэширование - дескрипторы, с которыми работа идет в данный момент размещаются в сверхоперативной памяти - в специальных регистрах процессора);

2. фрагментация;

3. потери памяти на размещение дескрипторных таблиц;

4. потери процессорного времени на обработку дескрипторных таблиц.

 

Страничная модель памяти – это надстройка над сегментной моделью. ОЗУ делится на блоки фиксированного размера, кратные степени 2, например 4 Кб. Каждый такой блок называется страницей. Основное достоинство страничного способа распределения памяти - минимально возможная фрагментация. Однако такая организация памяти не использует память достаточно эффективно за счет фиксированного размера страниц.

 

Плоская модель памяти предполагает, что задача состоит из одного сегмента, который, в свою очередь, разбит на страницы.

Достоинства:

1. при использовании плоской модели памяти упрощается создание и операционной системы, и систем программирования;

2. уменьшаются расходы памяти на поддержку системных информационных структур.

В абсолютном большинстве современных 32(64)-разрядных операционных систем (для микропроцессоров Intel) используется плоская модель памяти.

 

Задание модели памяти в программе

Директива .MODEL определяет модель памяти, используемую программой. После этой директивы в программе находятся директивы объявления сегментов (.DATA, .STACK, .CODE, SEGMENT). 

Синтаксис задания модели памяти

.MODEL модификатор МодельПамяти СоглашениеОВызовах.

Параметр МодельПамяти является обязательным.

 

Модель памяти Адресация кода Адресация данных Операционная система Чередование кода и данных
TINY NEAR NEAR MS-DOS Допустимо
SMALL NEAR NEAR MS-DOS, Windows Нет
MEDIUM FAR NEAR MS-DOS, Windows Нет
COMPACT NEAR FAR MS-DOS, Windows Нет
LARGE FAR FAR MS-DOS, Windows Нет
HUGE FAR FAR MS-DOS, Windows Нет
FLAT NEAR NEAR Windows NT, Windows 2000, Windows XP, Windows Vista Допустимо

 

Модель tiny работает только в 16-разрядных приложениях MS-DOS. В этой модели все данные и код располагаются в одном физическом сегменте. Размер программного файла в этом случае не превышает 64 Кбайт.

Модель small поддерживает один сегмент кода и один сегмент данных. Данные и код при использовании этой модели адресуются как near (ближние).

Модель medium поддерживает несколько сегментов программного кода и один сегмент данных, при этом все ссылки в сегментах программного кода по умолчанию считаются дальними (far), а ссылки в сегменте данных — ближними (near).

Модель compact поддерживает несколько сегментов данных, в которых используется дальняя адресация данных (far), и один сегмент кода с ближней адресацией (near).

Модель large поддерживает несколько сегментов кода и несколько сегментов данных. По умолчанию все ссылки на код и данные считаются дальними (far).

Модель huge практически эквивалентна модели памяти large.

Особого внимания заслуживает модель памяти flat, которая используется только в 32-разрядных операционных системах. В ней данные и код размещены в одном 32-разрядном сегменте. Для использования в программе модели flat перед директивой .model flat следует разместить одну из директив: 

- .386

- .486

- .586

- .686

Желательно указывать тот тип процессора, который используется в машине, хотя это не является обязательным требованием. Операционная система автоматически инициализирует сегментные регистры при загрузке программы, поэтому модифицировать их нужно только в случае если требуется смешивать в одной программе 16-разрядный и 32-разрядный код. Адресация данных и кода является ближней (near), при этом все адреса и указатели являются 32-разрядными.

Параметр модификатор используется для определения типов сегментов и может принимать значения use16 (сегменты выбранной модели используются как 16-битные) или use32 (сегменты выбранной модели используются как 32-битные).

Параметр СоглашениеОВызовах используется для определения способа передачи параметров при вызове процедуры из других языков, в том числе и языков высокого уровня (C++, Pascal). Параметр может принимать следующие значения:

- C,

- BASIC,

- FORTRAN,

- PASCAL,

- SYSCALL,

- STDCALL.

При разработке модулей на ассемблере, которые будут применяться в программах, написанных на языках высокого уровня, обращайте внимание на то, какие соглашения о вызовах поддерживает тот или иной язык. Используются при анализе интерфейса программ на ассемблере с программами на языках высокого уровня.

 


Дата добавления: 2018-06-27; просмотров: 761; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!