Документ кропотливо восстановлен из сканов, которые любезно предоставил ММ. Однако, качество материального носителя настолько плохое, что скан лучше фотографии лишь тем, что не надо восстанавливать искажение перспективы и равномерность освещения.
Было бы неплохо перевести в электронный вид всю коллекцию документации, которой владеет ММ, пока бумага в труху не превратилась и буквы с неё не осыпались вместе с этой трухой.
УТВЕРЖДЁН
00008-01-32.02-2-ЛУ
ПЕРСОНАЛЬНАЯ ЭВМ "ЭЛЕКТРОНИКА МС 0513"
(ЭЛЕКТРОНИКА БК0011)
ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ
ОПЕРАЦИОННАЯ СИСТЕМА ОС БК11
ФОРМАТЫ ФАЙЛОВ
РУКОВОДСТВО СИСТЕМНОГО ПРОГРАММИСТА
00008-01.32.02-2
Документ совпадает с книгой "Руководство системного программиста. Книга 4. Форматы файлов." Из комплекта документации РАФОС-II, но только в части, касающейся SJ-монитора и без расширенной памяти
1988 г.
СОДЕРЖАНИЕ
- 1. ВВЕДЕНИЕ
- 2. ФОРМАТ ИСХОДНОГО ФАЙЛА
- 3. ФОРМАТ
ОБЪЕКТНОГО МОДУЛЯ
-
3.1. БЛОК
GSD
- 3.1.1. ИНФОРМАЦИЯ ОБ ОБЪЕКТНОМ МОДУЛЕ (КИЭБ=0)
- 3.1.2. ИНФОРМАЦИЯ О КОНТРОЛЬНОЙ СЕКЦИИ (КИЭБ=1)
- 3.1.3. ИНФОРМАЦИЯ О ТАБЛИЦЕ ВНУТРЕННИХ СИМВОЛОВ (КИЭБ=2)
- 3.1.4. ИНФОРМАЦИЯ О СТАРТОВОМ АДРЕСЕ (КИЭБ=3)
- 3.1.5. ИНФОРМАЦИЯ О ГЛОБАЛЬНЫХ СИМВОЛАХ (КИЭБ=4)
- 3.1.6. ИНФОРМАЦИЯ О ПРОГРАММНОЙ СЕКЦИИ (КИЭБ=5)
- 3.1.7. ИДЕНТИФИКАТОР ВЕРСИИ ПРОГРАММЫ (КИЭБ=6)
- 3.1.8. ОБЪЯВЛЕНИЕ МАССИВА ОТОБРАЖЕНИЯ (КИЭБ=7)
- 3.2. БЛОК ENDGSD
- 3.3. БЛОК TXT
-
3.4. БЛОК
RLD
- 3.4.1. ВНУТРЕННЕЕ ПЕРЕМЕЩЕНИЕ
- 3.4.2. ГЛОБАЛЬНОЕ ПЕРЕМЕЩЕНИЕ
- 3.4.3. ВНУТРЕННЕЕ ПЕРЕМЕЩАЕМОЕ СМЕЩЕНИЕ
- 3.4.4. ГЛОБАЛЬНОЕ ПЕРЕМЕЩАЕМОЕ СМЕЩЕНИЕ
- 3.4.5. ГЛОБАЛЬНОЕ АДДИТИВНОЕ СМЕЩЕНИЕ
- 3.4.6. ГЛОБАЛЬНОЕ АДДИТИВНОЕ ПЕРЕМЕЩАЕМОЕ СМЕЩЕНИЕ
- 3.4.7. ОПРЕДЕЛЕНИЕ СОДЕРЖИМОГО СЧЁТЧИКА АДРЕСА
- 3.4.8. МОДИФИКАЦИЯ СЧЁТЧИКА АДРЕСОВ
- 3.4.9. УСТАНОВКА ГРАНИЦ ПРОГРАММЫ
- 3.4.10. СМЕЩЕНИЕ ПРОГРАММНОЙ СЕКЦИИ
- 3.4.11. ПЕРЕМЕЩАЕМОЕ СМЕЩЕНИЕ ПРОГРАММНОЙ СЕКЦИИ
- 3.4.12. АДДИТИВНОЕ СМЕЩЕНИЕ ПРОГРАММНОЙ СЕКЦИИ
- 3.4.13. АДДИТИВНОЕ ПЕРЕМЕЩАЕМОЕ СМЕЩЕНИЕ ПРОГРАММНОЙ СЕКЦИИ
- 3.4.14. СЛОЖНОЕ СМЕЩЕНИЕ
- 3.5. БЛОК ENDMOD
-
3.1. БЛОК
GSD
- 4. ФОРМАТ ФАЙЛА STB
- 5. ФОРМАТ БИБЛИОТЕЧНЫХ ФАЙЛОВ
- 6. ФОРМАТ ФАЙЛА SAV
- 7. ФОРМАТ ФАЙЛА ПЕРЕКРЁСТНЫХ ССЫЛОК
- 8. СТРУКТУРА УСТРОЙСТВА ПРЯМОГО ДОСТУПА
- 9. СТРУКТУРА УСТРОЙСТВА ПОСЛЕДОВАТЕЛЬНОГО ДОСТУПА
1. ВВЕДЕНИЕ
ОС БК-11 управляет тремя типами информации:
- символьной;
- форматной двоичной;
- неформатной двоичной.
Исходный файл, написанный на ассемблере или на одном из языков высокого уровня, содержит символьный тип информации.
После компиляции файла будет получен объектный файл, содержащий форматную двоичную информацию.
После обработки объектного файла компоновщиком (программа LINK) полученный файл содержит неформатный двоичный тип информации. Этот же тип информации содержат файлы данных.
В системе существуют три формата файлов (рис. 1):
- исходные (тип MAC, PAS, DAT, BAS и др.); это программы или данные в символьном виде;
- объектные (тип OBJ); они образуются в результате трансляций исходных файлов; объектный файл может состоять из одного или нескольких объектных модулей; объединение этих модулей в объектный файл осуществляется с помощью команды COPY и ключа /CONCATENATE; библиотечные файлы нельзя объединять с помощью этой команды, они обрабатываются специальной программой библиотекарь (LIBR);
- в формате загрузки (тип SAV); это объектные файлы, скомпонованные программой LINK; компоновщик создаёт из объектного файла файл-"копию памяти" (SAV) для раздела пользователя.
Схема преобразования файлов в системе
Рис. 1
2. ФОРМАТ ИСХОДНОГО ФАЙЛА
Файлы исходных текстов программ, написанных на макроассемблере или паскале, и текстовые файлы, созданные редактором, являются последовательностью символов кода КОИ-7. Эти файлы содержат последовательности байтов, и каждый байт представляет один символ кода КОИ-7.
Обычно текстовый файл разбивается на "страницы", которые отделяются друг от друга управляющим символом <FF> (перевод страницы), страницы могут разбиваться на строки, которые отделяются друг от друга последовательностью управляющих символов <ВК><ПС>. Текстовые файлы не имеют специальных заголовков или блоков окончания и не содержат форматных двоичных блоков.
Код 32 (или <СУ/Z>) может завершать текстовой файл. Если командная строка для PIP задана с ключом /A (или если используется команда монитора COPY/ASCII) для копирования текстовых файлов, то при выполнении операции она осуществляет проверку на наличие управляющего символа <СУ/Z>. Если файл содержит <СУ/Z>, PIP предполагает, что это конец файла. Если PIP используется в режиме "по умолчанию" (или задана команда монитора COPY без ключей) для копирования текстового файла, она не отслеживает появление <СУ/Z>. Копирование продолжается до обнаружения физического конца файла.
3. ФОРМАТ ОБЪЕКТНОГО МОДУЛЯ
Обычно модуль программы, написанный на ассемблере, начинается с директивы .TITLE (в которой следует имя модуля) и заканчивается директивой .END (признак конца программы). Если имя модуля отсутствует, то по умолчанию, модуль получает имя ".MAIN.".
Объектный модуль обычно создаётся при ассемблировании или при компиляции, если исходный модуль написан на языке высокого уровня (исключая паскаль).
Модуль состоит из двоичных блоков, каждый блок - это последовательность байтов, которая может храниться на любом внешнем носителе.
Структура двоичного блока представлена на рис. 2.
Рис. 2
Первые два байта каждого блока содержат идентификатор начала блока:
младший байт - 1;
старший байт - 0.
2-й и 3-й байты являются счётчиком и указывают количество байтов в блоке (байт контрольной суммы не учитывается).
Значение байта контрольной суммы блока равно сумме значений всех байтов блока в дополнительном коде. Таким образом, сумма всех байтов блока (включая контрольную сумму) должна быть равна нулю.
Данные, находящиеся в двоичном блоке, определяются типом блока. Тип блока записывается в третье слово двоичного блока.
Каждый тип блока имеет свой код идентификатора типа блока (код ИТБ). Типы блоков представлены в табл. 1.
Код ИТБ |
Тип блока |
Функция. |
---|---|---|
1 |
GSD |
Информация о глобальных символах. |
2 |
ENDGSD |
Признак конца блоков GSD в модуле |
3 |
TXT |
Машинные коды программы |
4 |
RLD |
Информация о перемещаемых локальных символах. |
5 |
ISD |
Информация о внутренних символах (не поддерживается системой) |
6 |
ENDMOD |
Признак конца объектного модуля |
7 |
TITLIB |
Заголовок библиотечного файла |
10 |
ENDLIB |
Признак конца библиотечного файла |
Первым блоком объектного модуля должен быть блок GSD. Если в модуле содержится несколько блоков GSD, то эти блоки могут чередоваться с другими блоками (рис. 3). Все блоки GSD должны быть расположены перед блоком ENDGSD (признак конца блоков GSD), блок ISD может быть расположен в любом месте между блоками GSD и ENDMOD.
Необходимо объявить все программные секции (PSECT, VSECT и CSECT), определяемые в модуле в блоках GSD. При резервировании области для секции размер каждой определяемой программной секции указывается в байтах.
Если программная секция объявляется несколько раз в одном и том же объектном модуле, компоновщик устанавливает самый большой объявленный размер для этой секции. Все глобальные символы, которые определены в данной программной секции, должны быть описаны в блоках GSD, непосредственно следующих за объявлением этой программной секции.
Специальная программная секция, называемая абсолютной секцией (.ABS.), размещается компоновщиком, начиная с ячейки 0 в памяти (ОЗУ). Непосредственно после типа записи в блоке GSD, который определяет абсолютную секцию, объявляются все глобальные символы, которые содержат абсолютные значения (неперемещаемые).
Если нет необходимости распределить место для абсолютной секции, то в ячейке, содержащей размер этой секции, необходимо указать 0. Это можно сделать даже в том случае, если после неё объявляется абсолютный глобальный символ.
Глобальный символ, на который имеются ссылки, но который не определён в текущем объектном модуле, должен также быть описан в блоке GSD. Эти глобальные ссылки могут быть описаны в любом блоке GSD (кроме самого первого, который содержит имя модуля) после абсолютной PSECT. Они всегда определяют последнюю объявленную PSECT.
Примечание. Если 16-разрядное слово запоминается как часть информации в блоке данных, оно всегда запоминается как последовательность из двух 8-разрядных байтов; первым располагается младший байт.
Блоки данных объектного модуля имеют различную длину. Первый байт в блоке данных содержит код, который идентифицирует тип блока данных. Коды могут иметь значения от 0 до 10 (восьмеричное). Формат последующей информации в блоке данных зависит от типа блока данных.
Формат объектного модуля
GSD |
Инициализация блоков GSD |
|
RLD |
Инициализация блоков RLD |
|
GSD |
Дополнительный блок GSD |
|
TXT |
|
Текстовые блоки |
TXT |
||
RLD |
Информация о перемещаемых |
|
. . . |
|
|
GSD |
|
|
ENDGSD |
Блок конца блоков GSD |
|
ISD |
|
Информация о внутренних |
ISD |
||
TXT |
|
|
TXT |
|
|
TXT |
|
|
RLD |
|
|
ENDMOD |
Блок конца модуля |
Рис. 3
Блок ENDMOD (признак конца объектного модуля) должен быть последним в объектном модуле.
3.1. БЛОК GSD
Блоки GSD содержат всю информацию, необходимую компоновщику для назначения адресов глобальным символам и для распределения памяти, запрашиваемой заданием.
Блок GSD состоит из элементов, каждый из которых имеет формат, представленный на рис. 4.
Формат элемента блока
0 |
1 |
Идентификатор блока GSD |
||
|
Имя в коде RAD50 |
|
||
|
|
|
||
КИЭБ |
Флажки |
|
||
Длина или смещение |
|
Рис. 4
Старший байт четвёртого слова блока GSD содержит код идентификатора элемента блока (КИЭБ). Значение КИЭБ указывает на тип содержащейся информации:
0 |
- информация об объектном модуле; |
1 |
- имя контрольной секции (.CSECT); |
2 |
- имя таблицы внутренних символов (системой не используется); |
3 |
- информация о стартовом адресе; |
4 |
- информация о глобальных символах; |
5 |
- информация о программной секции (.ASECT, .CSECT или .PSECT); |
6 |
- идентификатор версии программы (.IDENT); |
7 |
- информация о виртуальной секции программы (.VSECT). |
3.1.1. ИНФОРМАЦИЯ ОБ ОБЪЕКТНОМ МОДУЛЕ (КИЭБ=0)
Элемент объектного модуля объявляет имя объектного модуля и имеет структуру, представленную на рис. 5.
|
Имя модуля |
|
|
|
|
||
0 |
0 |
||
0 |
Рис. 5
Имя объектного модуля не обязано быть уникальным (единственным) по отношению к другим объектным модулям, поскольку модули идентифицируются файлом, а не именем модуля, однако только одно имя модуля может быть объявлено в одном объектном модуле.
Элемент объектного модуля содержит следующую информацию:
Слова 1 и 2 |
- имя модуля в коде RAD50; имя модуля даётся в директиве .TITLE; |
Слово 3 |
- младший байт (флажки) = 0; |
Слово 4 |
- смещение = 0. |
3.1.2. ИНФОРМАЦИЯ О КОНТРОЛЬНОЙ СЕКЦИИ (КИЭБ=1)
Запись содержит имя контрольной секции. Компоновщик преобразует контрольные секции (которые включают .ASECT, неименованную и именованные .CSECT) в соответствующие .PSECT. Это преобразование выполняется для совместимости с другими системами.
Формат контрольной секции представлен на рис. 6.
|
Имя контрольной |
|
|
|
|
||
1 |
Не |
||
Максимальная длина |
Рис. 6
Можно объявить .ASECT и .CSECT с помощью директивы .PSECT. Например, для объявления неименованной .CSECT используется .PSECT со следующими атрибутами:
.PSECT ,RW,I,LCL,REL,CON
Для объявления именованной .CSECT используется .PSECT со следующими атрибутами:
.PSECT NAME,RW,I,GBL,REL,OVR
Для объявления .ASECT используется .PSECT со следующими атрибутами:
.PSECT .ABS.,RW,I,GBL,ABS,OVR
Компоновщик преобразует .ASECT и .CSECT в .PSECT с фиксированными атрибутами, указанными выше.
3.1.3. ИНФОРМАЦИЯ О ТАБЛИЦЕ ВНУТРЕННИХ СИМВОЛОВ (КИЭБ=2)
Запись содержит имя внутреннего символа (символ содержится в данном модуле). Т.к. компоновщик не использует таблицу внутренних символов, то эта запись не содержит дополнительной информации. При обработке блоков GSD компоновщик игнорирует эту информацию.
Формат записи представлен на рис. 7.
|
Имя символа |
|
|
|
|
||
2 |
0 |
||
Не используется |
Рис. 7
Элемент программной секции содержит следующую информацию:
Слова 1 и 2 |
- имя символа в коде RAD50; |
Слово 3 |
- младший байт (флажки) равен 0; |
Слово 4 |
- не используется. |
3.1.4. ИНФОРМАЦИЯ О СТАРТОВОМ АДРЕСЕ (КИЭБ=3)
Элемент стартового адреса объявляет стартовый адрес модуля относительно PSECT и содержит следующую информацию:
Слова 1 и 2 |
- имя программной секции в коде RAD50; |
Слово 3 |
- младший байт (флажки) = 0; |
Слово 4 |
- адрес метки, указанной в директиве .END, относительно начала программной секции; если адрес в директиве отсутствует, то ассемблер записывает в это слово 1; при компоновке LINK просматривает все стартовые адреса, выбирает первый чётный стартовый адрес; если все адреса оказались нечётными, то компоновщик записывает 1 в ячейку 40 нулевого блока. |
Формат записи о стартовом адресе представлен на рис. 8.
|
Имя PSECT |
|
|
|
|
||
3 |
0 |
||
Смещение |
Рис. 8
Примечание. В случае. Когда PSECT является абсолютной, то смещение соответствует фактическому адресу передачи, если он не эквивалентен 00001.
3.1.5. ИНФОРМАЦИЯ О ГЛОБАЛЬНЫХ СИМВОЛАХ (КИЭБ=4)
Элемент глобального символа имеет следующую информацию:
Слова 1 и 2 |
- имя глобального символа в коде RAD50; |
Слово 3 |
- младший байт (флажки); |
Слово 4 |
- константа; глобальный символ может быть расположен в абсолютной или перемещаемой секции; в связи с этим 4-е слово элемента будет содержать абсолютный адрес или смещение относительно начала перемещаемой секции. |
|
Имя глобального |
|
|
|
|
||
4 |
Флажки |
||
Константа |
Рис. 8.5
Для характеристики глобального символа используются два флажка: биты 3 и 5.
Флажки содержат следующую информацию о глобальном символе:
Бит 3 |
0 - не определён в данной программной секции; |
Бит 5 |
0 - абсолютное значение; |
3.1.6. ИНФОРМАЦИЯ О ПРОГРАММНОЙ СЕКЦИИ (КИЭБ=5)
Система позволяет при создании и корректировке программ применять метод секционирования.
Программа может состоять из набора программных секций программная секция, кроме имени, имеет аргументы, которые определяют тип информации, содержащейся в этой секции. Например, программная секция может состоять только из одних данных или только из одних инструкций.
Формат записи о программной секции представлен на рис. 9.
|
Имя программной |
|
|
|
|
||
5 |
Флажки |
||
Максимальная длина |
Рис. 9
Элемент программной секции содержит следующую информацию:
Слова 1 и 2 |
- имя программной секций в коде RADIX-50; |
Слово 3 |
- младший байт (флажки); |
Слово 4 |
- константа, равная длине программной секции плюс 2 (т.е. указывает на следующий адрес, с которого программная секция может быть продолжена). |
Примечания:
- Длина всех абсолютных секций равна длине наибольшей из них.
- В системе используется директива макроассемблера .PSECT для определений программной секции. Программная секция имеет имя. Если имя отсутствует, то вместо него должна стоять запятая. Например, если имя программной секции SYM, то директива имеет вид:
.PSECT SYM,АРГУМЕНТЫ
Если имя отсутствует, то директива имеет вид:
.PSECT ,АРГУМЕНТЫ
Макроассемблер допускает 256 программных секций:
- Одну абсолютную программную секцию;
- Одну неименованную перемещаемую программную секцию;
- 254 именованные перемещаемые программные секции.
Программная секция имеет следующий набор аргументов (флажков):
Чтение и запись (RW) |
Аргумент, указывающий, что информация данной программной секции может считываться и корректироваться; |
Только чтение (RO) |
Аргумент, указывающий, что информацию данной программной секции можно только считывать, но не корректировать (не поддерживается системой); |
Абсолютная секция (ABS) |
Программная секция, которая содержит только абсолютные адреса; если этот аргумент отсутствует, то по умолчанию секция воспринимается как перемещаемая; |
Перемещаемая секция (REL) |
Программная секция, содержащая перемещаемые адреса; |
Глобальная секция (GBL) |
Аргумент, используемый при создании оверлейной программы; в этом случае все глобальные секции, описанные в различных оверлейных модулях, при компоновке пересылаются в корневой сегмент; при отсутствии аргумента секция воспринимается как локальная для оверлейного сегмента, где размещается данный модуль; |
Локальная секция (LCL) |
Программная секция, расположенная внутри объектного модуля, в котором она объявлена; аргумент устанавливается по умолчанию; |
Данные (D) |
Аргумент, указывающий, что программная секция содержит только данные; по умолчанию устанавливается, что программная секция содержит только инструкции; |
Инструкции (I) |
Аргумент, указывающий, что программная секция содержит только инструкции; устанавливается по умолчанию; |
Оверлейная секция (OVR) |
Аргумент, указывающий, что все программные секции с одинаковыми именами, объявленные в разных модулях, накладываются друг на друга при компоновке модулей в программу; при этом размер программной секции будет равен длине самой большой из объявленных секций; по умолчанию устанавливается аргумент "присоединяемая секция"; |
Присоединяемая секция (CON) |
Аргумент, указывающий, что все одноимённые программные секции, объявленные в нескольких модулях, добавляются к первой объявленной секции; этот аргумент устанавливается по умолчанию. |
Элемент программной секции использует следующие флажки для характеристик секции:
Бит 2 |
0 - |
неоверлейная программная секция (CON); |
|
1 - |
оверлейная (OVR); |
Бит 5 |
0 - |
абсолютная (ABS); |
|
1 - |
перемещаемая (REL); |
Бит 6 |
0 - |
локальная (LCL); |
|
1 - |
глобальная (GBL); |
Бит 7 |
0 - |
содержит только инструкции (I); |
|
1 - |
содержит только данные (D). |
Допускается использование следующих программных секций: .ASECT и .CSECT. Однако эти программные секции имеют строго определённые аргументы. При попытке пользователя изменить аргументы при трансляции выдаётся сообщение об ошибке.
Ниже приведены аргументы, которые могут иметь программные секции ОС БК-11:
.ASECT RW,I,GBL,ABS,OVR .CSECT RW,I,LCL,REL,CON .CSECT /ИМЯ/ RW,I,GBL,REL,OVR COMMON /ИМЯ/ RW,D,GBL,REL,OVR
3.1.7. ИДЕНТИФИКАТОР ВЕРСИИ ПРОГРАММЫ (КИЭБ=6)
Идентификатор версии программы содержит номер версии модуля. Компоновщик извлекает номер версии из директивы .IDENT первого модуля, в котором он задан, и включает его в карту загрузки памяти.
Формат записи представлен на рис. 10.
|
Символьное |
|
|
|
|
||
6 |
0 |
||
0 |
Рис. 10
Элемент содержит следующую информацию:
Слова 1 и 2 |
- идентификатор версии в коде RAD50: |
Слова 3 и 4 |
- не используются. |
3.1.8. ОБЪЯВЛЕНИЕ МАССИВА ОТОБРАЖЕНИЯ (КИЭБ=7)
Эта запись содержит информацию о распределении пространства внутри области массива отображения памяти задания. Компоновщик включает имя массива в список именованной PSECT, и последующие блоки RLD могут ссылаться на неё.
Компоновщик добавляет длину (в блоках по 32 слова) для размещения массива отображения задания. Он определяет общий размер памяти, необходимой для размещения каждого массива отображения. Байт флага не используется и предполагается равным нулю. Только компилятор с языка Фортран СМ использует программные секции .VSECT.
Компоновщик преобразует VSECT в PSECT со следующими атрибутами:
.PSECT .VIR.,RW,D,GBL,REL,CON
Длина соответствует количеству запрашиваемых 32-словных блоков. Если длина равна нулю, то это корневой сегмент.
Не должно быть никаких глобальных символов в секции, которая начинается с нулевого базового адреса.
Формат элемента "объявление массива отображения" представлен на рис. 11.
|
Имя массива |
|
|
|
|
||
7 |
Не |
||
Длина |
Рис. 11
3.2. БЛОК ENDGSD
Блок ENDGSD указывает, что представлены все блоки GSD, содержащиеся в данном модуле.
В каждом объектном модуле должен быть всего один блок ENDGSD, длина блока данных равна одному слову (рис. 12).
0 |
2 |
Рис. 12
3.3. БЛОК TXT
Блок текстовой информации содержит байтовые строки информации, которые компоновщик записывает непосредственно в выходной файл. Блок содержит адрес загрузки, расположенный в 2 байтах.
Текстовые записи могут содержать слова или байты информации, которая может быть продолжена в следующем блоке TXT. В этом случае блоки TXT разделяются блоком RLD, содержащим информацию о перемещении. Если текстовой блок не будет модифицироваться, то ему не будет предшествовать блок RLD.
Блок данных TXT так же, как и блок RLD, не должен иметь длину больше 42 байтов.
Формат блока TXT представлен на рис. 13.
Код. ИТБ |
Адрес загрузки |
Двоичные коды |
Рис. 13
Блок данных TXT имеет код идентификатора типа блока (код ИТБ), равный 3.
Адрес загрузки блока TXT соответствует смещению от текущего базового адреса PSECT. Первому блоку TXT должен предшествовать, по крайней мере, один блок RLD. Этот блок RLD должен объявить текущую PSECT.
3.4. БЛОК RLD
В блоках RLD содержится информация о всех секциях, имеющихся в программе, и их базовых адресах, о перемещаемых глобальных и локальных символах.
Блок RLD может содержать 14 типов команд. Команда (рис. 14) может занимать максимально четыре слова. В зависимости от типа команды изменяется её длина. Первое слово команды. Присутствует во всех типах команд.
Формат команды блока RLD
15 |
|
8 |
7 |
6 |
|
0 |
Относительное |
В |
Код команды |
||||
|
Имя (два слова в коде |
|
||||
|
|
|||||
Константа |
Рис. 14
Блоки перемещения RLD (см. рис. 14) содержат информацию, необходимую LINK для перемещения компоновки, и предшествующую блоку текстовой информации.
Каждый модуль должен иметь, по крайней мере один блок RLD, который предшествует первому блоку TXT. Первый блок не модифицирует предшествующий блок TXT, а определяет текущую PSECT и размещение.
На рис. 14 представлен общий вид команды, которая состоит из следующих компонентов:
- относительное смещение; указывает смещение от начала блока TXT до соответствующего байта (или слова) данных: байт смещения суммируется со значением, вычисляемым относительно адреса загрузки предшествующего блока TXT; полученное значение является виртуальным адресом, который должен быть модифицирован;
- тип команды (биты 0-6); можно указать до 128 типов команд; в ОС БК-11 используется только 14 типов команд;
- бит модификации (бит "B"); не используется
системой; если бит установлен, то он игнорируется; компоновщик обслуживает
перемещение слова, но не байта:
- при B=0 команда модифицирует всё слово;
- при B=1 команда модифицирует байт;
- имя глобального или локального символа, или имя программной секции;
- константа; может быть относительным адресом или результатом суммирования, если этого требует данная команда.
Существуют следующие типы команд:
Тип 1 |
- внутреннее перемещение; |
Тип 2 |
- глобальное перемещение; |
Тип 3 |
- внутреннее перемещаемое смещение; |
Тип 4 |
- глобальное перемещаемое смещение; |
Тип 5 |
- глобальное аддитивное смещение; |
Тип 6 |
- глобальное аддитивное перемещаемое смещение; |
Тип 7 |
- определение содержимого счётчика адресов; |
Тип 10 |
- модификация счётчика адресов; |
Тип 11 |
- установка границ программы (.LIMIT); |
Тип 12 |
- смещение программной секции; |
Тип 13 |
- не используется; |
Тип 14 |
- перемещаемое смещение программной секции; |
Тип 15 |
- аддитивное смещение программной секции; |
Тип 16 |
- аддитивное перемещаемое смещение программной секции; |
Тип 17 |
- сложное смещение. |
3.4.1. ВНУТРЕННЕЕ ПЕРЕМЕЩЕНИЕ
Данный тип записи определяет прямой указатель на адрес внутри модуля. Базовый адрес текущей программной секции прибавляется к указанной константе, и результат записывается в выходной файл по вычисленному адресу, т.е. суммируется байт смещения со значением, вычисляемым относительно адреса загрузки предшествующего блока TXT.
Пример 1. |
Пример 2. |
A: MOV #A,R0 |
.WORD А |
Команда внутреннего перемещения имеет формат, представленный на рис. 15.
Смещение |
B |
1 |
Константа |
Рис. 15
3.4.2. ГЛОБАЛЬНОЕ ПЕРЕМЕЩЕНИЕ
Этот тип записи определяет прямой указатель на глобальный символ. Компоновщик определяет глобальный символ и помещает результат в выходной файл по вычисленному адресу.
Пример 1. |
Пример 2. |
MOV #GLOBAL,R0 |
.WORD GLOBAL |
Формат типа команды представлен на рис. 16.
Смещение |
B |
2 |
|
|
Символьное имя |
||
|
|
Рис. 16
3.4.3. ВНУТРЕННЕЕ ПЕРЕМЕЩАЕМОЕ СМЕЩЕНИЕ
Этот тип записи определяет относительную ссылку на абсолютный адрес внутри перемещаемой контрольной секции.
Пример 1. |
Пример 2. |
CLR 177550 |
MOV 177550,R0 |
Формат типа команды представлен на рис. 17.
Смещение |
B |
3 |
|
Константа |
Рис. 17
3.4.4. ГЛОБАЛЬНОЕ ПЕРЕМЕЩАЕМОЕ СМЕЩЕНИЕ
Этот тип записи содержит относительную ссылку на глобальный символ. Компоновщик определяет имя глобального символа и его адрес, затем вычисляет смещение между адресом (адрес данной инструкции + 2), в который будет помещено смещение, и адресом глобального символа. Полученное значение смещения записывается в выходной файл по соответствующему адресу (адрес данной инструкции + 2).
Пример 1. |
Пример 2. |
CLR GLOBAL |
MOV GLOBAL,R0 |
Формат типа команды представлен на рис. 18.
Смещение |
B |
4 |
|
|
Символьное имя |
||
|
|
Рис. 18
3.4.5. ГЛОБАЛЬНОЕ АДДИТИВНОЕ СМЕЩЕНИЕ
Этот тип записи содержит прямой указатель на глобальный символ с дополнительной константой. Компоновщик определяет адрес глобального символа, добавляет к нему указанную константу и полученное значение записывает в выходной файл.
Пример 1. |
Пример 2. |
MOV #GLOBAL+2, R0 |
.WORD GLOBAL-4 |
Формат типа команды представлен на рис. 19.
Смещение |
B |
5 |
|
|
Символьное имя |
||
|
|
||
Константа |
Рис. 19
3.4.6. ГЛОБАЛЬНОЕ АДДИТИВНОЕ ПЕРЕМЕЩАЕМОЕ СМЕЩЕНИЕ
Этот тип записи содержит ссылку на глобальный символ с дополнительной константой. Компоновщик определяет адрес указанного глобального символа и прибавляет к нему указанную константу. Из полученного значения компоновщик вычитает адрес инструкции + 2, в который будет помещено полученное смещение. Затем это смещение записывается в выходной файл.
Пример 1. |
Пример 2. |
CLR GLOBAL+2 |
MOV GLOBAL-5,R0 |
Формат типа команды представлен на рис. 20.
Смещение |
B |
6 |
|
|
Символьное имя |
||
|
|
||
Константа |
Рис. 20
3.4.7. ОПРЕДЕЛЕНИЕ СОДЕРЖИМОГО СЧЁТЧИКА АДРЕСА
Этот тип записи объявляет текущую PSECT и текущее значение счётчика компоновщик запоминает последний адрес + 2 предшествующего объявления данной секции. Он добавляет к этому адресу указанную константу и запоминает результат как текущее значение счётчика.
Формат типа команды представлен на рис. 21.
0 |
B |
7 |
|
|
Имя секции |
||
|
|
||
Константа |
Рис. 21
3.4.8. МОДИФИКАЦИЯ СЧЁТЧИКА АДРЕСОВ
Этот тип записи модифицирует текущее значение счётчика. Компоновщик добавляет к текущему значению базового счётчика PSECT указанную константу и запоминает результат как текущее значение счётчика.
Пример 1. |
Пример 2. |
. = .+N |
.BLKB N |
Формат типа команды представлен на рис. 22.
0 |
B |
10 |
|
Константа |
Рис. 22
3.4.9. УСТАНОВКА ГРАНИЦ ПРОГРАММЫ
Этот тип записи создаётся при использовании директивы ассемблера .LIMIT. Компоновщик извлекает первый адрес выше заголовка (с которого обычно начинается стек) и верхний адрес размещения программы. Затем он записывает эти адреса в выходной файл в два слова.
Пример.
.LIMIT
Формат типа команды представлен на рис. 23.
Смещение |
B |
11 |
Рис. 23
3.4.10. СМЕЩЕНИЕ ПРОГРАММНОЙ СЕКЦИИ
Этот тип записи содержит прямой указатель на начало другой PSECT, содержащей определение имени, на которую производится ссылка в данной PSECT. Компоновщик извлекает текущее значение базового адреса указанной PSECT и записывает его в выходной файл.
Пример 1. |
Пример 2. |
.PSECT А B: . . . . . . . . . .PSECT С MOV #В,R0 |
.PSECT А В: . . . . . . . . . .PSECT С .WORD В |
Формат типа команды представлен на рис. 24.
Смещение |
B |
12 |
|
|
Имя секции |
||
|
|
Рис. 24
3.4.11. ПЕРЕМЕЩАЕМОЕ СМЕЩЕНИЕ ПРОГРАММНОЙ СЕКЦИИ
Этот тип записи содержит относительное смещение до адреса начала другой PSECT, расположенной в том же модуле. Компоновщик определяет текущий базовый адрес указанной PSECT. Затем он вычитает из этого значения адрес + 2, в который будет записано полученное значение смещения, и записывает результат в выходной файл.
Пример.
.PSECT A B: . . . . . . . . . .PSECT C MOV B,R0
Формат типа команды представлен на рис. 25.
Смещение |
B |
14 |
|
|
Имя секции |
||
|
|
Рис. 25
3.4.12. АДДИТИВНОЕ СМЕЩЕНИЕ ПРОГРАММНОЙ СЕКЦИИ
Этот тип записи определяет прямой указатель на адрес в другой PSECT, расположенной в том же модуле. Компоновщик определяет текущий базовый адрес указанной PSECT. Он добавляет константу к текущему базовому адресу и полученное значение записывает в выходной файл.
Пример 1. |
Пример 2. |
.PSECT A B: . . . . . . . . . C: . . . . . . .PSECT D MOV #B+10,R0 MOV #C,R0 |
.PSECT A B: . . . . . . . . . C: . . . . . . . . . .WORD B+10 .WORD C |
Формат типа команды представлен на рис. 26.
Смещение |
B |
15 |
|
|
Имя секции |
||
|
|
||
Константа |
Рис. 26
3.4.13. АДДИТИВНОЕ ПЕРЕМЕЩАЕМОЕ СМЕЩЕНИЕ ПРОГРАММНОЙ СЕКЦИИ
Этот тип записи определяет относительное смещение до адреса другой PSECT, расположенной в том же модуле. Компоновщик определяет текущий базовый адрес указанной PSECT и добавляет к нему константу, затем вычитает из полученного значения адрес инструкции + 2, в который будет записан результат. Полученное значение выводится в выходной файл.
Пример.
.PSECT A B: . . . . . . . . . C: .PSECT D MOV B+10,R0 MOV C,R0
Формат типа команды представлен на рис. 27.
Смещение |
B |
16 |
|
|
Имя секции |
||
|
|
||
Константа |
Рис. 27
3.4.14. СЛОЖНОЕ СМЕЩЕНИЕ
Этот тип записи содержит комплексное перемещаемое выражение. Комплексное перемещаемое выражение - это выражение, в котором любая двоичная или унарная операция макроассемблера разрешена с любым типом аргумента, независимо от аргумента, который может быть неопределённым глобальным символом, перемещаемым и расположенным в другой PSECT, абсолютным или комплексным перемещаемым подвыражением.
Слово команды RLD содержит строку знаков, определяющую коды операции и аргументы. Каждый код операции занимает один байт, и полная команда RLD должна располагаться в одном блоке данных. Команда "сохранить результат" (коды 12 и 13) указывает, что значение должно быть записано в выходной файл по соответствующему адресу.
Компоновщик воспринимает все операнды как 16-битные знаковые значения, используя двоичную арифметику с дополнением до 2. Результаты эквивалентны выражениям, которые вычисляются ассемблером при трансляции.
Примечания:
- Попытка деления на нуль соответствует результату 0. Компоновщик выдаёт предупреждающее сообщение.
- Все результаты усекаются слева до 16 разрядов. Если число слишком велико, то диагностика не выдаётся. Если результат модифицирует байт, компоновщик рассматривает данную ситуацию как ошибку усечения (байтовые операции запрещены).
- Все операции производятся над перемещаемыми (аддитивное) или абсолютными 16-разрядными значениями PC.
В ОС БК-11 используются следующие коды операций:
0 |
- нет операции; |
1 |
- сложение ( + ); |
2 |
- вычитание ( - ); |
3 |
- умножение ( * ); |
4 |
- деление ( / ); |
5 |
- логическое "И" ( & ); |
6 |
- логическое "ИЛИ" ( ! ); |
7 |
- исключающее "ИЛИ" (у операции нет знака, поэтому её невозможно задать); |
10 |
- отрицание ( - ); |
11 |
- дополнение ( ^C ); |
12 |
- сохранить результат (завершение команды); |
13 |
- сохранить результат с перемещаемым смещением (завершение команды); |
16 |
- вызвать глобальный символ; за командой следуют четыре байта, содержащие символьное имя в коде RAD50; |
17 |
- вызвать перемещаемое значение; за командой следует один байт, содержащий номер секции, и два байта, содержащие смещение в секции; |
20 |
- вызвать константу; за командой следуют два байта, содержащие константу. |
Пример.
.PSECT ALPHA A: . . . . . . . . . .PSECT BETA B: . . . . . . . . . MOV #A+B-<G1/G2&^C<177120!G3>>,R1
Формат типа команды представлен на рис. 28.
Смещение |
B |
17 |
|
Сложная строка |
|||
12 |
Рис. 28
3.5. БЛОК ENDMOD
Каждый объектный модуль должен заканчиваться блоком ENDMOD (блок конца модуля). Блок ENDMOD имеет одно слово данных, которое содержит код идентификатора типа блока (код ИТБ=6).
4. ФОРМАТ ФАЙЛА STB
Компоновщик в ОС БК-11 может создавать третьим выходным файлом - таблицу определения символов (STB). Файл STB содержит таблицу определения глобальных символов, например:
- если исходный файл содержит оператор "X == 10", то в файл STB записывается "X = 10", т.е. определение глобального символа X;
- если исходный файл содержит A = FOO, то в файл STB записывается абсолютное значение адреса FOO.
Можно использовать файл STB для создания средств связи между программой и символьным отладчиком.
Файл STB (рис. 29) содержит только блоки данных GSD, за которыми следуют блоки ENDGSD и ENDMOD.
Имя объектного модуля |
Идентификатор версии программы |
Имя контрольной секции |
Информация о глобальном символе |
. . . |
Информация о глобальном символе |
Блок ENDGSD |
Блок ENDMOD |
Рис. 29
5. ФОРМАТ БИБЛИОТЕЧНЫХ ФАЙЛОВ
В библиотеку включаются модули, которые часто используются в программах пользователей. Пользователь может включить в системную объектную библиотеку свой модуль, либо создать библиотеку с помощью команды LIBRARY и ключа CREATE.
Объектный модуль, включённый в библиотеку, перестаёт быть независимым. Модули объединяются и становятся частью библиотечной структуры.
При объединении модулей в библиотеку используется байтовый счётчик. Это связано с тем, что длина многих модулей, содержащих объектный код или символьную информацию, может оказаться равной нечётному числу байтов. Объединение таких модулей с использованием счётчика слов может привести к искажению информации (рис. 30), поэтому модули в библиотеках присоединяются байтами. Это означает, что модуль может начинаться с нечётного адреса. Если это имеет место, то компоновщик заменяет адрес модуля на чётный во время компоновки.
Два способа объединения модулей
|
Байты |
|
Слова |
|
Модуль 1 |
1 |
|
2 |
1 |
|
2 |
|
4 |
3 |
|
3 |
|
|
5 |
|
4 |
|
|
|
|
5 |
|
|
|
|
|
|
|
|
|
Байты |
|
Слова |
|
Модуль 2 |
1 |
|
2 |
1 |
|
2 |
|
4 |
3 |
|
3 |
|
|
5 |
|
4 |
|
|
|
|
5 |
|
|
|
Объединяемые модули (1 и 2).
|
Байты |
|
Слова |
|
Модуль1 |
1 |
Модуль 1 |
2 |
1 |
|
2 |
|
4 |
3 |
|
3 |
Модуль 2 |
1 |
5 |
|
4 |
|
3 |
2 |
|
5 |
|
5 |
4 |
Модуль 2 |
1 |
|
|
|
|
2 |
|
|
|
|
3 |
|
|
|
|
4 |
|
|
|
|
5 |
|
|
|
Рис. 30
Система поддерживает два типа библиотек: макробиблиотеку и объектную библиотеку. По умолчанию объектные библиотеки имеют тип файла OBJ, макробиблиотеки - MAC.
Библиотечный файл состоит из заголовка файла, затем идут каталог библиотеки, модули, включённые в библиотеку, и блок конца библиотечного файла (рис. 31).
Формат библиотечного файла
Заголовок |
Каталог |
Объектные модули |
Блок конца |
Рис. 31
В каталоге библиотечного файла имеется информация о всех модулях, находящихся в файле.
5.1. СТРУКТУРА МАКРОБИБЛИОТЕКИ
Заголовок библиотеки содержит информацию о самой библиотеке и различен для двух типов библиотек. Для макробиблиотеки он занимает один блок, неиспользуемые ячейки блока заполняются нулями. Структура заголовка макробиблиотеки представлена в табл. 2.
Все значения чисел представлены в восьмеричном виде. Дата и время, которые имеют стандартный формат в системе, являются датой и временем создания библиотеки.
Ячейка |
Значение |
Выполняемая функция |
---|---|---|
0 |
1001 |
Код идентификатора и типа |
2 |
310 |
Номер версии библиотеки |
4 |
0 |
Не используется |
6 |
|
Дата ( 0 - если нет ) |
10 |
|
Время создания |
12 |
|
|
14 |
0 |
Не используется |
. |
. |
Не используется |
32 |
10 |
Размер записей каталога |
34 |
|
Относительный номер блока начала каталога |
36 |
|
Максимальное число записей, которое может быть |
40 |
|
счётчик свободных записей в каталоге |
Ячейка 36 указывает максимальное количество записей, которые могут поместиться в каталоге. Это значение определяется при создании библиотеки с помощью программы LIBR и ключа /M:N. "N" по умолчанию берётся равным 200 (фактически длина каталога получается равной 2 блокам).
Для макробиблиотеки каталогом является таблица макроимён (MNT). Структура записи в каталоге одинакова для 2 типов библиотек и представлена на рис. 32. Бит 15 в 3-м слове записи используется только в объектной библиотеке.
|
Имя (два слова |
|
|
|
|
||
Номер блока относительно начала файла |
|||
Не используется |
Относительный байт |
Рис. 32
Каталог макробиблиотеки начинается с первого относительного блока библиотечного файла. В нулевом относительном блоке макробиблиотеки расположен её заголовок. Длина каталога определяется заранее, по умолчанию длина равна 2 блокам. Она может быть изменена ключом /M (программа LIBR). Неиспользуемые входы в каталог заполняются кодом 177777 (-1). Файлы макробиблиотеки заполняются, начиная с первого блока после каталога. Это относительный блок 3 библиотечного файла, если длина каталога определена по умолчанию.
5.2. СТРУКТУРА ОБЪЕКТНОЙ БИБЛИОТЕКИ
Структура заголовка объектной библиотеки отличается от структуры макробиблиотеки и представлена в табл. 3.
Ячейка |
Значение |
Выполняемая функция |
---|---|---|
0 |
1 |
Код заголовка блока библиотеки |
2 |
42 |
|
4 |
7 |
Код библиотеки |
6 |
310 |
Номер версии библиотеки |
10 |
0 |
Не используется |
12 |
|
Дата (0 - если отсутствует). |
14 |
|
Время создания в двух словах |
16 |
|
|
20 |
0 |
1, если библиотека создана с ключом /X |
. |
. |
Не используется |
26 |
10 |
Относительный адрес начала каталога |
30 |
|
Количество байтов отведённых под каталог |
32 |
0 |
Не используется |
34 |
|
Относительный номер первого незаполненного блока |
36 |
|
Первый свободный байт блока |
40 |
|
Начало каталога |
Дата создания библиотеки дана в формате системы.
Формат записи в каталоге объектной библиотеки такой же, как и для макробиблиотеки (см. рис. 32). Отличие заключается в том, что для объектных библиотек каталогом является таблица точек входа (EPT).
Следует помнить, что при включении имён модулей в объектную библиотеку с помощью ключа /N (программа LIBR), бит 15 слова "номер блока относительно начала файла" устанавливается в 1. Если же библиотека создана командой монитора LIBRARY, то имена модулей не включаются.
Каталог объектной библиотеки начинается непосредственно за заголовком (слово 40). Каталог имеет длину, достаточную для включения только определённого числа модулей в библиотеку. Неиспользуемые области в каталоге заполняются нулями.
5.3. ФОРМАТ БЛОКА КОНЦА БИБЛИОТЕКИ
Все библиотеки, описанные выше, имеют в конце специальный блок. Этот блок указывает на конец библиотечного файла, структура последнего блока представлена на рис. 33.
0 |
1 |
0 |
10 |
0 |
10 |
0 |
0 |
|
357 |
Рис. 33
Все старшие байты равны 0. Слова содержат следующую информацию:
Слово 1 |
- признак начала блока; |
Слово 2 |
- счётчик байтов в блоке; |
Слово 3 |
- код блока конца библиотеки; |
Слово 4 |
- не используется (равно 0); |
Слово 5 |
- используется только младший байт, который содержит контрольную сумму. |
6. ФОРМАТ ФАЙЛА SAV
Формат SAV используется для программ, которые будут работать в разделе пользователя. Этот формат содержит абсолютные адреса памяти.
В нулевом блоке файла находится информация, составленная компоновщиком для монитора. Остальные блоки содержат двоичные коды программы.
В ячейках нулевого блока файла находится следующая информация для монитора:
0 |
первые три символа (VIR) ключа VIRTUAL в коде RAD50; используется, если компоновка производилась с ключом /V (в ОС БК-11 не используется); |
2 |
верхний виртуальный адрес памяти, используемый программой; используется, если при компоновке в командной строке был указан ключ /V (в ОС БК-11 не используется); |
4-12 |
не используются; |
14, 16 |
вектор прерываний по инструкции BPT; устанавливается только, если при работе XM-монитора в командной строке компоновщика был указан ключ /R (в ОС БК-11 не используется); |
20, 22 |
вектор прерываний по инструкции IOT; устанавливается только, если при работе XM-монитора в командной строке компоновщика был указан ключ /R (в ОС БК-11 не используется); |
24-32 |
не используются; |
34, 36 |
вектор прерываний по инструкции TRAP; устанавливается, если при компоновке в командной строке был указан ключ /R; |
40 |
стартовый адрес программы; |
42 |
начальное значение указателя стека (изменяется ключом компоновщика /M); |
44 |
слово состояния программы (JSW); |
46 |
адрес загрузки USR (0 означает стандартное размещение); |
50 |
верхний адрес памяти, используемый программой; |
52-54 |
не используются; |
56 |
в TS-мониторе используется для указания размера требуемой для работы программы области в Ксловах (в ОС БК-11 не используется); |
60-64 |
не используются; |
66 |
адрес начала блоков определения окон (устанавливается, если был задан ключ компоновщика /V) (в ОС БК-11 не используется); |
70-356 |
не используются; |
360-377 |
карта загрузки программы в память. |
Ячейка 40, содержащая адрес запуска программы, может быть установлена при компоновке ключом /TRANSFER. Например, указать адрес запуска программы равным 2000 (восьмеричное):
.LINK PROGR.OBJ/TRANSFER:2000
Программа PROGR.SAV, создаваемая компоновщиком, будет запускаться с 2000 адреса. Обычно адрес запуска программы определяется из директивы .END.
Ячейки 360-377 в нулевом блоке файла используются компоновщиком для передачи информации о распределении памяти KMON. Каждый бит ячеек соответствует определённому блоку памяти из 256 слов и устанавливается в том случае, если программа занимает хотя бы одно слово в данном блоке памяти. Эта информация используется KMON для определения, будет ли пользовательская программа перекрывать KMON и USR.
При загрузке нулевого блока в KMON производится проверка ячеек блока относительно битовой схемы защиты системы, которая содержится в RMON. В ячейки, которые защищены в схеме, такие, как например, векторы устройств системы, запись информации из нулевого блока не производится.
Команды монитора R и RUN служат для загрузки и запуска программ типа SAV. Команда RUN объединяет две команды: GET и START. При выполнении этой команды KMON считывает нулевой блок файла типа SAV во внутренний буфер USR, выбирает информацию из ячеек 40-62 и 360-377. Сравнивая битовую защиту памяти (LOWMAP), находящуюся в RMON, с ячейками в нулевом блоке, KMON загружает в память (в соответствующую область RMON) из буфера USR те ячейки, которые не защищены. Например, векторы прерываний устройств, драйверы которых включены в системные таблицы RMON, не будут изменены. Затем KMON устанавливает в ячейку 50 верхний адрес используемой памяти или верхний адрес программы, каким бы большим он ни был.
При выполнении команды RUN или GET KMON проверяет возможность перекрытия его загружаемой программой. Если это имеет место, то KMON пересылает перекрывающие блоки программы в файл свопинга SWAP.SYS. После выполнения всех необходимых операций KMON, перед передачей управления RMON, производит считывание в память тех блоков программы, которые были записаны в файл SWAP.SYS и обменивались с блоками KMON и, возможно, USR.
В случае выполнения команды R, KMON не выбирает карту загрузки для просмотра, какие блоки файла должны загружаться. Вместо этого он обращается к RMON и считывает всю информацию в память свыше 1000 адреса (команда R не использует файл SWAP.SYS), монитор считает, что KMON и USR были уже выгружены, и начинает выполнение программы.
7. ФОРМАТ ФАЙЛА ПЕРЕКРЁСТНЫХ ССЫЛОК
Программа CREF создаёт листинг таблицы перекрёстных ссылок. Она может быть вызвана только по цепочке (макрокомандой .CHAIN) из другой программы (такой, например, как собственный языковый процессор пользователя). CREF добавляет распечатку таблицы перекрёстных ссылок к файлу листинга, созданному вызывающей программой.
До вызова CREF по цепочке необходимо заполнить определённые ячейки области сохранения данных в вызывающей программе специальной информацией (ячейки памяти с абсолютными адресами от 500 до 776). CREF требует следующую информацию:
500 |
.RAD50 /SY / |
Спецификация файла для вызова CREF; |
502 |
.RAD50 /CRE/ |
|
504 |
.RAD50 /F / |
|
506 |
.RAD50 /SAV/ |
|
510 |
Номер канала выходного файла; |
|
512 |
Имя выходного устройства в коде .RAD50; |
|
514 |
Номер старшего записанного блока плюс 1 (выходного файла); |
|
516 |
Номер канала входного файла; |
|
520 |
Имя входного устройства в коде .RAD50; |
|
524 |
Формат распечатки: |
0-80 позиций; |
526 |
.RAD50 /DEV/ |
Программа, которой CREF возвращает управление по цепочке; если задано значение 0, то CREF закрывает файл листинга и передаёт управление монитору; |
530 |
.RAD50 /FIL/ |
|
532 |
.RAD50 /NAM/ |
|
534 |
.RAD50 /TYP/ |
|
536-776 |
Строка кодов КОИ-7, используемая CREF как заголовок страницы распечатки (без номера страницы). |
Входной файл, создаваемый CREF, должен содержать 12-байтовые (десятичное) записи для каждой ссылки на символ. Запись для входного файла CREF имеет следующий формат (смещение в байтах дано в восьмеричном виде):
0 |
Описатель секции таблицы: |
||||
|
|
||||
1-6 |
Имя символа в КОИ-7; |
||||
7-10 |
Номер страницы (двоичное); если номер страницы не используется, то должно содержать -1; |
||||
11-12 |
Номер строки (двоичное); |
||||
13 |
Односимвольный идентификатор, выводимый CREF после этой ссылки; обычно этот знак используется для указания точки определения или для разрушающей предыдущее значение ссылки. |
8. СТРУКТУРА УСТРОЙСТВА ПРЯМОГО ДОСТУПА
Компоненты операционной системы и программы пользователей расположены на носителе устройства прямого доступа в виде файлов.
Файлы на носителях располагаются в физических блоках, длина физического блока зависит от устройства. Существует понятие логический блок, длина которого для всех устройств одинакова и равна 512 байтам. Для установления соответствия между устройствами, имеющими физические блоки разной длины, при обмене информацией данные передаются логическими блоками по 512 байтов.
В нулевом и со 2 по 5 блоках носителя содержится системный загрузчик. Блок номер 1 является блоком информации системы.
Информация о каждом имеющемся на носителе файле (имя, тип файла, его местоположение на носителе и т.д.) содержится в таблице, которая называется каталогом файлов. На каждом физическом носителе имеется один каталог файлов.
На рис. 34 показана структура устройства прямого доступа.
Рис. 34
8.1. БЛОК ИНФОРМАЦИИ СИСТЕМЫ
Блок номер 1 на устройстве прямого доступа является блоком информации системы и содержит данные о носителе (табл. 4). Содержимое неотмеченных областей не определено и резервируется для использования в следующих версиях ОС БК-11.
Ячейка |
Содержимое |
Значение поля (по умолчанию |
---|---|---|
000-201 |
Таблица замещения дефектных блоков на носителе |
|
204-251 |
Область данных для команд INITIALIZE/RESTORE |
|
700-701 |
Резервируется |
000000 (в восьмеричном виде) |
702-703 |
Номер блока первого файла пользователя (резервируется) |
000000 (в восьмеричном виде) |
722-723 |
|
000001 (в восьмеричном виде) |
724-725 |
Номер блока первого сегмента каталога |
000006 (в восьмеричном виде) |
726-727 |
Версия системы |
B10SJ (в коде RAD50) |
730-743 |
Идентификатор тома |
ОС БК-11 и 3 пробела |
744-757 |
Принадлежность (имя владельца) |
|
760-773 |
Идентификация системы |
ОС БК-11 и 4 пробела |
776-777 |
Контрольная сумма |
|
При вычислении контрольной суммы содержимое всех байтов суммируется в слове, у которого затем меняется знак.
При инициализации носителя по команде монитора INITIALIZE можно указать идентификатор носителя с помощью ключа /VOLUMEID. Запись состоит из имени тома (длиной от 1 до 12 символов) и имени владельца (от 1 до 12 символов).
Например, для создания каталога на устройстве BY1: и идентификации устройства необходимо задать следующую команду:
.INITIALIZE/VOLUMEID BY1: BY1:/INIT ARE YOU SURE?Y VOL ID? #1980 OWNER NAME? SIMFOR
Эта информация записывается на носитель с помощью программы DUP. Распечатать идентификатор носителя можно с помощью программы DUP или DIR.
8.2. КАТАЛОГ ФАЙЛОВ
Каталог содержит информацию о файлах ка носителе и разбит на сегменты. Размер каталога может быть от 1 до 31 сегмента. Сегмент состоит из двух логических блоков.
При создании каталога с помощью команды монитора INITIALIZE и ключа /SEGMENT:N можно задать любое количество сегментов N в допустимых пределах. Для задания нестандартного количества сегментов каталога можно воспользоваться программой DUP.
По умолчанию система устанавливает следующие значения аргумента N для различных типов устройств прямого доступа (табл. 5). Размеры содержат десятичные значения.
Устройство |
Размер каталога в сегментах |
Размер физического блока в словах |
---|---|---|
BY: |
4 |
64 |
RK: |
16 |
256 |
RF: |
4 |
64 |
DP: |
31 |
256 |
DX: |
4 |
64 |
8.2.1. ФОРМАТ ЗАГОЛОВКА СЕГМЕНТА КАТАЛОГА
Каждый сегмент каталога имеет заголовок, состоящий из пяти слов. Заголовок содержит информацию о количестве заполненных сегментов каталога, связи сегментов друг с другом, номере блока, с которого начинаются файлы, описанные в данном сегменте. Остальные 507 слов в сегменте используются для записей о файлах.
Заголовок сегмента содержит следующую информацию:
1 слово |
Число сегментов, отведённых под каталог; это значение может быть задано при создании каталога с помощью программы DUP или взято по умолчанию; |
2 слово |
Номер следующего логического сегмента каталога; каталог представляет собой связанный список; это слово является связующим между логически смежными (последовательными) сегментами; в последнем используемом сегменте 2-е слово содержит нуль; |
3 слово |
Счётчик сегментов, имеющих записи; при открытии нового сегмента счётчик корректируется только в первом сегменте; в последующих сегментах содержимое этого слова не изменяется; |
4 слово |
Число дополнительных байтов в записи о файле в каталоге; оно может быть определено при инициализации устройства с помощью программы DUP; |
5 слово |
Номер блока, с которого начинаются файлы, описанные в данном сегменте. |
8.2.2. ФОРМАТ ЗАПИСИ О ФАЙЛЕ В КАТАЛОГЕ
Первые пять слов каждого сегмента каталога содержат информацию о структуре каталога. Остальная часть сегмента заполняется записями о файлах. Записи содержат всю необходимую информацию о файлах, расположенных на носителе. Структура записи представлена на рис. 34.5.
Вид файла |
Не использ. |
Слово состояния файла |
||
|
Имя файла |
|
|
|
|
|
|
||
Тип файла (код RAD50) |
|
|||
Длина файла в блоках |
|
|||
№ задания (линии) |
№ канала |
|
||
Дата создания |
|
|||
Дополнительные слова |
Системой не обслуживаются |
Рис. 34.5
8.2.2.1. СЛОВО СОСТОЯНИЯ ФАЙЛА
Слово состояния файла содержит следующую информацию:
младший байт - |
не используется; |
старший байт - |
указывает вид файла. |
В системе имеется пять видов файлов, которые приводятся в табл. 6 (даны восьмеричные значения кода вида файла):
Временный |
Файл, созданный по макрокоманде .ENTER. Если после использования файл не был закрыт по макрокоманде .CLOSE, то он воспринимается системой как пустой (<UNUSED>); |
Пустой |
Файл на диске, который не был закрыт по макрокоманде .CLOSE. Используется системой при создании новых файлов; информация о пустом файле, кроме его длины, не используется (имя, тип, дата и т.д.). Программа DIR распечатывает эту запись как <UNUSED>, за которой следует длина свободной области. Несколько последовательно расположенных пустых файлов распечатываются программой DIR как один <UNUSED>; |
Постоянный |
Файл, который был закрыт по макрокоманде .CLOSE. Имя постоянного файла является единственным для каждого каталога, т.е. не могут существовать два файла с одинаковым именем и типом. Если создаётся новый файл с такими же атрибутами, как и уже существующий постоянный файл, то в этом случае существующий файл стирается при выполнении макрокоманды .CLOSE; |
Постоянный |
Файл, который нельзя стереть командой DELETE; операция защиты файла выполняется по команде монитора RENAME с ключом /PROTECTION или с помощью программы PIP и комбинации ключей /F/R; |
Маркер конца |
Система использует этот маркер для определения конца данных в сегменте каталога во время поиска необходимой записи. |
Вид файла |
Слово состояния файла |
---|---|
Временный |
400 |
Пустой |
1000 |
Постоянный |
2000 |
Постоянный защищённый |
102000 |
Маркер конца сегмента |
4000 |
8.2.2.2. ИМЯ И ТИП ФАЙЛА
Три слова содержат символьное имя и тип в коде RAD50, которые присвоены файлу. Символьное имя может содержать от 1 до 6 символов» а тип файла - от 1 до 3 символов.
8.2.2.3. ДЛИНА ФАЙЛА
Длина файла равна количеству логических блоков, занимаемых им. При попытке выполнить чтение или запись за пределами файла системой выдаётся сообщение об ошибке.
8.2.2.4. НОМЕР КАНАЛА
Эта информация необходима системе только при работе с временным файлом, для постоянного файла эта информация не используется.
При работе SJ-монитора старший байт 6-го слова не используется; данные о номере канала, по которому был открыт файл, записываются в младший байт; это позволяет монитору по макрокоманде .CLOSE найти нужный временный файл и сделать его постоянным.
Примечание. Необходимо помнить, что шестое слово используется только при работе с временными файлами. Если файл становится постоянным, то шестое слово не используется, так как имя постоянного файла является единственным для данного каталога.
8.2.2.5. ДАТА
При создании временного файла по макрокоманде .ENTER текущая системная дата помещается в седьмое слово записи о данном файле (рис. 35).
15 |
14 |
|
10 |
9 |
|
5 |
4 |
|
0 |
|
Месяц |
День |
Год |
Год (разряды 0-4) |
Информация о текущем годе в виде разности между двумя последними цифрами текущего года (например, 84) и константой равной 72; |
День (разряды 5-9) |
число с 1 по 31; |
Месяц (разряды 10-14) |
число с 1 по 12. |
Рис. 35
Примечание. Если системная дата не установлена, в седьмом слове записывается 0.
8.2.2.6. ДОПОЛНИТЕЛЬНЫЕ СЛОВА
Система не использует информацию, записанную в дополнительных словах записи о файле. При необходимости пользователь должен написать собственную программу обработки дополнительных слов.
В системе предусмотрена возможность при создании каталога программой DUP или командой INITIALIZE указать количество дополнительных слов в записи о файле. По умолчанию дополнительные слова не отводятся.
Дополнительные слова могут использоваться для защиты файла. Они могут содержать информацию о владельце файла и методе доступа к информации, находящейся в файле (например, только читать, читать и писать, только писать).
8.3. РАЗМЕР И КОЛИЧЕСТВО ФАЙЛОВ, РАЗМЕЩЁННЫХ НА НОСИТЕЛЕ
Любое внешнее устройство, обслуживаемое системой, не может иметь больше 31 сегмента в каталоге.
Количество файлов, которое может быть размещено на носителе, зависит от числа сегментов в каталоге и дополнительных слов в записи.
Максимальное число записей (MAX), которые могут быть размешены в каталоге, рассчитывается по формуле:
|
|
MAX = 31 * S |
(4.1) |
где |
S |
- вычисляется по следующей формуле: |
|
|
|
(512-5) S = ----------- - 2 (7 + М) |
(4.2) |
где |
М |
- число дополнительных слов в записи; |
|
|
512 |
- размер сегмента в словах; |
|
|
5 |
- число слов, отводимых под заголовок сегмента. |
|
В формуле (4.2) корректировка на "-2" необходима для каждого сегмента по двум причинам: для того, чтобы создать файл, запись о временном файле должна быть размещена вместо записи о свободной области (<UNUSED>) и должна быть создана запись о конце сегмента (маркер конца сегмента).
Если файлы расположены последовательно друг за другом и нет пустых файлов, то приблизительно половина всех записей будет находиться на устройстве перед появлением сообщения о переполнении каталога. Эта ситуация возникает из-за алгоритма заполнения сегментов каталога.
Если сегмент каталога полностью заполнен и необходимо открыть новый сегмент, то приблизительно половина записей заполненного сегмента переписывается во вновь открытый сегмент. Таким образом, если последний сегмент заполнен, то все предыдущие сегменты заполнены приблизительно наполовину.
Максимальное число записей может быть получено только после выполнения операции "сборка мусора" на носителе. Эта операция выполняется с помощью ключа /S программы DUP или команды монитора SQUEEZE.
Если была проведена "сборка мусора", то максимальное число записей может быть вычислено по формуле (4.3):
|
S МАХ = (N - 1) * --- + S 2 |
(4.3) |
|
где |
N |
- число сегментов, отведённых под каталог. |
|
Формула (4.3) учитывает специфику заполнение сегментов записями. Такой алгоритм заполнения позволяет восстанавливать "потерянные" файлы. Временные файлы, которые по какой-либо причине (сбой системы или программы) не были закрыты, могут быть восстановлены программой DUP.
8.4. АЛГОРИТМ ЗАПОЛНЕНИЯ СЕГМЕНТОВ ЗАПИСЯМИ
Описание заполнения сегментов записями имеет следующие обозначения:
Каталог начинается с записей, которыми заполняется сегмент 1:
По мере добавления записей сегмент 1 заполняется:
Если сегмент заполнен и необходимо добавить новую запись в каталог, то система должна открыть другой сегмент каталога. Если имеется свободный сегмент в каталоге, то производятся следующие действия:
- вторая половина записей из заполненного сегмента переписывается в следующий открытый сегмент и заполняется заголовок этого сегмента;
- скорректированный сегмент переписывается на диск;
- корректируются связи сегментов каталога;
- запись о файле будет помещена или в скорректированный, или в новый открытый сегмент (это зависит от того, в каком сегменте имеется запись о пустом файле требуемого размера).
При попытке записать новую запись в полностью заполненный последний сегмент каталога выдаётся сообщение об ошибке (переполнение каталога).
Обычно сегмент заполняется следующим образом:
Если было открыто много файлов, то они заполняют весь 2-й сегмент и переписываются в 3-й, если он доступен:
В этом случае сегменты являются смежными (последовательными). Сегменты могут быть и несмежными.
Например, если стирается большой файл из сегмента 2 и открывается много небольших файлов, то в этом случае может возникнуть необходимость снова скорректировать сегмент 2.
Если это происходит и открывается 4-й сегмент, то связи в каталоге будут иметь следующий вид:
8.4.1. ВОССТАНОВЛЕНИЕ ДАННЫХ В СЛУЧАЕ ПОЯВЛЕНИЯ ДЕФЕКТНЫХ БЛОКОВ В КАТАЛОГЕ
Значительная потеря данных, находящихся на носителе, происходит, если один из блоков в каталоге носителя портится: перестаёт правильно считываться аппаратурой или на это место какая-либо программа пользователя произвела запись произвольной информации. Обычно в ситуациях, подобных указанным, файлы и информация на носителе не изменяются, но разрушаются некоторые записи в каталоге. Ниже приведены рекомендации, следуя которым можно извлечь как можно больше информаций с носителя, имеющего дефектные блоки в каталоге.
8.4.1.1. ПРОВЕРКА СЕГМЕНТА 1
Первым шагом восстановления данных является проверка, читаются ли записи первого сегмента каталога. Следует помнить, что сегмент 1 занимает блоки 6 и 7 носителя. Для проверки первого сегмента необходимо установить носитель на устройство и попытаться сделать обычную распечатку каталога Файлов этого носителя для этого достаточно использовать команду монитора DIRECTORY без каких-либо ключей.
Если немедленно будет получено сообщение:
?MON-F-DIRECTORY I/O ERROR или ?MON-F-DIR I/O ERR, ; ОШИБКА ЧТЕНИЯ КАТАЛОГА
то первый сегмент каталога не читается. В данной ситуации имеются только два варианта работы.
В первом случае производится переформатирование и повторная инициализация носителя (носитель можно повторно использовать, если проверка на наличие дефектных блоков покажет отсутствие их в области каталога). При этом данные полностью теряются.
Во втором случае, если данные необходимо восстановить, носитель может быть открыт с помощью системной программы TECO, как устройство с нефайловой структурой, и просмотрен поблочно в поисках данных, соответствующих исходному тексту в коде КОИ-7. Однако это является очень трудоёмкой процедурой.
С другой стороны, если по команде DIRECTORY распечатывается хотя бы часть каталога, то можно восстановить определённую часть информации, находящейся на носителе. Необходимо использовать команду монитора DIRECTORY/SUMMARY, которая распечатает структуру связи сегментов в каталоге до дефектного сегмента. Для восстановления максимально возможного числа файлов необходимо восстановить структуру связи сегментов, исключив из неё дефектный сегмент.
8.4.1.2. ОПРЕДЕЛЕНИЕ СТРУКТУРЫ СВЯЗИ СЕГМЕНТОВ
Носитель необходимо открыть при помощи программы SIPP как устройство с нефайловой структурой. Просмотр начинается с ячейки 6000, с которой начинается заголовок первого сегмента каталога. Эта ячейка содержит общее число сегментов, отведённых под каталог. Ячейка 6002 содержит номер следующего сегмента, а ячейка 6004 - номер последнего сегмента, содержащего записи.
Для получения абсолютного адреса ячейки следующего сегмента необходимо содержимое слова (указатель на следующий сегмент) умножить на 2000 и прибавить к 4000. Например, если указатель равен 2, то следующий сегмент начинается с ячейки 10000 носителя. Эта цепочка может быть продолжена при использовании содержимого указателей в цепочке сегментов. В процессе просмотра следует записывать информацию о связи, например, в виде, показанном на рис. 36.
Запись цепочки списка сегментов каталога, содержащего четыре сегмента.
Сегмент: |
Связан с: |
||||
1 |
2 |
||||
2 |
4 |
||||
4 |
3 |
(дефектный) |
|||
3 |
(дефектный) |
? |
Рис. 36
На рис. 36 последний используемый сегмент - 4: число сегментов, отведённых под каталог - 4.
Перемещение по цепочке продолжается до её конца, т.е. пока не будут пройдены все сегменты. Следует помнить, что сегмент 1 всегда является первым сегментом в цепочке. Последний сегмент в цепочке содержит указатель, равный 0.
В примере (см. рис. 36) указатель сегмента 3 должен быть равен 0, т.к. это последний в цепочке сегмент из четырёх используемых. Для восстановления такого каталога необходимо модифицировать значение указателя сегмента 4, чтобы оно было равно 0, а не 3. Эта коррекция позволит удалить сегмент 3 из цепочки. Способ извлечения файлов с такого носителя описан ниже.
На рис. 37 приведён более сложный пример. В этом случае дефектный сегмент не является последним сегментом каталога.
Запись цепочки каталога из 9 сегментов
Сегмент: |
Связан с: |
||||
1 |
2 |
||||
2 |
5 |
||||
5 |
4 |
||||
4 |
8 |
||||
8 |
7 |
(дефектный) |
|||
7 |
(дефектный) |
? |
|||
3 |
0 |
||||
6 |
9 |
||||
9 |
3 |
Рис. 37
В этой ситуации (см. рис. 37) по цепочке можно перемещаться от сегмента 1 до сегмента 8, который указывает на дефектный сегмент 7. Нет информации, на какой сегмент указывает сегмент 7. В данном случае необходимо скорректировать указатель в сегменте 8. Для определения номера сегмента нужно просмотреть записи, расположенные ниже дефектного блока, и найти последний сегмент в цепочке (указатель должен быть равен 0). Таким сегментом является сегмент 3, на который указывает сегмент 9. На сегмент 9 указывает сегмент 6. Таким образом, движение по цепочке сверху обрывается на 8 сегменте (далее идёт дефектный сегмент). Движение снизу по цепочке обрывается на 6 сегменте. Следовательно, 8-й сегмент должен указывать на 6-й (рис. 38).
Рис. 38
8.4.1.3. ПОЛУЧЕНИЕ ДАННЫХ ИЗ СЕГМЕНТОВ, НЕ СОДЕРЖАЩИХ ДЕФЕКТНЫЕ БЛОКИ
После исключения дефектного сегмента (сегментов) из списка при помощи коррекции указателей, можно производить сохранение файлов, записи о которых находятся в сегментах, не содержащих дефектные блоки. Для перезаписи файлов на другой носитель используется команда монитора COPY. Следующая команда, например, копирует все файлы с одного гибкого диска на другой:
COPY BY0:*.* BY1:
Эта процедура переписывает с носителя все файлы, кроме тех, записи о которых находятся в дефектном сегменте.
8.4.1.4. ПОЛУЧЕНИЕ ДАННЫХ ИЗ СЕГМЕНТА С ДЕФЕКТНЫМИ БЛОКАМИ
В некоторых случаях существует возможность восстановить файлы, записи о которых находятся в сегменте с дефектными блоками, при помощи программ SIPP и DUP. Если при открытии сегмента при помощи SIPP первый блок сегмента не читается, необходима особая осторожность, т.к. даже если второй блок сегмента читается нормально, существует вероятность, что он содержит устаревшие данные.
Если первый блок сегмента читается нормально, заголовок сегмента и записи о файлах декодируются в соответствии с листингом распечатки каталога. Продолжая работу с SIPP, следует попытаться определить размещение файлов на носителе. Как только определён начальный и конечный блок требуемого файла, следует вызвать программу DUP и использовать командную строку следующего формата:
*OUTDEV:FILE=INPDEV:/G:START/E:ENDBLK/I/F
которая перепишет файл с устройства INPDEV, начинающийся с блока START, на устройство OUTDEV в указанный файл с именем FILE. Для получения того же результата может быть использована следующая команда монитора ОС БК-11:
COPY/DEV/FIL/STA:START/END:ENDBLK INPDEV: OUTDEV:FILE
После восстановления файлов с носителя, его можно вернуть пользователям или можно переформатировать и инициализировать носитель (если в каталоге были дефектные блоки). Если после форматирования останутся дефектные блоки в зоне каталога, этот носитель следует пометить как негодный к использованию в ОС БК-11.
8.5. СОЗДАНИЕ И РАЗМЕЩЕНИЕ ФАЙЛОВ В СИСТЕМЕ
Все файлы системы размещаются в блоках, которые следуют друг за другом на устройстве. При создании файла под управлением ОС БК-11 его длина должна быть задана в макрокоманде .ENTER. Если длина заранее не известна, как часто бывает, то она выбирается достаточно большой для того, чтобы можно было разместить все необходимые данные.
Существует три варианта использования макрокоманды .ENTER. Если аргумент "длина" равен 0, то для создаваемого временного файла отводится или половина самого большого свободного пространства <UNUSED>, или полностью второй по величине <UNUSED> (каким бы большим он ни был). Если аргумент равен "-1", то выбирается самый большой <UNUSED>, имеющийся на устройстве. И если аргумент больше 0, то это указывает конкретный размер временного файла.
Временный файл всегда располагается в свободной области.
На рис. 39 показан временный файл, заданная длина которого равна 100 блокам.
Создание временного файла
Файл |
Временный файл |
<UNUSED> |
Файл |
Рис. 39
При работе двух программ допускается создание каждой программой временного файла. Например, одна программа создала временный файл, длиной 100 блоков, другая создаёт временный файл, длиной в 25 блоков (рис. 40).
Файл |
Временный файл |
<UNUSED> |
Временный файл |
<UNUSED> |
Файл |
Рис. 40
Если программа заканчивает запись данных на устройство, она закрывает временный файл по макрокоманде .CLOSE. Временный файл становится постоянным. Его длина будет определена по максимальному номеру блока, записанного в этот файл. На рис. 41 показано распределение файлов после закрытия обоих временных файлов. Длина первого файла - 75 блоков, второго - 10 блоков.
Файл |
Постоянный файл |
<UNUSED> |
Постоянный файл |
<UNUSED> |
Файл |
Рис. 41
Если необходимо увеличить размер существующего файла, нужно открыть новый файл требуемого размера и затем записать в него старый файл и новые данные. Если при этом необходимо удалить старый файл, то удобнее создаваемый временный файл назвать тем же именем. В этом случае старый файл будет удалён при выполнении макрокоманды .CLOSE.
Программа DUP с помощью ключа /T позволяет создавать файл необходимой длины при условии наличия свободной области достаточного размера.
8.6. МНОГОТОМНАЯ ФАЙЛОВАЯ СТРУКТУРА
В системе существует возможность создания виртуальных носителей (логических дисков) на устройстве прямого доступа. Каждый из виртуальных носителей может использоваться одним или группой пользователей. Виртуальный носитель имеет свой каталог файлов.
Использование виртуальных носителей позволяет:
- осуществить защиту от неумышленной попытки повредить файлы другого пользователя (при создании или переименований файлов, а также при операциях стирания или записи с одного устройства на другое);
- содержать нескольким пользователям свои файлы независимо друг от друга;
- сократить в большинстве случаев время поиска файла в каталоге.
Виртуальный носитель (логический диск) - это обычный файл с точки зрения логической организации файлов на диске. С точки зрения системы - это носитель. Таким образом, на диске появляются файлы, которые имеют сложную внутреннюю структуру. Применение виртуальных носителей позволяет создавать файловую структуру, имеющую два и более уровней иерархии.
Виртуальный носитель имеет свой каталог и содержит только файлы данного пользователя или пользователей, сама система, прикладные системные программы расположены на общем диске. Пользователи, по какой-либо причине отказавшиеся от собственного виртуального носителя, хранят свои файлы также, как и системные. На рис. 42 представлена структура диска, имеющего простую (обычную) структуру и содержащего виртуальные файловые носители.
Структура диска с виртуальными носителями
Рис. 42
8.6.1. РАБОТА С ВИРТУАЛЬНЫМИ НОСИТЕЛЯМИ В SJ-МОНИТОРЕ
8.6.1.1. ДРАЙВЕР ВИРТУАЛЬНОГО ФАЙЛОВОГО НОСИТЕЛЯ
ОС БК-11 имеет три типа драйверов для обслуживания виртуальных носителей UX:, UY:, UZ:. Драйверы отличаются друг от друга только размером виртуального носителя, который они обслуживают. Размер виртуального носителя можно изменять либо при генерации, либо командой монитора SET (например, SET UX=320). Ниже даны размеры виртуальных носителей, которые устанавливаются по умолчанию:
UX |
- драйвер, обслуживающий виртуальный носитель длиной в 280 блоков; |
UY |
- 546 блоков; |
UZ |
- 1100 блоков. |
Каждый из драйверов может обслуживать до восьми виртуальных носителей (например, от UX0 до UX7).
8.6.1.2. РАБОТА С ВИРТУАЛЬНЫМИ НОСИТЕЛЯМИ (ЛОГИЧЕСКИМИ ДИСКАМИ) В SJ-МОНИТОРЕ
Процедура создания виртуального носителя следующая: по команде CREATE на физическом диске создаётся файл, размер которого указывается ключом /ALL:N. После этого необходимо выполнить команду MOUNT для объявления файла виртуальным носителем. После выполнения команды INITIALIZE. Устройство готово к работе.
Например, по следующему набору команд создаётся файл длиной в 100 блоков на устройстве BY0: и объявляется виртуальным носителем F:.
.CREATE BY0:DISK.DSK/ALL:100 .MOUNT LD0: BY0:DISK F:
Если необходимо только читать из виртуального носителя, то можно указать в команде MOUNT ключ /NOWRITE.
Размер каталога виртуального носителя задаётся при инициализации и зависит от размера создаваемого виртуального носителя. При инициализации можно указать требуемое количество сегментов:
.INITIALIZE/SEGMENT:N F: F:/INIT ARE YOU SURE?Y
по этой команде на виртуальном носителе F: создаётся каталог из N сегментов.
Примечание. Необходимо помнить, что после выполнения команды SQUEEZE (сжатие информации на носителе) или повторной загрузки системы нужно заново произвести объявление необходимого файла виртуальным носителем.
9. СТРУКТУРА УСТРОЙСТВА ПОСЛЕДОВАТЕЛЬНОГО ДОСТУПА
В отличие от носителей устройств прямого доступа носители устройства последовательного доступа не имеют каталога. Каждый файл на таком носителе, кроме данных, включает информацию о самом файле (заголовок файла). При поиске файла производится просмотр всех файлов, находящихся перед ним, к таким устройствам относятся магнитные кассеты.
9.1. СТРУКТУРА КАССЕТНОГО ФАЙЛА
Обычно кассетные файлы имеют данные, которые записаны блоками по 128 байтов. Служебная информация записывается в блоки длиной 32 байта.
Стандартные обозначения:
- Начальный участок ленты
- Чистая часть ленты в начале кассеты с лентой;
- Расширенный промежуток
- Блок, отделяющий начальный участок ленты от метки первого файла;
- Метка файла
- Блок, который содержит заголовок файла;
- Метка конца файла
- Блок, который отличается от метки файла тем, что первый байт равен нулю;
- Межблочный промежуток
- Блок, служащий границей между блоками данных;
- Межфайловый промежуток
- Блок, отделяющий конец предыдущего файла от начала следующего;
- Маркер конца ленты
- Блок, указывающий на физический конец ленты; используется если файл расположен на двух лентах (в двух томах).
После инициализации кассетный файл имеет формат, представленный на рис. 43.
Начальный участок ленты. |
Расширенный |
Метка файла |
Остаточная |
. |
\/\/\/\/\/\/\/\/ |
Рис. 43
После записи файла информация на кассете будет расположена следующим образом (рис. 44).
Начальный участок ленты |
Расширенный |
Метка файла |
Межблочный |
Блок данных |
Межблочный |
. |
Блок данных |
Метка конца |
Рис. 44
Обычно в конце файла, который, расположен на одной ленте, стоит метка конца файла (см. рис. 44). В случае, когда файл располагается на двух лентах, в конце первой ленты записывается маркер конца ленты (рис. 45).
. |
Межблочный |
Блок данных |
Межблочный |
Частично |
. |
Маркер конца |
Рис. 45
Примечание, если перед маркером конца ленты будет находиться частично записанный блок, то этот блок должен быть первым блоком следующего тома при использовании нескольких томов.
Формат метки файла представлен в табл. 7.
Позиция поля |
Имя поля |
Длина поля байты |
Значение поля (по умолчанию записывается в коде КОИ-7) |
---|---|---|---|
1-9 |
ID файла |
9 |
Имя и тип |
10 |
Тип данных |
1 |
0 |
11-12 |
Длина блока данных |
2 |
200 (восьмеричное) |
13 |
Порядковый номер файла |
1 |
0 для файла одного тома или файла 1-ого тома (если имеется несколько томов; номер следующего файла увеличивается на 1 |
14 |
Уровень |
1 |
1 |
15-20 |
Дата создания |
6 |
0 или пробел, если дата отсутствует |
21-22 |
|
2 |
0 |
23 |
Атрибут записи |
1 |
0 - для кассеты |
24-29 |
Не используется |
6 |
Резерв для системы |
30-32 |
Не используется |
3 |
Резерв для пользователя |
Если имеется дата создания, то она записывается в коде КОИ-7 в следующем виде:
- день (01-31);
- месяц (01-12);
- две последние цифры - разница между текущим годом и 1972.
Длина блока данных (позиции 11-12) зависит от аппаратуры. Первый байт указывает нижний предел длины (0), второй байт - верхний предел длины (200).