Дескриптори сегментів

Дескриптор сегмента є структурою даних в пам'яті, яка повідомляє процесору розмір і розташування в пам'яті сегмента, а також інформацію, що управляє і інформацію про стан сегмента. Дескриптори зазвичай створюються компиляторами, компонувальник, завантажувачами або операційною системою, але не прикладними програмами. На рисунку 5-8 показані два загальних формату дескриптора. Дескриптор системного сегмента більш детально розглядається в Главі 6. Всі типи дескрипторів системи мають один з цих форматів.

Дескриптори, які використовуються для сегментів коду і даних прикладних програм:

Дескриптори, які використовуються для спеціальних системних сегментів:

Кордон. Визначає розмір сегмента. Процесор поміщає поруч два поля кордону сегмента, в сукупності утворюють одне 20-розрядне значення. Процесор інтерпретує кордон одним з двох Слуда способів, залежно від установки біта грануляції:

  1. Якщо біт грануляції очищений, то межа може приймати значення від 1 байта до 1 мегабайта, з приростами в один байт.
  2. Якщо біт грануляції встановлений, то межа може набувати значень від 4 Кілобайтів до 4 Гігабайт, з приростами в 4 Кб.

Біт S. Визначає, чи є цей сегмент системним сегментом, або ж сегментом коду або даних. Якщо біт S встановлений, то сегмент є або кодовою сегментом, або сегментом даних. Якщо цей біт очищений, то сегмент є системним сегментом.

Тип. Інтерпретація цього поля залежить від того, чи стосується даний дескриптор до прикладного, або ж до системного сегменту. Системні сегменти мають дещо інший формат дескриптора, що розглядається в Главі 6. Поле Типу дескриптора пам'яті задає тип доступу, дозволеного до даного сегменту, а також напрямок, в якому цей сегмент росте (див. Таблицю 5-1).

Таблиця 5-1. Типи прикладних сегментів ----------------------------------------------- ------------------ Число | E | W | A | Тип | опис | | | | Дескриптора | ----------------------------------------------- ------------------ 0 0 0 0 Дані Тільки читання 1 0 0 1 Дані Тільки читання, виконаний доступ 2 0 1 0 Дані читання / запис 3 0 1 1 Дані читання / запис, виконаний доступ 4 1 0 0 Дані Тільки читання, розширення вниз 5 1 0 1 Дані Тільки читання, розширення вниз, виконаний доступ 6 1 1 0 Дані читання / запис, розширення вниз 7 1 1 1 Дані читання / запис, розширення вниз, виконаний доступ ------------------------------------------------ ----------------- Число | C | R | A | Тип | опис | | | | Дескриптора | ----------------------------------------------- ------------------ 8 0 0 0 Код Тільки виконання 9 0 0 1 Код Тільки виконання, виконаний доступ 10 0 1 0 Код виконання / читання 11 0 1 1 Код Ваполненіе / читання, виконаний доступ 12 1 0 0 Код тільки виконання, конформний 13 1 0 1 Код тільки виконання, конформний, виконаний доступ 14 1 1 0 Код виконання / тільки читання, конформний 15 1 1 1 Код виконання / тільки читання, конформний, виконаний доступ -------------------------------------------------- ---------------

Для сегментів даних три молодших біта поля типу можна інтерпретувати як ознаки розширення вниз (E), дозволу запису (W) і того, що до сегменту був виконаний доступ (A). Для кодових сегментів три молодших біта поля типу можна інтерпретувати як ознаку конформності (C), дозволу читання (R) і виконаного доступу (A).

Кодові сегменти можуть бути або конформними, або не-конформними. Перехід виконання в більш привілейований конформний сегмент збереже поточний рівень привілейованості. Перехід виконання в не-конформний сегмент з іншим рівнем привілейованості призведе до генерації виключення загального захисту, якщо не використаний шлюз завдання (обговорення засобів мультизадачности див. У Розділі 6). Системні утиліти, що не звертаються до засобів захисту, такі як функції транслювання даних (наприклад, перекодування EBCDIC / ASCII, кодування / декодування за методом Хафмана, бібліотека математичних функцій), а також деякі типи винятків (наприклад, помилка ділення на нуль, переповнення, виявлене за допомогою INTO або перевищення діапазону BOUND) можуть бути завантажені в конформні кодові сегменти.

Поле Типу також повідомляє про те, чи був до даного сегменту виконаний доступ. У початковому стані дескриптори сегментів повідомляють про те, що доступ до сегменту був. Якщо поле Типу потім встановити в значення, що означає, що доступ до сегменту не був виконаний, процесор відновить значення, якщо доступ до сегменту стався. Очистивши і перевіривши молодший біт поля Типу, програмне забезпечення може контролювати використання сегмента (молодший біт поля Типу також називається бітом Доступу).

Процесор може оновлювати поле Типу при доступі до сегменту, навіть якщо доступ цей стався в циклі читання. Якщо таблиці дескрипторів були поміщені в ПЗУ, апаратного забезпечення може знадобитися заборонити зв'язок ПЗУ з шиною даних під час циклу запису. Також може знадобитися повернути сигнал READY # процесору в циклі запису в ПЗУ; в іншому випадку не відбудеться завершення цього циклу. Ці кошти апаратної конструкції необхідні для використання ПЗУ-резидентних таблиць дескрипторів з процесором 386 DX, який завжди встановлює біт Доступу при завантаженні дескриптора сегмента. Однак, процесор i486 тільки в тому випадку, якщо він ще не встановлений. Уникнути спроби записи в таблиці дескрипторів в ПЗУ можна, встановивши біти Доступу в кожному дескрипторі.

DPL (Рівень привілейованості дескриптора): Визначає рівень привілейованості сегмента. Використовується для управління доступом до сегменту за допомогою механізму захисту, описаного в Главі 6.

Біт присутності сегмента. Якщо цей біт очищений, то процесор при завантаженні в сегментний регістр селектора даного дескриптора генерує виняток "сегмент не присутній". Ця властивість використовується для виявлення спроб доступу до сегментів, які стали недоступними. Сегмент може стати недоступним, коли системі знадобилося створити вільну пам'ять. Для елементів пам'яті, таких як символьні шрифти або драйвери пристроїв, в тих випадках, коли вони в поточний момент не використовуються, виконується скасування розподілу пам'яті. Скасування розподілу пам'яті такого елементу виконується маркуванням такого сегмента як «не присутнього" (це виконується за допомогою очищення біта присутності сегмента). Після цього пам'ять, яку займає даним сегментом, може бути розподілена для іншого використання. Коли елемент, для якого було скасовано розподіл пам'яті, знадобиться в наступний раз, виключення "сегмент не присутній" вкаже на те, що необхідно знову завантажити цей сегмент в пам'ять. Якщо такого роду організація пам'яті виконується способом, що не видимим для прикладних програм, то вона називається "віртуальної пам'яттю". Система може працювати з загальним розміром віртуальної пам'яті, що значно перевищують фізичну пам'ять, завдяки тому, що одночасно у фізичній пам'яті присутній тільки кілька сегментів.

Схожі статті