Открытая память

Самый простой вариант управления памятью — отсутствие диспетчера па­мяти и возможность загружать в системе только один процесс. Именно так работают СР/М и RT-11 SJ (Single-Job, однозадачная). В этих системах программы загружаются с фиксированного адреса prog_start. В СР/М это 0x100; в RT-11— 01000. По адресам от 0 до начала программы находятся векторы прерываний, а в RT-11— также и стек программы. Операционная система размещается в старших адресах памяти. Адрес sys_start, с кото­рого она начинается, зависит от количества памяти у машины и от конфи­гурации ОС.

В этом случае управление памятью со стороны системы состоит в том, что загрузчик проверяет, поместится ли загружаемый модуль в пространство от prog_start до sys_start. Если объем памяти, который использует про­грамма, не будет меняться во время ее исполнения, то на этом все управле­ние и заканчивается.

Однако программа может использовать динамическое управление памятью, например функцию malloc о или что-то в этом роде. В этом случае уже код malloc должен следить за тем, чтобы не залезть в системные адреса. Как правило, динамическая память начинает размещаться с адреса prog_end = prog_start + prog_size. prog_size в данном случае обозначает полный размер программы, т. е. размер ее кода, статических данных и области, вы­деленной под стек.

Функция malloc поддерживает некоторую структуру данных, следя­щую за тем, какие блоки памяти из уже выделенных были освобождены. При каждом новом запросе она сначала ищет блок подходящего размера в своей структуре данных и, только когда этот поиск завершится неуда­чей, просит новый участок памяти у системы. Для этого используется переменная, которая в библиотеке языка С называется brk_addr.