Дескрипторы - это архитектурная особенность больших систем Burroughs , включая текущие (по состоянию на 2006 год) системы Unisys Clearpath / MCP. Помимо стека и тегов , примечательной архитектурной особенностью этих систем является то, что они основаны на дескрипторах. Дескрипторы - это средства хранения данных, которые не находятся в стеке, как для массивов и объектов . Дескрипторы также используются для строковых данных, как в компиляторах, так и в коммерческих приложениях .
Подробности
Дескрипторы описывают области хранения, запросы ввода-вывода и результаты ввода-вывода. Они содержат поля, указывающие, например, тип дескриптора, адрес, длину, наличие данных в хранилище. Детали различаются в зависимости от линейки продуктов и типа дескриптора. Следующий текст нумерует крайний левый (самый старший) бит как 0 в соответствии с документацией Берроуза.
B5000, B5500 и B5700
B5000 [1] был первым компьютером на основе дескрипторов. Каждый дескриптор имеет флаг (бит 0), равный 1. Дескрипторы данных содержат 15-битный адрес хранения и 10-битный размер, как и большинство дескрипторов ввода-вывода. Дескрипторы программ и дескрипторы внешнего результата имеют 15-битный адрес, но не имеют поля размера.
Дескрипторы программы B5x00
Дескрипторы программы используются для определения сегментов программы. Либо вызов операнда, либо вызов дескриптора, который ссылается на дескриптор программы, вызовет вызов подпрограммы, если бит присутствия равен 1, в противном случае это вызовет прерывание присутствия.
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8-17 | 18–32 | 33–47 |
---|---|---|---|---|---|---|---|---|---|---|
Флаг | я | Присутствие | я | Режим | А | Адрес | ||||
1 | 1 | 0 = нет в памяти 1 = в памяти | 1 | 0 = слово 1 = символ | 0 = аргумент не требуется 1 = аргумент требуется |
Дескрипторы данных
Дескрипторы данных относятся либо к блоку данных, присутствующему в памяти (P = 1), либо к блоку данных, который должен быть считан в память (P = 0), в зависимости от значения бита присутствия. Либо вызов операнда, либо вызов дескриптора, который ссылается на дескриптор данных, проверяет бит присутствия и поле размера; если бит присутствия равен 0, произойдет прерывание присутствия; если поле размера не равно нулю, то второе слово в стеке должно быть в пределах диапазона, иначе произойдет прерывание индекса.
0 | 1 | 2 | 3-7 | 8-17 | 18 | 19 | 20 | 21–32 | 33–47 |
---|---|---|---|---|---|---|---|---|---|
Флаг | я | Присутствие | Размер | я | C | Адрес | |||
1 | 0 | 0 = нет в памяти 1 = в памяти | Зарезервировано для MCP | Зарезервировано для MCP | 0 = с плавающей запятой 1 = целое число | [D5 1] | Зарезервировано для MCP |
- ^ Бит непрерывности - для управления типом прерывания, вызванного оператором
запускапрограммы0 = Установить прерывание при выпуске программы - области ввода / вывода не заправлены или последняя область ввода / вывода
1 = установить прерывание непрерывности - области ввода / вывода зарезервированы
Дескрипторы ввода / вывода
0 | 1 | 2 | 3-7 | 8-17 | 18–32 | 33–47 |
---|---|---|---|---|---|---|
Флаг | я | Альтернативный внешний | Ед. изм | Размер | Зависит от устройства | Адрес |
1 | 1 | 0 = запись 1 = чтение |
Дескрипторы внешнего результата
Дескриптор внешнего результата содержит дескриптор ввода-вывода, используемый для запуска операции с заменой некоторых полей.
0 | 1 | 2 | 3-7 | 8-25 | 26-32 | 33–47 |
---|---|---|---|---|---|---|
Флаг | я | Альтернативный внешний | Ед. изм | Не имеющий отношения | Зависит от устройства | Адрес |
1 | 1 | 0 = запись 1 = чтение | условия ошибки | последнее место |
B6500, B7500 и преемники
Дескрипторы описывают блоки данных. Каждый дескриптор содержит 20- битное адресное поле, указывающее на блок данных. Каждый блок имеет длину, которая хранится в дескрипторе, также 20 бит. Также указывается размер данных: 4-, 6-, 8- или 48-битные данные в трехбитном поле.
Первым компьютером с такой архитектурой был B6500. в этой реализации значения различных битов состояния были:
- Бит 47 - бит присутствия (P-Bit)
- Бит 46 - бит копирования
- Бит 45 - индексированный бит
- Бит 44 - сегментированный бит
- Бит 43 - бит только для чтения
В более поздних реализациях эти биты состояния эволюционировали, чтобы идти в ногу с растущими объемами памяти и получать информацию.
Бит 47, вероятно, самый интересный бит в системе - это способ, которым архитектура реализует виртуальную память . Виртуальная память была первоначально разработана для проекта Атлас в Манчестерском университете в конце 1950-х годов. Стремясь увидеть, как это используется в коммерческих приложениях, они пригласили на семинар инженеров из нескольких компьютерных компаний, в том числе из Burroughs и IBM . Инженеры Burroughs осознали важность виртуальной памяти и воплотили ее в B5000. Инженеров IBM это не интересовало, и IBM не «изобретала» виртуальную память еще десять лет.
При обращении к дескриптору аппаратное обеспечение проверяет бит 47. Если он равен 1, данные присутствуют в памяти в месте, указанном в поле адреса. Если бит 47 равен 0, блок данных отсутствует, и возникает прерывание (p-битовое прерывание ) и вводится код MCP, чтобы сделать блок присутствующим. В этом случае, если поле адреса равно 0, блок данных не был выделен (init p-bit), и MCP ищет свободный блок, размер которого указан в поле длины.
Последний p-битовый сценарий - это когда бит 47 равен 0, что указывает на то, что данных нет в памяти, но адрес не равен нулю, что указывает на то, что данные были выделены, и в этом случае адрес представляет адрес диска в виртуальном область памяти на диске. В этом случае возникает p-битовое прерывание, которое отмечается как «другой» p-бит.
Использование в компиляторах
В ALGOL границы массива полностью динамические, могут быть взяты из значений, вычисляемых во время выполнения, в отличие от Pascal, где размер массивов фиксируется во время компиляции. Это основная слабость Паскаля, как определено в его стандарте, но она была удалена во многих коммерческих реализациях Паскаля, особенно в реализациях Берроуза (как в версии Университета Тасмании, разработанной Артуром Сэйлом и Роем Фриком, так и в реализации на Burroughs Slice авторами Мэтт Миллер и др.)
В программе в среде Burroughs массив не выделяется при его объявлении, а только при первом касании - таким образом можно объявлять массивы и избегать накладных расходов на их выделение, если они не используются.
Кроме того, не требуются системные вызовы низкоуровневого распределения памяти, такие как вызов класса malloc C и Unix - массивы автоматически выделяются по мере использования. Это избавляет программиста от огромного бремени наполнения программ подверженной ошибкам деятельностью по управлению памятью, которая имеет решающее значение для приложений для мэйнфреймов .
При переносе программ на языки более низкого уровня, такие как C, структура памяти C обрабатывается путем выделения собственной памяти в большом выделенном блоке B5000 - таким образом, безопасность остальной части системы B5000 не может быть поставлена под угрозу из- за ошибочных программ на C. Фактически, при переносе на архитектуру B5000 [ необходима ссылка ] было обнаружено множество переполнений буфера в очевидно правильно работающих программах на языке C. C, как и Pascal, также был реализован с использованием системы компилятора Slice (которая, как и LLVM , использует общий генератор кода и оптимизатор для всех языков). Компилятор C, исполняющая система, интерфейсы POSIX , а также перенос многих инструментов Unix были созданы Стивом Бартелсом. Eiffel компилятор был также разработан с использованием Slice.
Для объектно-ориентированных программ, которые требуют более динамичного создания объектов, чем архитектура B5000, объекты лучше всего размещать в одном блоке B5000. Такое распределение объектов находится на более высоком уровне, чем malloc в языке C, и лучше всего реализуется с помощью современного эффективного сборщика мусора .
Интеграция в архитектуру памяти
Поле адреса в B5000 составляет всего 15 бит, что означает, что дескрипторы могут адресовать только 32К слов (192 КБ) памяти. B6500 расширил это до 20 бит или 1 мегабайт слов (6 МБ). К середине семидесятых это все еще было существенным ограничением архитектуры. Чтобы преодолеть это, были реализованы два решения:
- Swapper - это решение фактически реализует еще один уровень поверх управления памятью, одновременно перемещая большие кластеры связанных данных в память и из нее.
- ASN - это решение позволяет настроить физически больший объем памяти в системе, разделенный на отдельно адресуемые блоки. Эта архитектура стала известна как память ASN (номер адресного пространства). Память логически разделена на две области, в которых адреса младшей памяти выделяются в глобальное адресное пространство для операционной системы, а вспомогательное программное обеспечение и адреса верхней памяти для нескольких параллельных локальных адресных пространств для отдельных программ. Адресные пространства пронумерованы, ноль указывает на глобальное, 1..n указывает на локальные адресные пространства. Программы, совместно использующие данные, автоматически помещаются в одно адресное пространство.
Для использования этих функций не требовалось никаких модификаций программного кода. Оба решения можно даже комбинировать, но со временем требования к памяти MCP и требования к совместному использованию программных данных превысили максимальный размер самого адресного пространства.
С появлением серии A в начале 1980-х значение этого поля было изменено, чтобы содержать адрес главного дескриптора, что означает, что могут быть выделены блоки данных размером 1 мегабайт, но что память машины может быть значительно расширена до гигабайт. или, возможно, терабайты. Эта архитектура получила название памяти ASD (Advanced Segment Descriptors). Это потребовало новой общей спецификации микрокода, называемой бета-версией. Главный провидец, стоящий за памятью о РАС, - Джон МакКлинток. Позже 3-битный тег памяти был увеличен до 4-битной спецификации, что позволило увеличить размер дескриптора сегмента с 20 до 23 бит, что позволило одновременно адресовать еще больший объем памяти. Эта спецификация микрокода стала известна как гамма уровня.
Управление памятью
Еще одно существенное преимущество было реализовано для виртуальной памяти. В проекте B5000, если блок данных был развернут, все дескрипторы, ссылающиеся на этот блок, должны были быть найдены, чтобы обновить бит присутствия и адрес. В главном дескрипторе нужно изменить только бит присутствия в главном дескрипторе. Также MCP может перемещать блоки в памяти для уплотнения, и ему нужно только изменить адрес в главном дескрипторе.
Разница между B5000 и большинством других систем заключается в том, что другие системы в основном используют выгружаемую виртуальную память, то есть страницы выгружаются фрагментами фиксированного размера независимо от структуры информации в них. Виртуальная память B5000 работает с сегментами переменного размера, как описано в дескрипторах.
Когда память заполнена до определенной емкости, вызывается процесс ОС, называемый «Шериф рабочего набора», либо для сжатия памяти, либо для начала перемещения сегментов из памяти. Сначала он выбирает сегменты кода, поскольку они не могут измениться и могут быть перезагружены из оригинала в файле кода, поэтому не требуется запись, а затем сегменты данных, которые записываются в файл виртуальной памяти.
P-битовые прерывания также полезны для измерения производительности системы. Для первоначального выделения "p-биты инициализации" указывают на потенциальную проблему производительности в программе, например, если процедура, выделяющая массив, вызывается постоянно. Перезагрузка блоков из виртуальной памяти на диск может значительно снизить производительность системы и не является ошибкой какой-либо конкретной задачи. Вот почему многие современные компьютеры могут повысить производительность системы за счет добавления памяти. На машинах B5000 «другие p-биты» указывают на системную проблему, которую можно решить либо путем лучшей балансировки вычислительной нагрузки в течение дня, либо путем добавления дополнительной памяти.
Таким образом, архитектура больших систем Burroughs помогает оптимизировать как отдельные задачи, так и систему в целом.
Защита от переполнения буфера
Последний и, возможно, самый важный момент, который следует отметить в отношении дескрипторов, - это то, как они влияют на дополнительные понятия безопасности системы и правильности программы. Один из лучших инструментов хакера для взлома операционных систем на сегодняшний день - это переполнение буфера. C, в частности, использует самый примитивный и подверженный ошибкам способ пометки конца строк, используя нулевой байт в качестве сигнального индикатора конца строки в самом потоке данных.
Указатели реализованы на B5000 с помощью индексированных дескрипторов. Во время операций индексации указатели проверяются при каждом приращении, чтобы убедиться, что ни исходный, ни целевой блоки не выходят за пределы. Во время операции сканирования или замены механизмы, используемые для чтения или копирования больших блоков памяти, как источника, так и места назначения, проверяются при каждом приращении слова на наличие допустимого тега памяти. Каждый сегмент памяти ограничен словами тега 3, что может привести к сбою такой операции. Каждый сегмент памяти, содержащий конфиденциальные данные, такие как программный код, хранится в словах тега 3, что делает невозможным неконтролируемое чтение, не говоря уже о модификации. Таким образом, значительный источник программных ошибок может быть обнаружен на раннем этапе до того, как программное обеспечение будет запущено в производство, и более значительный класс атак на безопасность системы невозможен.
Заметки
Рекомендации
- ^ Эксплуатационные характеристики процессоров для Burroughs B 5000 (PDF) (ред.), Детройт: Берроуз, 1962, 5000-21005A
- ^ Взято из «Дескриптор программы». 5000-21005A . п. 4-2.
- ^ Взято из «Дескриптор данных». 5000-21005A . п. 4-3.
- ^ Взято из «Данные и ввод / вывод». 5000-21005A . С. 4-4–4-13.
- ^ Взято из «Дескрипторы внешнего результата». 5000-21005A . С. 4-14–4-15.