Дескрипторы больших систем Burroughs

редактировать

Дескрипторы - это архитектурная особенность больших систем Burroughs, включая текущие (по состоянию на 2006 год) Unisys Clearpath / MCP системы. Помимо стека и на основе тегов, примечательной архитектурной особенностью этих систем является то, что они основаны на дескрипторах. Дескрипторы являются средством наличия данных, которые не находятся в стеке, как для массивов и объектов. Дескрипторы также используются для строковых данных, как в компиляторах и коммерческих приложениях.

Содержание
  • 1 Подробности
    • 1.1 B5000, B5500 и B5700
      • 1.1.1 Дескрипторы программы B5x00
      • 1.1.2 Дескрипторы данных
      • 1.1.3 Дескрипторы ввода-вывода
      • 1.1.4 Дескрипторы внешних результатов
    • 1.2 B6500, B7500 и последующие
  • 2 Использование в компиляторах
  • 3 Интеграция в архитектуру памяти
  • 4 Управление памятью
  • 5 Защита от переполнения буфера
  • 6 Примечания
  • 7 Ссылки
Подробности

Дескрипторы описывают области хранения, запросы ввода / вывода и ввод / O результаты. Они содержат поля, указывающие, например, тип дескриптора, адрес, длина, наличие данных в хранилище. Детали различаются в зависимости от линейки продуктов и типа дескриптора. В следующем тексте крайний левый (самый значимый) бит нумеруется как 0 в соответствии с документацией Берроуза.

B5000, B5500 и B5700

B5000 был первым компьютером на основе дескрипторов. Каждый дескриптор имеет флаг (бит 0), равный 1. Дескрипторы данных содержат 15-битный адрес хранения и 10-битный размер, как и большинство дескрипторов ввода-вывода. Дескрипторы программ и дескрипторы внешнего результата имеют 15-битный адрес, но не имеют поля размера.

Дескрипторы программы B5x00

Дескрипторы программы используются для определения сегментов программы. Либо вызов операнда, либо вызов дескриптора, который ссылается на дескриптор программы, вызовет вызов подпрограммы, если бит присутствия равен 1, в противном случае это вызовет прерывание присутствия.

Дескрипторы программы B5x00
012345678-1718-3233-47
ФлагIПрисутствиеIРежимAАдрес
110 = не в памяти. 1 = в памяти10 = слово. 1 = символ0 = аргумент не требуется. требуется аргумент

.

Дескрипторы данных

Дескрипторы данных относятся либо к блоку данных, присутствующему в памяти (P = 1), либо к блоку данных, который должен быть считан в память (P = 0), в зависимости от значения бита присутствия. Либо вызов операнда, либо вызов дескриптора, который ссылается на дескриптор данных, проверяет бит присутствия и поле размера; если бит присутствия равен 0, произойдет прерывание присутствия; если поле размера не равно нулю, то второе слово в стеке должно находиться в пределах диапазона, иначе произойдет прерывание индекса.

Дескрипторы данных B5x00
0123-78-1718192021- 3233-47
ФлагIНаличиеРазмерICАдрес
100 = нет в памяти. 1 = в памятиЗарезервировано. для MCPЗарезервировано. для MCP0 = Плавающее. 1 = ЦелоеЗарезервировано. для MCP

Дескрипторы ввода / вывода

B5x00 I / O Дескрипторы
0123-78-1718-3233-47
ФлагIАльтернативный. ВнешнийБлокРазмерУстройство. ЗависимоеАдрес
110 = запись. 1 = чтение

Дескрипторы внешних результатов

Дескриптор внешнего результата содержит дескриптор ввода-вывода, используемый для запуска операции с заменой некоторых полей.

Дескрипторы внешних результатов B5x00
0123-78-2526-3233-47
ФлагIАльтернативный. ВнешнийУстройствоНеактуальноУстройство. ЗависимоеАдрес
110 = запись. 1 = ошибка чтения. условияпоследнее. местоположение

B6500, B7500 и последующие дескрипторы

описывают блоки данных. Каждый дескриптор содержит адресное поле размером 20- бит, указывающее на блок данных. Каждый блок имеет длину, которая хранится в дескрипторе, также 20 бит. Также указывается размер данных: 4-, 6-, 8- или 48-битные данные в трехбитном поле.

Первым компьютером с такой архитектурой был B6500. в этой реализации значения различных битов состояния были:

  • Бит 47 - Бит присутствия (P-Bit)
  • Бит 46 - Бит копирования
  • Бит 45 - Индексированный бит
  • Бит 44 - сегментированный бит
  • Бит 43 - бит только для чтения

. В более поздних реализациях эти биты состояния эволюционировали, чтобы не отставать от растущих размеров памяти и получить представление.

Бит 47, вероятно, самый интересный бит в системе - это способ, которым архитектура реализует виртуальную память. Виртуальная память была первоначально разработана для проекта Atlas в Университете Манчестера в конце 1950-х годов. Стремясь увидеть, как это используется в коммерческих приложениях, они пригласили на семинар инженеров из нескольких компьютерных компаний, в том числе из Burroughs и IBM. Инженеры Burroughs осознали важность виртуальной памяти и внедрили ее в B5000. Инженеров IBM это не интересовало, и IBM не «изобретала» виртуальную память еще десять лет.

При обращении к дескриптору аппаратное обеспечение проверяет бит 47. Если он равен 1, данные присутствуют в памяти в месте, указанном в поле адреса. Если бит 47 равен 0, блок данных отсутствует, и возникает прерывание (p-bit interrupt ) и вводится код 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 МБ). К середине семидесятых это все еще было существенным ограничением архитектуры. Чтобы преодолеть это, были реализованы два решения:

  1. Swapper - это решение фактически реализует еще один уровень поверх управления памятью, перемещая большие кластеры связанных данных одновременно в и из памяти.
  2. 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, что делает невозможным неконтролируемое чтение, не говоря уже о модификации. Таким образом, значительный источник программных ошибок может быть обнаружен на раннем этапе до того, как программное обеспечение будет запущено в производство, и более значительный класс атак на безопасность системы невозможен.

Примечания
Ссылки
Последняя правка сделана 2021-05-13 06:22:02
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте