Операционная система UNIX
Каждая область представлена собственным сегментом памяти. В совокупности со страничным механизмом организации виртуальной памяти такой подход предоставляет ядру системы большие возможности по эффективному управлению виртуальной памятью процесса.
Области могут совместно использоваться несколькими процессами, при этом ядру нет необходимости создавать дополнительные копии, нужно лишь задать требуемое отображение (виртуальные адреса области у различных процессов могут не совпадать). В качестве примеров разделяемых областей можно привести разделяемую память, разделяемые библиотеки или отображаемые в память файлы. Часто код программы совместно используется несколькими родственными процессами. Информация о каждой активной области хранится ядром в структуре данных
.regionПоскольку одна и та же область может использоваться несколькими процессами, для каждого процесса ядро создает связанный список структур
(per process region), которые в свою очередь адресуют области, используемые процессом. Указатель на список структурpregionдля каждого процесса находится в записи таблицы процессов — структуреpregion.procОсновные поля структур
иregionприведены на рис. 3.10.pregionРис. 3.10. Управление адресным пространством процесса в SCO UNIX
Помимо указателей
, организующих структурыp_nextв виде связанного списка, иpregion, обеспечивающих адресацию соответствующей структуры region, в каждой структуреp_regопределен набор флагов определяющий права доступа к области, режим блокирования в памяти и т.д. Полеpregionуказывает на тип области. Оно может содержать одно из следующих значений:p_type
Значение Описание PT_UNUSED Область не используется PT_TEXT Область содержит сегмент кода PT_DATA Область содержит сегмент данных PT_STACK Область используется в качестве стека процесса PT_SHMEM Область используется в качестве разделяемой памяти PT_LIBTXT Область содержит код библиотек PT_LIBDAT Область содержит данные библиотек PT_SHFIL Область используется для хранения файла, отображенного в память Наконец, поле
задает виртуальный адрес области в адресном пространстве процесса.p_regvaПоля структуры
, приведенные на рис. 3.10, имеют следующие значения. Полеregionопределяет размер области в страницах, из которых r_r_pgszстраниц присутствуют в оперативной памяти (см. далее раздел "Страничное замещение"). Несколько процессов могут ссылаться на одну и ту же область, полеnvalidхранит число таких ссылок. Полеr_refcntадресует таблицу страниц области [33]. Полеr_pdeадресует inode файла, где располагаются данные области (например, для области кода,r_iptrбудет указывать на inode исполняемого файла).r_iptrФактическую информацию о структурах управления адресным пространством процесса можно получить с помощью команды crash(1M). В следующем примере таким образом определяется содержимое структур
процесса и характеристики соответствующих областей.pregion# <b>crash</b>dumpfile = /dev/mem, namelist = /unix, outfile = stdout> <b>pregion 101</b>SLOT PREG REG# REGVA TYPE FLAGS101 0 12 0x700000 text rdonly1 22 0x701000 data2 23 0x7ffffffc stack3 145 0x80001000 lbtxt rdonly4 187 0x80031000 lbdat prКак можно увидеть из вывода команды crash(1М), с рассматриваемым процессом связаны пять областей: сегмент кода, данных и стека, а также сегменты кода и данных подключенной библиотеки. Столбец
определяет запись таблицы областей, где расположена адресуемая каждойREG#областьpregion. Заметим, что значение в столбцеregionлишь отчасти соответствует полюREG#структурыp_reg, поскольку последнее является указателем, а не индексом таблицы. Столбецpregionсодержит значения виртуальных адресов областей.REGVAС помощью полученной информации мы можем более детально рассмотреть любую из областей процесса. Выведем данные о сегментах кода, данных и стека:
>region 12 22 23SLOT PGSZ VALID SMEM NONE SOFF KEF SWP NSW FORW BACK INOX TYPE FLAGS12 1 1 1 0 0 11 0 0 15 5 154 stxt done22 3 1 0 0 0 1 0 0 238 23 154 priv done23 2 1 1 0 0 1 0 0 135 24 priv stackСтолбец
определяет размер области в страницах, а столбецPGSZ— число страниц этой области, находящихся в оперативной памяти. Как можно заметить, для сегментов данных и стека страниц недостаточно, поэтому может возникнуть ситуация, когда процессу потребуется обращение к адресу, в настоящее время отсутствующему в памяти. Заметим также, что столбецVALIDсодержит индексы таблиц inode, указывающие на метаданные файлов, откуда было загружено содержимое соответствующих сегментов.INOXМы можем взглянуть на дополнительные сведения об этом файле:
><b>inode 154</b>INODE TABLE SIZE = 472SLOT MAJ/MIN FS INUMB RCNT LINK UID GID SIZE MODE MNT M/ST FLAGS154 1,42 2 1562 3 1 123 56 8972 f---755 0 R130 txИз этой таблицы мы можем определить файловую систему, в которой расположен файл (
/MAJ), а также номер его дискового inode —MIN. В данном случае он равен 1562. Выполнив команду ncheck(1), мы узнаем имя исполняемого файла, соответствующего исследуемому процессу:INUMB
