что такое таблица дескрипторов
Таблица дескрипторов
Таблица дескрипторов
Таблица дескрипторов (или таблица описаний) содержит описания блоков памяти (сегментов): их расположение (в линейном адресном пространстве или на диске), права доступа, атрибуты использования, разрядность и т. п.
Для платформы x86 может достигать размера 8191+8192 записи (0 не используется). При адресации старшие 13 бит сегментных регистров трактуются как смещение в данной таблице. То есть вместо непосредственного указания диапазона адресов памяти сегментным регистром, диапазон адресов извлекается из таблицы по указанному сегментным регистром смещению.
На начало таблицы дескрипторов указывает регистр GDTR, LDTR.
Смотреть что такое «Таблица дескрипторов» в других словарях:
таблица дескрипторов — Системная таблица, содержащая описание какого либо массива в памяти или текущего состояния базы данных. [Л.М. Невдяев. Телекоммуникационные технологии. Англо русский толковый словарь справочник. Под редакцией Ю.М. Горностаева. Москва, 2002]… … Справочник технического переводчика
Дескрипторные таблицы — Дескрипторные таблицы служебные структуры данных, содержащие дескрипторы сегментов. В архитектуре x86 есть три вида дескрипторных таблиц: Глобальная дескрипторная таблица (англ. Global Descriptor Table, GDT); Локальная дескрипторная… … Википедия
GDT — Основная статья: Дескрипторные таблицы GDT (англ. Global Descriptor Table, глобальная таблица дескрипторов) служебная структура данных в архитектуре x86, определяющая глобальные (общие для всех задач) сегменты. Её расположение в физической… … Википедия
Селектор — (англ. selector) число, хранящееся в сегментном регистре; это 16 битная структура данных, которая является идентификатором сегмента. Селектор указывает не на сам сегмент в памяти, а на его дескриптор, в таблице дескрипторов… Селектор… … Википедия
ГОСТ 7.74-96: Система стандартов по информации, библиотечному и издательскому делу. Информационно-поисковые языки. Термины и определения — Терминология ГОСТ 7.74 96: Система стандартов по информации, библиотечному и издательскому делу. Информационно поисковые языки. Термины и определения оригинал документа: 7.8 автоматизированное индексирование : Индексирование, технология которого… … Словарь-справочник терминов нормативно-технической документации
ext2 — Разработчик Реми Кард (англ.) Файловая система Second extended file system Дата представления Январь 1993 (Linux) Метка тома Apple UNIX SVR2 (Apple Partition Map) 0x83 (Master Boot Record) EBD0A0A … Википедия
GDTR — (англ. Global Descriptor Table Register регистр глобальной дескрипторной таблицы) специальный 48 битный регистр, который описывает местоположение и размер таблицы, содержащей дескрипторы. Он появился вместе с механизмом защиты в… … Википедия
Ext2 — или 2я расширенная файловая система файловая система для ядра Linux. Она была разработана Rémy Card ом в качестве замены для extended file system. Она достаточно быстра для того, чтобы служить эталоном в тестах производительности файловых… … Википедия
Unix File System — UFS Разработчик CSRG Файловая система UNIX file system Дата представления (4.2BSD) Структура Содержимое папок таблица Ограничения Макси … Википедия
X86 — 80486 DX2 x86 (Intel 80×86) аппаратная платформа: архитектура микропроцессора и соответствующий набор инструкций, как разработанных и выпускаемых компанией Intel, так и совместимых с ними процессоров других производителей (AMD, VIA … Википедия
Общие сведения о таблицах дескрипторов
Каждая таблица дескрипторов хранит дескрипторы одного или нескольких типов — СРВС, уаве, КБВС и проб. Таблица дескрипторов не является выделением памяти; Это просто смещение и длина в куче дескрипторов.
Ссылки на таблицы дескрипторов
Графический конвейер, через корневую подпись, получает доступ к ресурсам, ссылаясь на таблицы дескрипторов по индексу.
Таблица дескрипторов фактически является только поддиапазоном кучи дескрипторов. Кучи дескрипторов представляют базовое выделение памяти для коллекции дескрипторов. Так как выделение памяти является свойством создания кучи дескрипторов, определение таблицы дескриптора из одной из них гарантированно становится недешевой, чем определение региона в куче на оборудование. Таблицы дескрипторов не нужно создавать или удалять на уровне API — они просто обнаруживаются драйверами как смещение и размер из кучи при каждой ссылке.
Вполне возможно, что приложение может определить очень крупные таблицы дескрипторов, когда ее шейдеры хотят выбрать из огромного набора доступных дескрипторов (часто ссылающихся на текстуры) на лету (возможно, на основе данных материала).
Корневая подпись ссылается на запись таблицы дескрипторов со ссылкой на кучу, начальным расположением таблицы (смещением от начала кучи) и длиной (в записях) таблицы. На рисунке ниже показаны эти понятия: указатели таблицы дескрипторов из корневой сигнатуры и дескрипторы в куче дескрипторов, ссылающиеся на полную текстуру или данные буфера в куче (в случае текстуры, кучи по умолчанию).
Пишем свою ОС: Выпуск 2
Здравствуйте. Это снова мы, iley и pehat, с долгожданной второй статьёй из цикла «Пишем свою ОС» (первая статья здесь). Извиняемся за большую паузу после первой статьи, нам понадобилось некоторое время, чтобы определить дальнейшее направление нашей работы. В этом выпуске мы кратко рассмотрим защищённый режим 32-битных процессоров Intel. Ещё раз подчеркнём, что мы не ставим себе целью дать исчерпывающие теоретические данные.
Давайте на минуту вспомним нашу программу из предыдущего выпуска. Она запускалась вместо операционной системы и выводила сообщение «Hello world». Программа была написана на 16-битном ассемблере и работала в так называемом реальном режиме. Как вы наверняка знаете, при адресации в реальном режиме физический адрес формируется с помощью сегмента и смещения и имеет размерность 20 бит. Несложная математика подсказывает нам, что таким образом можно обращаться всего к мегабайту оперативной памяти.
Небольшой объём доступной памяти — это не единственная проблема реального режима. Представьте себе ситуацию, когда в памяти одновременно находится операционная система и несколько прикладных программ. В реальном режиме ничто не мешает любой из прикладных программ обратиться по адресу, принадлежащему другой программе или даже операционной системе. Таким образом, ошибка в одной программе может привести к краху всей системы.
Чтобы решить эти две проблемы, Intel в своё время разработали новый, значительно более сложный способ адресации оперативной памяти. Точнее, Intel разработали даже несколько способов адресации, и все они известны под собирательным названием защищённый режим.
Итак, адресация в защищённом режиме может происходить в одном из трёх режимов (извините за тавтологию) — в сегментном, страничном и сегментно-страничном. В этом выпуске мы рассмотрим только сегментный режим.
В сегментном режиме в памяти выделяются, как ни странно, сегменты. Эти сегменты значительно отличаются от простых и знакомых нам сегментов реального режима. В данном случае сегмент — это непрерывная область памяти, которая характеризуется базой, лимитом (т.е. грубо говоря, размером) и некими дополнительными атрибутами. База — это, грубо говоря, физический адрес, с которого начинается сегмент (на самом деле, это не физический адрес, а так называемый линейный, но об этом позже). Важно заметить, что, в отличие от сегментов реального режима, наши сегменты могут иметь произвольный размер. База, размер и атрибуты каждого сегмента хранятся в дескрипторе. Дескрипторы хранятся в специальных таблицах, а для выбора конкретного дескриптора из таблицы используются селекторы. Не пугайтесь такой кучи новых страшных слов, мы сейчас всё разложим по полочкам.
Итак, при каждом обращении к памяти процессор берёт из регистра (например, CS), селектор, находит по нему нужный дескриптор в таблице, извлекает из дескриптора адрес начала сегмента, прибавляет к адресу начала смещение и получает линейный адрес (обратите внимание, что линейный адрес и физический адрес — это разные вещи, но на данном этапе можно полагать, что это одно и то же). Кроме того, процессор проверяет, не вышел ли полученный адрес за границу сегмента и допускают ли атрибуты сегмента доступ к нему в данный момент. Схема вычисления линейного адреса выглядит примерно так:
Итак, как мы уже говорили, в дескрипторе хранится база (base address), размер (segment limit) и всякие дополнительные атрибуты сегмента. Давайте взглянем на схему дескриптора.
Обратите внимание, что под базу выделено 32 бита, а под лимит всего 20. Как же так, — спросите вы — разве нельзя создать сегмент, размер которого будет больше мегабайта? Можно. Для этого используется несложный трюк. Если бит G установлен в единицу, то лимит считается не в байтах, а в блоках по 4 Кбайт. Надо заметить, что лимит содержит размер сегмента минус один в единицах гранулярности, т.е. если лимит равен 0, то сегмент имеет размер 1 байт или 4 Кбайт. Кроме того, как вы видите, дескриптор включает ещё несколько полей. Их подробное описание можно найти, например, здесь.
Как упоминалось, дескрипторы хранятся в специальных таблицах. Таблиц может быть несколько, но в любом случае в памяти обязана присутствовать GDT — глобальная таблица дескрипторов. Она одна на всю операционную систему. В свою очередь, у каждой задачи, то есть процесса может быть ноль, одна или несколько LDT — локальных таблиц дескрипторов. Адрес и размер GDT хранится в регистре GDTR, текущей LDT — в регистре LDTR. Пока нам LDT не понадобится. Кроме того, бывают еще IDT — таблицы дескрипторов прерываний, но их рассмотрение отложим до следующего выпуска.
Для выбора дескриптора из таблицы используется структура данных, называемая селектором. Вот как он выглядит:
Селектор содержит в себе бит, указывающий, в какой таблице искать дескриптор, локальной или глобальной (L/G) и собственно номер дескриптора (descriptor number). Кроме того, у селектора есть поле RPL, но оно нас пока не интересует.
Итак, давайте перейдём к делу!
;Загрузить в CS:EIP точку входа в защищенный режим
O32 jmp 00001000b : pm_entry
Теперь немного поясним код.
После загрузки адреса и лимита глобальной таблицы дескрипторов в регистр GDTR идет поголовный запрет на прерывания. Объясняется это тем, что все обработчики прерываний работают в реальном режиме, и в защищенном режиме начнутся проблемы с адресацией. Так что пока строго-настрого запрещаем прерывания.
Для запуска программы нужно проделать манипуляции, полностью совпадающие с описанными в первой статье. Там же вы найдете список литературы на случай, если захотите узнать о защищенном режиме подробнее.
Нам не хватило фантазии на что-нибудь, демонстрирующее реальные возможности защищенного режима, поэтому мы снова выводим “Hello, World!”, но уже пользуясь прямым доступом к видеопамяти. Чтобы сделать что-нибудь красивое, было бы удобно воспользоваться прерываниями. Тому, как использовать их в защищенном режиме, будет посвящена следующая статья нашего цикла. А вторая статья на этом заканчивается. Будем рады увидеть ваши отзывы и пожелания.
Защищенный режим работы процессора
Режимы адресации, дескрипторы
РЕЖИМ ВИРТУАЛЬНОЙ АДРЕСАЦИИ (РЕЖИМ ВА)
Механизм (схема) адресации
В формировании исполнительного адреса участвуют два компонента: 16-ти битовый селектор, используемый для определения адреса базы сегмента и 32-х битовый эффективный адрес.
Сформированный исполнительный адрес является физическим адресом, если не используется механизм страничной адресации. В противном случае, он преобразуется в физический. В режиме ВА селектор используется, как индекс, указывающий операционной системе на определенный элемент специальной таблицы, в которую помещен 32-х битовый адрес базы данного сегмента. Физический адрес формируется сложением базового адреса с 32-х битовым смещением.
Страничная адресация памяти является дополнительным механизмом управления памятью, используемым только в режиме ВА. Этот механизм позволяет преобразовывать исполнительные адреса в физические.
Сегментация
Таблицы дескрипторов
Таблицы дескрипторов определяют все сегменты, которые используются в системе на базе 80386.
Каждая из таблиц храниться в своей области памяти и имеет размер от 8 байт до 64 кбайт. Каждая таблица может содержать до 8к 8-ми байтных дескрипторов. Старшие 13 бит селектора используются в качестве индекса дескрипторной таблицы. Для обращения к таблицам имеются специальные регистры, хранящие 32-х битовый исполнительный адрес и 16 битовую границу данной таблицы.
Эти регистры GDTR, LDTR и IDTR загружаются командами LGDT, LLDT, LIDT и сохраняются командами SGDT, SLDT и SIDT. Манипуляция таблицами осуществляется операционной системой при помощи привилегированных команд.
Таблица глобальных дескрипторов (GDT)
Таблица локальных дескрипторов (LDT)
Таблица LDT содержит дескрипторы, используемые в данной задаче. Обычно ОС разрабатываются таким образом, чтобы каждая задача имела отдельную LDT. LDT может содержать только дескрипторы команд, данных, стека, номера задачи и вызова номера. Таблицы LDT служат механизмом для изоляции сегментов команд и данных отдельных задач от ОС, в то время, как GDT хранит дескрипторы сегментов, являющихся общими для всех задач. Сегмент не может быть доступен задаче, если его дескриптор отсутствует внутри текущей LDT или GTR. Это обеспечивает защиту сегментов задач и в то же время, совместное использование глобальных данных различными задачами. В отличие от 6-ти байтовых GDT и IDT регистров, которые хранят базовый адрес и ограничитель, видимая часть регистра LDT хранит только 16 битовый селектор. Этот селектор определяет дескриптор LDT в GDT.
Таблица дескрипторов прерываний (IDT)
IDT содержит дескрипторы, указывающие расположение 256 подпрограмм обслуживания прерываний. IDT может хранить только вектора задач, вектора прерываний и вектора трассировок. IDT должна быть не менее, чем 256 байтовой, чтобы хранить дескрипторы 32 прерываний, зарезервированных ф. Intel. Каждое прерывание, используемое в системе, должно быть описано в IDT. IDT используется при выполнении команд INT, внешних запросов прерываний в особых ситуациях.
Дескрипторы
Биты атрибутов дескриптора
Все сегменты 80386 имеют 3 единых поля: P, DPL, S.
Дескрипторы команд и данных (S=1)
Формат такого дескриптора и байт прав доступа приведены на рис.4-6 и табл.4-1 соответственно.
Дескрипторы сегментов команд и данных имеют несколько общих полей: A, G.
Система на базе 80386 может включать сегменты как байтовой размерностью, так и со страничной размерностью, если включен блок страничной адресации.
Бит Е указывает, какой из сегментов выполняется: командный (E=1, S=1) или данных (E=0, S=1).
Кодовый сегмент может находится в стадии только выполнения (бит R=0) или выполнения/чтения (R=1). Запись в кодовый сегмент не возможна.
Замечания.
Кодовые сегменты могут изменяться, через вымышленные имена (метки). Метки приписываются сегментам данных, которые располагаются в некотором пространстве исполнительных адресов, как сегменты команд.
Бит D указывает размерность операндов и эффективных адресов (32 бита при D=1, 16 бит при D=0). Это позволяет выполнять команды для 80286.
Другим атрибутом сегментов команд является бит согласования С. При С=1 согласованные сегменты могут выполняться в режиме разделения программами, имеющими различные уровни привилегированности.
Сегменты, определяемые как сегменты данных (E=0, S=1), могут быть двух типов: сегменты стека и сегменты данных. Бит направления расширения (ED) определяет тип сегмента. Если сегмент стековый, то смещение должно быть больше, чем граница сегмента. Для сегмента данных смещение должно быть меньше или равно границе сегмента. Другими словами, сегменты стека начинаются от базы исполнительного адреса + максимального размера сегмента и размещаются в сторону уменьшения до базы исполнительного адреса + граница. Сегмент данных начинается с базы исполнительного адреса и кончается границей сегмента.
Бит записи W управляет записью в сегменте. При W=0 сегменты данных работают только на чтение. Стековые сегменты должны иметь W=1.
Форматы системных дескрипторов
Эти дескрипторы содержат информацию о системных таблицах, задачах и паролях. Системный дескриптор 80386 имеет 32 разрядную базу и 20 битовую границу, системный дескриптор 80286 соответствует 24 и 16 бит (старшие 16 бит равны 0).
Дескрипторы LDT (S=0, TYPE=2)
Дескрипторы LDT содержат информацию о таблицах локальных дескрипторов. Таблица локальных дескрипторов содержит дескрипторы сегментов, используемых конкретной задачей. Команда загрузки регистра LDT должна иметь нулевой уровень привилегированности (поле DPL игнорируется).
Дескрипторы TSS (S=0, TYPE = 1, 3, 9, B)
Дескрипторы шлюзов (S=0, TYPE=4-7, C, F)
Шлюзы используются для управления доступом к определенным точкам внутри управляющего кодового сегмента.
Шлюзы реализуют дисциплину взаимодействия при управлении передачей между источником и приемником. При взаимодействии процессор автоматически проверяет защиту. Это также позволяет проектировщикам системы управлять точками внутри ОС. Шлюзы вызова используются для изменения уровней привилегированности. Шлюзы задач используются для переключения задач, а шлюзы прерываний и трассировок используются для определения специальных программ обслуживания прерываний.
Шлюз вызова, главным образом, используются для передачи управления программам с более высоким уровнем привилегированности.
Поле счетчика слов используется только в шлюзах вызыва, которые изменяют уровень привилегированности, в остальных типах это поле игнорируется.
Шлюзы прерываний и трассировок используют поля селектора назначения и смещения назначения дескриптора для указания начала программ управления прерыванием или трассировкой. Различия между шлюзами прерываний и шлюзами трассировок заключается в том, что шлюз прерывание выключает прерывания (сбрасывает бит IF) в то время, как шлюз трассировки нет.
Шлюзы задач используются при переключении задач. Шлюзы задач могут обращаться только к сегменту состояния задач (TSS), поэтому используется только селекторная часть а смещение игнорируется.
Прерывание 13 формируется, когда селектор назначения указывает на некорректный тип дескриптора.
Поле селектора
В дополнение к величине селектора каждый сегментный регистр имеет связанный с ним регистр (КЭШ ЗУ) дескриптора сегмента. Когда происходит изменение содержимого сегментного регистра, 8-ми байтный дескриптор, связанный с этим селектором, автоматически переписывается в процессор. Эта информация используется до тех пор, пока не потребуется доступ к другому сегменту. Содержимое дескрипторных регистров программно недоступно (невидимо для программистов). При программном изменении дескрипторных таблиц, хранящихся в ЗУ, необходимо осуществлять перезагрузку дескрипторных регистров.
Форматы регистров дескрипторов
Содержимое этих регистров зависит от режима работы МП. Формат регистров для режима RM приведен на рис.4-11.
Формат регистров в режиме РМ представлен на рис.4-12.
В РМ значения полей определяется содержимым дескриптора сегмента индексированного селектором.
Формат регистра для режима виртуального 8086 приведен на рис.4-13.
В отличие от режима RM виртуальная программа имеет минимальный уровень привилегированности (=3), обеспечивая трассировку всех команд IOPL и команд с нулевым уровнем привилегированности.
Дескрипторные таблицы
Дескрипторные таблицы — служебные структуры данных, содержащие дескрипторы сегментов.
В архитектуре x86 есть три вида дескрипторных таблиц:
Содержание
Глобальная дескрипторная таблица
Глобальная дескрипторная таблица является общей для всех процессов. Её размер и расположение в физической памяти определяются регистром GDTR. Размер таблицы не может превышать 8192 дескрипторов, поскольку один дескриптор занимает 8 байт, а лимит в регистре GDTR — двухбайтный и хранит размер таблицы минус один (максимальное значение лимита — 65535), а 8192 x 8 = 65536.
Дескрипторы LDT и сегментов задач (TSS) могут находиться только здесь.
Особенностью GDT является то, что у неё запрещён доступ к первому (с нулевым смещением относительно начала таблицы) дескриптору. Обращение к нему вызывает исключение #GP, что предотвращает обращение к памяти с использованием незагруженного сегментного регистра.
Локальная дескрипторная таблица
В отличие от GDT, LDT может быть много (соответственно количеству задач (потоков), но не обязательно). Каждая задача может иметь свою. На расположение таблицы текущей задачи указывает регистр LDTR.
Размер и расположение LDT в линейной памяти определяются дескриптором LDT из GDT (но это не означает, что размер LDT может быть больше 65536 байт).
Первый дескриптор LDT (№ 0) использовать можно.
Таблица дескрипторов прерываний
Таблица прерываний глобальна. Размещение в физической памяти определяется регистром IDTR.
При возникновении прерывания (внешнего, аппаратного, или вызванного инструкцией Int):
См. также
Ссылки
Полезное
Смотреть что такое «Дескрипторные таблицы» в других словарях:
GDT — Основная статья: Дескрипторные таблицы GDT (англ. Global Descriptor Table, глобальная таблица дескрипторов) служебная структура данных в архитектуре x86, определяющая глобальные (общие для всех задач) сегменты. Её расположение в физической… … Википедия
Защищённый режим — (режим защищённой виртуальной адресации) режим работы x86 совместимых процессоров. Частично был реализован уже в процессоре 80286, но там существенно отличался способ работы с памятью, так как процессоры еще были 16 битными и не была… … Википедия
GDTR — (англ. Global Descriptor Table Register регистр глобальной дескрипторной таблицы) специальный 48 битный регистр, который описывает местоположение и размер таблицы, содержащей дескрипторы. Он появился вместе с механизмом защиты в… … Википедия
Таблица векторов прерываний — (англ. Interrupt Descriptor Table, IDT) используется в x86 архитектуре и служит для определения корректного ответа на прерывания и исключения. В микропроцессорах 8086/80186 таблица векторов прерываний расположена в первом килобайте памяти… … Википедия
Дескриптор шлюза — Дескриптор шлюза служебная структура данных, служащая для различных переходов. Используется только в защищённом режиме. В реальном режиме некоторым аналогом может служить дальний адрес. Длина дескриптора стандартна и равна восьми байтам.… … Википедия