[<<Previous Entry] [^^Up^^] [Next Entry>>] [Menu] [About The Guide]
 Образ процесса в памяти

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

Виртуальная память пользователя для каждого процесса подразделяется на
три сегмента:  текст, данные  и пользовательский стек. Когда программа
загружается в  память, информация  из  файла  a.out  используется  для
размещения и инициализации сегментов текста и данных.

Редактор связей  вводит переменные  для  пометки  определенных  частей
программы (смотри  END(3C)). Адрес  etext,  первый  адрес,  упомянутый
ранее, указывает  на конец  текстового сегмента.  Адреса edata  и  end
указывают   соответственно    на   конец   инициализированной   и   не
инициализированной области данных.

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

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

За сегментом  текста следует  сегмент данных, содержащий статические и
внешние переменные.  На компьютере  AT&T 3B2 секция инициализированных
данных содержит  инициализированные статические  и внешние переменные.
Секция  неинициализированных   данных  содержит   неинициализированные
статические и внешние переменные и очищается при загрузке процесса.

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

Порядок расположения  секций, расстояние между секциями  и направление
роста стека зависят от центрального процессора (ЦП).

Операционная система  сохраняет  информацию  о  процессах  в  процесс-
структурах   (process    structures)   и   пользовательских   областях
(user~area). На  каждый процесс заводится только одна пользовательская
область. Пользовательская  область  -  это  системный  сегмент  данных
небольшого  фиксированного   размера,  который   содержит  информацию,
необходимую  только  при  исполнении  процесса,  например  дескрипторы
открытых фалов,  реакцию на  сигналы, информация о системных ресурсах.
Пользовательская область  не является  непосредственно  доступной  для
пользователя, так  как  она  является  частью  виртуального  адресного
пространства операционной системы. Для получения/установки информации,
хранящейся в пользовательской области, должны использоваться системные
вызовы. Расположение пользовательской области описано в <sys/user.h>.