Динамическое распределение памяти в MS Windows. Габрельян Б.В. - 3 стр.

UptoLike

Составители: 

Введение: от 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 Кб каждая. На аппаратном уровне для адресации используются
регистры дескрипторов страниц. Программа же работает не с физическими, а с