Архитектура сегментной организации памяти
Многие принципы архитектуры сегментной организации схожи с принципами страничной организации, однако во всех случаях приходится учитывать, что длина сегмента переменна, и хранить ее в явном виде в таблицах.
Логический адрес при сегментной организациипамяти - пара:
<segment-number, offset>,
где segment-number – номер сегмента, offset – смещение в сегменте.
Таблица сегментов– служит для отображения логических адресов в физические при сегментной организации памяти. Каждый ее элемент содержит следующую информацию:
· base –начальный адрес сегмента в оперативной (физической) памяти;
· limit– длину сегмента.
Базовый регистр таблицы сегментов - segment-table base register (STBR)содержит адрес таблицы сегментов в памяти.
Регистр длины таблицы сегментов - segment-table length register (STLR)содержит число сегментов, используемое программой.
Номер сегмента s корректен, если s < STLR.
Перемещение (relocation) программ и данных при сегментной организации динамическое, т.е. выполняется во время исполнения программы с помощью таблицы сегментов.
Возможен общий доступ (sharing) нескольких процессов к одному и тому же сегменту, т.е. поддерживается концепция разделяемых сегментов. При этом логический номер общего сегмента для разных процессов будет одним и тем же.
Стратегии распределения памятипри сегментной организации: метод первого подходящегоили метод наиболее подходящего. Метод наименее подходящего при сегментной организации смысла не имеет, так как он не улучшает ситуацию с фрагментацией (ввиду переменной длины сегментов). Соответственно, при сегментной организации возможна внешняя фрагментация, для борьбы с которой применяется компактировка.
Защитапри сегментной организации организована аналогично защите при страничной организации, однако, ввиду того, что каждый сегмент выполняет определенную логическую функцию в программе, дополнительно с каждым сегментом связываются его признаки защиты.Таким образом, в каждом элементе таблицы сегментов хранятся:
· validation-бит(аналогично страничной организации): значение бита, равное 0, означает, что сегмент неверный, т.е. не принадлежит логической памяти процесса;
· полномочия чтения (read) / записи (write) / исполнения (execute)– каждое кодируется одним битом; значение бита, равное 0, означает, что процесс не имеет данных полномочий.
Например, если сегмент является сегментом данных, то система устанавливает в таблице сегментов бит защиты от исполнения равным 0. Если это сегмент кода, то целесообразна установка в 0 битов защиты от чтения и от записи.
Биты защиты связываются с сегментами. Совместный доступ к коду осуществляется на уровне сегментов.
В системе "Эльбрус" к стандартному набору признаков защиты был добавлен еще один: защита от записи в сегмент адресной информации(данный признак целесообразен, если, например, сегмент предназначен для записи в файл).
Поскольку сегменты различаются по длине, распределение памяти в виде сегментов – это общая задача динамического распределения памяти.
На рис. 17.2 приведена схема адресации при сегментном распределении памяти. Логический адрес (s, d), где s – номер сегмента, d – смещение внутри сегмента, обрабатывается следующим образом. По номеру сегмента s происходит обращение в таблицу сегментов, и определяется база сегмента – его начальный адрес в основной памяти. Смещение d сравнивается с длиной (границей) сегмента. Если оно меньше, то оно складывается с базой, и в результате получается физический адрес, по которому и происходит обращение в память. Если смещение больше или равно базе, происходит прерывание – ошибка адресации. На схеме не показана еще одна проверка – для номера сегмента s проверяется, что он не превосходит значения регистра длины таблицы сегментов, иначе – прерывание.
Рис. 17.2. Схема адресации при сегментной организации памяти.
Пользователи систем UNIX, Linux, Solaris наверняка по ассоциации вспомнят часто встречающееся системное сообщение: Segmentation violation (нарушение сегментации)при прерывании. Причина подобного сообщения обычно следующая: программа пытается обратиться по пустому (нулевому) указателю, номер сегмента в котором, естественно, равен 0, а номер сегмента 0 считается в системе недопустимым. Таким образом, через проверку номера сегмента, UNIX защищает от такой часто встречающейся ошибки, как обращение по пустому указателю. Аналогично, по той же самой причине, если программа пытается практически любое другое число (например, 5) рассматривать как адрес и обращаться по нему, то также генерируется прерывание и сигнал SIGSEGV (segmentation violation).