Составители:
Введение: от MS DOS к MS Windows.
При переходе от MS DOS к MS Windows 3.x и далее к MS Windows 9x/Me и
NT/2000/XP система управления памятью (СУП) претерпела существенные
изменения. Чем проще операционная система (ОС) тем больше ее СУП отражает
особенности аппаратной платформы, на которой выполняется ОС. MS DOS,
ориентированная на работу с младшими моделями процессоров семейства Intel
80x86, поддерживала сегментированную модель памяти. В этой
модели полный
адрес ячейки ОЗУ формируется из двух частей: базового адреса (сегмент) и
смещения от этой базы (собственно смещение). Такая модель соответствует
стандартному (реальному) режиму работы процессоров Intel 80x86, в котором для
хранения сегментной части адреса используются специальные 16-битные
сегментные регистры. Смещение также хранится в 16-битных регистрах
процессора. В такой архитектуре для доступа
к ячейкам памяти, отстоящим от базы
не более чем на 2
16
байт, достаточно менять только смещение, оставляя значение
сегмента неизменным. Отсюда возникает "магическое число" - максимальный
размер сегмента MS DOS - 64 Кб (2
16
байт).
Языки программирования, поддерживающие создание системных
приложений, для хранения адресов используют специальные переменные -
указатели. В MS DOS возможно использование ближних (только смещение) и
дальних (сегмент и смещение) указателей. Когда программа загружается в ОЗУ,
часть адресов уже занята ядром ОС, драйверами устройств, другими программами
(резидентными). Поэтому реальные адреса объектов программы формируются
совместными
действиями компилятора языка программирования и загрузчика ОС.
В простейшем случае, компилятор формирует два сегмента: кода (содержит коды
всех функций программы) и данных (глобальные/статические переменные и
программный стек). Все идентификаторы программы после компиляции
представлены в программе их адресами. При этом компилятор отсчитывает адреса
от некоторого условного стартового или базового адреса. Загрузчик
ОС определяет
свободный адрес в ОЗУ и, используя его в качестве базового, настраивает все
адреса программы. Глобальные и статические переменные существуют все время,
пока выполняется программа (занимают фиксированный диапазон адресов в
сегменте данных). Локальные переменные размещаются в программном стеке и,
хотя стек - это динамически изменяющаяся структура данных, но все изменения
стека определяются компилятором. Между адресом последней глобальной или
статической переменной и верхушкой стека образуется область незанятых адресов.
Эта область называется локальной "кучей" (local heap). Все свободные адреса за
программой образуют глобальную кучу (global heap). Когда говорят о
динамическом распределении памяти, то подразумевают возможность захвата,
использования и освобождения дополнительных блоков памяти из глобальной или
локальной кучи
во время выполнения программы. В Си для динамического
распределения памяти используют функции стандартной библиотеки: malloc(),
calloc(), realloc(), free(). В C++ - операции new и delete.
MS Windows 3.x переводит процессор в защищенный режим работы, с иной,
более сложной схемой обращения к памяти. В этом режиме память распределяется
страницами по 4 Кб каждая. На аппаратном уровне для адресации используются
регистры дескрипторов страниц.
Программа же работает не с физическими, а с
Введение: от MS DOS к MS Windows. При переходе от MS DOS к MS Windows 3.x и далее к MS Windows 9x/Me и NT/2000/XP система управления памятью (СУП) претерпела существенные изменения. Чем проще операционная система (ОС) тем больше ее СУП отражает особенности аппаратной платформы, на которой выполняется ОС. MS DOS, ориентированная на работу с младшими моделями процессоров семейства Intel 80x86, поддерживала сегментированную модель памяти. В этой модели полный адрес ячейки ОЗУ формируется из двух частей: базового адреса (сегмент) и смещения от этой базы (собственно смещение). Такая модель соответствует стандартному (реальному) режиму работы процессоров Intel 80x86, в котором для хранения сегментной части адреса используются специальные 16-битные сегментные регистры. Смещение также хранится в 16-битных регистрах процессора. В такой архитектуре для доступа к ячейкам памяти, отстоящим от базы не более чем на 216 байт, достаточно менять только смещение, оставляя значение сегмента неизменным. Отсюда возникает "магическое число" - максимальный размер сегмента MS DOS - 64 Кб (216 байт). Языки программирования, поддерживающие создание системных приложений, для хранения адресов используют специальные переменные - указатели. В MS DOS возможно использование ближних (только смещение) и дальних (сегмент и смещение) указателей. Когда программа загружается в ОЗУ, часть адресов уже занята ядром ОС, драйверами устройств, другими программами (резидентными). Поэтому реальные адреса объектов программы формируются совместными действиями компилятора языка программирования и загрузчика ОС. В простейшем случае, компилятор формирует два сегмента: кода (содержит коды всех функций программы) и данных (глобальные/статические переменные и программный стек). Все идентификаторы программы после компиляции представлены в программе их адресами. При этом компилятор отсчитывает адреса от некоторого условного стартового или базового адреса. Загрузчик ОС определяет свободный адрес в ОЗУ и, используя его в качестве базового, настраивает все адреса программы. Глобальные и статические переменные существуют все время, пока выполняется программа (занимают фиксированный диапазон адресов в сегменте данных). Локальные переменные размещаются в программном стеке и, хотя стек - это динамически изменяющаяся структура данных, но все изменения стека определяются компилятором. Между адресом последней глобальной или статической переменной и верхушкой стека образуется область незанятых адресов. Эта область называется локальной "кучей" (local heap). Все свободные адреса за программой образуют глобальную кучу (global heap). Когда говорят о динамическом распределении памяти, то подразумевают возможность захвата, использования и освобождения дополнительных блоков памяти из глобальной или локальной кучи во время выполнения программы. В Си для динамического распределения памяти используют функции стандартной библиотеки: malloc(), calloc(), realloc(), free(). В C++ - операции new и delete. MS Windows 3.x переводит процессор в защищенный режим работы, с иной, более сложной схемой обращения к памяти. В этом режиме память распределяется страницами по 4 Кб каждая. На аппаратном уровне для адресации используются регистры дескрипторов страниц. Программа же работает не с физическими, а с