Сегментация программы

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

Одновременное нахождение в памяти «алгоритма» и данных соответствует принципу хранимой программы, который заключается в том, что программный код хранится в той же самой памяти, что и обрабатываемые данные, и в свою очередь сам представляет собой специфические данные, с которыми работает процессор во время выполнения программы. В настоящее время применяется немодифицируемый программный код.Это, в свою очередь, означает, что несколько программ могут его читать и исполнять, не мешая друг другу, в том числе и на физически параллельных процессорах.

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

Процессор имеет в своем составе набор машинных слов – регистров.В зависимости от назначения они могут хранить как данные, так и адреса памяти. Сегментация поддерживается в процессоре при помощи регистров двух видов. Базовый регистр сегментасодержит его начальный адрес. Регистры, работающие с данными сегмента, содержат относительный адрес данных от начала сегмента, или смещение.Результирующий адрес получается путем сложения содержимого этих регистров. Таким образом, каждый сегмент имеет собственную «систему координат», связанную с его началом (Рис.1.7). Если программа использует только сегментную адресацию, то сегменты можно перемещать по памяти при сохранении работоспособности программы: достаточно перенастроить соответствующие им базовые регистры.

Выполняемая программа состоит из нескольких сегментов. Некоторые из них создаются при трансляции, другие – при загрузке и при работе программы. В принципе, программа может иметь несколько сегментов одного вида:

 

 

Сегмент Регистры Что содержит Когда создается
Сегмент команд CS- сегментный, IP- адрес команды Программный код (операции, операторы) трансляция
Сегмент данных DS – сегментный Глобальные (статические) данные трансляция
Сегмент стека SS – сегментный, SP– указатель стека Локальные данные функций, «история» работы программы при загрузке
Динамическая память DS – сегментный Динамические переменные, создаваемые при работе программы при загрузке, выполнении
Динамически связываемые библиотеки (DLL) CS– сегментный, IP– адрес команды Программный код разделяемых библиотек при загрузке

Рис. 1.7. Сегментация программы

 

Следующий элемент архитектуры тоже имеет отношение к внутреннему представлению программы – виртуальное адресное пространство (виртуальная память).Его идея состоит в том, что каждая программа имеет свое, независимое от других, виртуальное адресное пространство (виртуальную память), в котором размещаются сегменты программы, определяются адреса и т.п. В процессоре имеется скрытая от программ система отображения виртуальных адресов на физические адреса. Виртуальное адресное пространство находится под управлением операционной системы и реализует защиту памяти программ, ее разделение (сегменты динамически связываемых библиотек), загрузку программы в память «по частям» и иллюзию наличия неограниченной памяти. Для нас из всего этого важно то, что внутренне представление программы в виртуальной памяти занимает все адресное пространство, как будто других программ и операционной системы в памяти нет вовсе.