Ну вроде дозрел до создания отдельной темы по RTEM. Выложу сюда все, что на данный момент выкопано (напомню, в активе имелся весьма урезанный вариант RTEM/VAX V1.0 в виде собранной задачи и shared образ в котором не было ничего кроме RT-11 V4.0C для RTEM, DUP.SAV (адаптированного для RTEM), FIP.SAV, JOAT.SAV и драйвера VS.SYS. Остальных драйверов, увы, не было.
С тех пор RTEM.TSK неоднократно патчился для некоторого приведения в порядок (поддержка Y2K дат, передача RTEM флагов в RT-11 V5 про которые он не знал, замена расширений файлов диска на DSK с SYS [как это должно быть в RTEM V2]). Также был пропатчен JOAT.SAV (расширение виртуальных дисков DSK, DU как допустимое устройство).
Здесь последний вариант RTEM.TSK и RT11SH.DSK с RT-11 V5.7 с поддержкой расширенных номеров устройств, а также драйверами DU: и RK: (не полнофункциональными, но достаточными для работы). DU собран для поддержки номеров устройств 0-17.
Скрытый текст
Код:
DIR .SAV 20P 31-Oct-1998 PIP .SAV 30P 31-Oct-1998
FIP .SAV 61P 16-May-2015 DUP .SAV 52P 27-Feb-2016
JOAT .SAV 52P 16-May-2015 RESORC.SAV 35P 31-Oct-1998
UCL .SAV 16P 31-Oct-1998 MACRO .SAV 63P 31-Oct-1998
LINK .SAV 59P 31-Oct-1998 LIBR .SAV 24P 31-Oct-1998
CREF .SAV 6P 31-Oct-1998 FORTRA.SAV 128P 23-Jul-2014
F77 .SAV 327P 23-Jul-2014 PASCAL.SAV 58P 04-Mar-2013
BASIC .SAV 52P 08-Oct-2015 BASPL .SAV 104P 02-Jun-2014
COBOL .SAV 194P 21-Mar-2014 CBLSML.SAV 194P 21-Mar-2014
CBLINK.SAV 47P 21-Mar-2014 CBLIBR.SAV 13P 21-Mar-2014
CLASS .SAV 51P 21-Mar-2014 ISAM .SAV 72P 21-Mar-2014
ISMBLD.SAV 56P 21-Mar-2014 CBR063.SAV 119P 21-Mar-2014
BATCH .SAV 26P 31-Oct-1998 KED .SAV 85P 31-Oct-1998
K52 .SAV 81P 20-May-2011 EDIT .SAV 19P 31-Oct-1998
TECO .SAV 50P 31-Oct-1998 HELP .SAV 161P 31-Oct-1998
FILEX .SAV 22P 31-Oct-1998 DUMP .SAV 10P 31-Oct-1998
BINCOM.SAV 25P 31-Oct-1998 SRCCOM.SAV 26P 31-Oct-1998
SIPP .SAV 21P 31-Oct-1998 SLP .SAV 13P 31-Oct-1998
PAT .SAV 11P 31-Oct-1998 MONMRG.SAV 14P 31-Oct-1998
BUP .SAV 68P 31-Oct-1998 QUEMAN.SAV 16P 31-Oct-1998
SETUP .SAV 43P 31-Oct-1998 LET .SAV 6P 31-Oct-1998
SPLIT .SAV 3P 31-Oct-1998 TERMID.SAV 4P 31-Oct-1998
TRANSF.SAV 16P 31-Oct-1998 MDUP .SAV 22P 31-Oct-1998
CONFIG.SAV 10P 31-Oct-1998 DBGSYM.SAV 10P 31-Oct-1998
INDEX .SAV 11P 31-Oct-1998 INDEXX.SAV 14P 31-Oct-1998
INDEXA.IMG 164P 31-Oct-1998 INDEXB.IMG 165P 31-Oct-1998
INDEX .IDX 7P 31-Oct-1998 SYS .SAV 3P 30-May-2011
DISASM.SAV 8P 31-Mar-2013 VDT .SAV 8P 09-Mar-2013
ECHO .SAV 2P 05-Mar-2016 ERA .SAV 1P 05-Mar-2016
CVT .SAV 7P 05-Mar-2016 TTSET .SAV 5P 10-Apr-2015
QUEUE .REL 14P 31-Oct-1998 RTMON .REL 8P 31-Oct-1998
SPOOL .REL 12P 31-Oct-1998 SYSMAC.SML 92P 31-Oct-1998
SYSTEM.MLB 148P 31-Oct-1998 ULBMAC.MLB 16P 24-Oct-1998
CBMAC .MAC 11P 21-Mar-2014 SYSLIB.OBJ 84P 31-Oct-1998
ULBLIB.OBJ 33P 24-Oct-1998 RSXLIB.OBJ 13P 04-Apr-2016
RSXLIB.MLB 6P 04-Apr-2016 PASCAL.OBJ 90P 04-Mar-2013
FORLIB.OBJ 205P 31-Dec-1982 F77OTS.OBJ 135P 22-Apr-2011
F77CVF.OBJ 4P 30-Apr-1984 F77NER.OBJ 1P 30-Apr-1984
F77MAP.OBJ 33P 30-Apr-1984 F77EIS.OBJ 3P 30-Apr-1984
F77RAN.OBJ 2P 30-Apr-1984 F77COM.MSG 14P 20-May-2011
VDT .OBJ 8P 31-Oct-1998 MBOOT .BOT 1P 31-Oct-1998
MBOT16.BOT 1P 31-Oct-1998 MSBOOT.BOT 4P 31-Oct-1998
MDUP .MM 72P 31-Oct-1998 MDUP .MS 72P 31-Oct-1998
MDUP .MT 72P 31-Oct-1998 MDUP .MU 72P 31-Oct-1998
CUSTOM.TXT 14P 31-Oct-1998 V5NOTE.TXT 36P 31-Oct-1998
RTEMFB.MAP 39P 06-Apr-2016 RTEMFB.CND 3P 06-Apr-2016
RTEMFB.SYS 108P 06-Apr-2016 SWAP .SYS 28P 06-Apr-2016
BAM .SYS 7P 06-Apr-2016 LDM .SYS 11P 06-Apr-2016
NLM .SYS 2P 06-Apr-2016 VSM .SYS 6P 01-Feb-2012
SLM .SYS 17P 22-Apr-2013 SDM .SYS 23P 30-Jan-2012
RKM .SYS 4P 15-May-2015 DUM .SYS 5P 06-Apr-2016
IND .SAV 58P 31-Oct-1998 UCL .DAT 9P 06-Apr-2016
[свернуть]
Немного общей информации. RTEM является программой, выполняющейся под RSX-11M, RSX-11M-PLUS, Micro/RSX, VAX/RSX под управлением которой грузится обычный RT-11. Программа устанавливает вектор SST и перехватывает все возможные варианты синхронных прерываний: trap to 4/10, mmu fault (отрабатывается как trap to 4), IOT, TRAP, BPT/T-bit, FP exception, non-RSX EMT. При возникновении SST эмулируется соответствующее прерывание. Таким образом программе под RTEM кроме обычного функционала RT-11 доступны директивы RSX-11. Также устанавливается AST на незапланированный ввод с терминала, эмулирующее прерывание от клавиатуры, а RMON патчится загрузчиком так, чтобы в тех местах где идет работа с железом или определенными сервисами обращение происходило к соответствующим подпрограммам RTEM. Для RT-11 V4 были отдельные исходники системы для RTEM. В RT-11 V5 загрузчик содержит весь необходимый код и включается при определении опции RTE$M=1.
Связь с RTEM из RT-11 устанавливается через RTEM link area - это вектор ссылок на подпрограммы и данные RTEM. Ссылка на link area надодится по адресу @#250 ($RTELK), адрес @#252 ($RTEID) при этом должен содержать значение 071645 (^RRTE).
Загрузка в RTEM возможна в двух вариантах:- загрузка с использованием shared и private образов (в этом случае shared образ открывается только для чтения, private образ открывается для чтения и записи, а для файлов shared образа начиная со SWAP.SYS и всех идущих за ним создается временный файл куда эти файлы копируются
- загрузка с физического диска с использованием специального драйвера RTEM, эмулирующего драйвер физического устройства (при этом диск может одновременно быть загрузочным диском RT-11 для обычной работы).
При загрузке RTEM читает первичный загрузчик из драйвера системного диска (VSM.SYS или соответствеющего устройства xxM.SYS), читает вторичный загрузчик из блоков 2-5 файла RTEMFB.SYS, устанавливает адрес подпрограммы чтения из первичного загрузчика и остальные данные для вторичного загрузчика (имя драйвера, номер устройства итд). Сам первичный загрузчик устройства RTEM должен только ругаться, что нельзя грузить RTEM на живой машине и останавливаться. В RTEM этот загрузчик не используется.
Смещения RTEM link area и имена которые использует BSTRAP.MAC в RT-11 V5.
Код:
006 .$CMKT
010 .$CRTI
012 .$DARL
016 .$FATA
020 .$FORQ
022 .$FPST
026 .$GETE
030 .$GETP
032 .$GTDA
036 .$GTPS
040 .$GTTI
042 .$IDLP
044 .$INTN
050 .$MRKT
052 .$PTPS
054 .$RDKM
060 .$RQSG
062 .$RSCT
064 .$RSTT
066 .$RTIC
070 .$SPL0
072 .$SPL7
120 .$TKS
122 .$TKB
124 .$TPS
126 .$TPB
140 .EXUSE
142 .FPPFL
144 .INTAC
146 .INTLV
150 .LKQUE
152 .PSCLO
154 .RMONS
156 .SAVE3
160 .SYS
162 .TASKS
164 .TIKCT
166 .TTRSE
170 .$ENSY
172 .$FORK
174 .$INTE
176 .$RMP0
200 .$RMP1
202 .$RMP2
204 .$RMP3
Структура RTEM link area (кроме вышеписанного), известная на данный момент:
Код:
000 Адрес таблицы VS$SET дла устройства VS0:
При загрузке системы из shared образа (LB:[1,1]RT11SH.DSK в RSX-11
или SYS$LIBRARY:RT11SH.DSK в VMS) по этому смещению располагается таблица:
000 VS$SSM Количество сегментов каталога в shared образе
002 VS$PSM Количество сегментов каталога в private образе
004 VS$SDB Последний блок каталога в shared образе
006 VS$SFW Первый R/W блок shared образа (файл SWAP.SYS)
010 VS$SLW Последний R/W блок (конец shared образа)
012 VS$SLB Последний блок shared образа
014 VS$PDB Последний блок каталога private образа
016 VS$PLB Последний блок private образа
020 VS$PHO Последний открытый сегмент каталога в private образе
022 VS$PLU RSX-11 LUN, назначенный private образу
024 VS$SLU RSX-11 LUN, назначенный shared образу
026 VS$TLU RSX-11 LUN, назначенный временному файлу (копия части
shared образа, доступная для записи начиная с SWAP.SYS)
030 VS$SIZ Размер устройства VS0:
032 VS$BRO Смещение для чтения данных (используется загрузчиком)
034 VS$PT1 Patch space
036 VS$PT2 -"-
040 VS$PT3 -"-
002 Адрес подпрограммы, восстанавливающая характеристики терминала и завершающая
RTEM
004 Адрес подпрограммы для вызова директив RSX-11, требующих динамической памяти RSX:
JSR R5,@4(Rx) ;ВЫЗОВ ПОДПРОГРАММЫ
.WORD IOSB ;АДРЕС БЛОКА СОСТОЯНИЯ QIO или 0 если нет/не QIO
DIR$ ... ;ВЫПОЛНЕНИЕ ДИРЕКТИВЫ RSX-11
CALL @(SP)+ ;ВЫЗОВ СОПРОГРАММЫ (C БИТ НА ВХОДЕ ДОЛЖЕН ОТРАЖАТЬ
;СТАТУС ВЫПОЛНЕНИЯ ДИРЕКТИВЫ
Подпрограмма сохраняет @#46 ($DSW), дает выполнить директиву (и прочий код для нее),
в случае ошибки вызванной нехваткой динамической памяти ждет важного события в RSX-11
директивой WSIG$S и делает повтор вызова директивы. Восстанавливает @#46.
При возврате случае успеха C=0, в случае ошибки C=1.
014 Адрес подпрограммы поиска RSX-11 LUN, назначенного RT-11 устройству:
MOV #^Rddn,R0 ;ИМЯ УСТРОЙСТВА
CALL @14(Rx) ;ВЫЗОВ ПОДПРОГРАММЫ
На выходе C=0 если LUN найден (в этом случае R0 содержит LUN) или C=1
в случае ошибки
024 Адрес подпрограммы получения/обновления даты-времени.
CALL @24(Rx)
На выходе R0 содержит дату в формате RT-11, R1 содержит $DSW от результата
выполнения GTIM$ (зачем?), R5 указывает на буфер GTIM + G.TIHR. Адрес буфера берется
из смещения 106 link area.
034 Адрес подпрограммы резервирования RSX-11 LUN для присоединия устройства.
MOV #^Rddn,R0 ;ИМЯ УСТРОЙСТВА
MOV #x,R1 ;ЕСЛИ R1=^RRTE - ПОСТОЯННОЕ ПРИСОЕДИНЕНИЕ
;В ПРОТИВНОМ СЛУЧАЕ ПРИСОЕДИНЕНИЕ ДЛЯ RT-11
;JOB ДО ВЫХОДА
CALL @34(Rx) ;ВЫЗОВ ПОДПРОГРАММЫ
На выходе C=0 в случае успеха, C=1 в случае ошибки.
046 Адрес подпрограммы прерывания ввода-вывода на RSX-11 LUN.
MOV #LUN,R4 ;RSX-11 LUN
CALL @46(Rx) ;ВЫЗОВ ПОДПРОГРАММЫ
На выходе C=0 в случае успеха, C=1 в случае ошибки.
056 Адрес подпрограммы отключения RSX-11 LUN и назначение ему SY0: (устройство по умолчанию).
MOV #x,R1 ;ЕСЛИ R1=^RRTE БЕЗУСЛОВНО ОТКЛЮЧИТЬ LUN
;В ПРОТИВНОМ СЛУЧАЕ R1 ДОЛЖЕН СОДЕРЖАТЬ НОМЕР
;ЗАДАНИЯ RT-11 УМНОЖЕННЫЙ НА 2 + 1.
На выходе C=0 в случае успеха, C=1 в случае ошибки.
074 Адрес DPB для директивы QIOW$
076 Адрес DPB для директивы ESXT$
100 Адрес DPB для QIOW$ с функцией IO.KIL
102 Адрес DPB для QIOW$ с функцией IO.ATA для TI:
106 Адрес 8-словного буфера для GTIM$
110 Некая таблица системных параметров
000 - флаги
4 - загружен с shared образа
030 - максимальный LUN который можно использовать (19. для того RTEM что есть)
114 Адрес таблицы LUN. На каждый LUN выделяется 2 слова. Первое слово содержит биты состояния,
второе - имя устройства RT-11 в RADIX-50 или 0 для файла. Биты состояния:
100000 - устройство только для чтения
40000 - LUN назначен устройству/файлу
10000 - shared образ (?)
200 - устройство RTEM (?)
0-177 - номер задания RT-11 + 1
Пара слов о драйверах RTEM-11, используемых для эмуляции физических устройств.
В общем случае, это обычные драйвера RT-11, только вместо обращений к регистрам устройств
нужно вызывать директиву QIOW$ для соответствующего устройству LUN и вместо классического прерывания обрабатывать AST (не забывая, что верх стека при этом содержит адрес блока состояния I/O директивы QIOW$).
Драйвер должен сконвертировать номер устройства в имя в RADIX-50 вида ^RRK3 и вызвать подпрограмму, адрес которой записан в RTEM lik area по смещению 14 для поиска LUN, назначенного данному устройству. Если LUN найден - нужно вызывать директиву QIOW$, используя в качестве RSX-11 event flag номер, совпадающий с LUN, указав в качестве AST подпрограммы метку ddINT драйвера.
Подпрограмма обработки прерываний драйвера RTEM (ddINT) вместо использования .DRAST должна сделать следующее:
Код:
RETURN ;ИЛИ BR НА ПОДПРОГРАММУ ОТМЕНЫ I/O (ВЫЗОВ QIOW$ IO.KIL)
ddINT: TST (SP)+ ;УБРАТЬ ИЗ СТЕКА АДРЕС БЛОКА СОСТОЯНИЯ I/O
JSR R5,@$INPTR ;ВЫЗВАТЬ ПОДПРОГРАММУ $INTEN
.WORD PRI*40 ;ПРИОРИТЕТ ПРОЦЕССОРА (ДЛЯ RTEM ОСОБОГО ФУНКЦИОНАЛА НЕ НЕСЕТ,
;ОДНАКО ЕСЛИ ОН БУДЕТ БОЛЬШЕ 4, БУДЕТ ЗАБЛОКИРОВАНА ОБРАБОТКА
;AST ДО ВОЗВРАТА ИЗ ПОДПРОГРАММЫ.
Загрузчик устройства RTEM должен (как уже писалось выше) просто ругаться на невозможность загрузить RTEM на живом железе. Подпрограмма чтения должна использовать DPB директивы QIOW$ по адресу, записанному в @#772 и подпрограмму выполнения директивы по адресу, записанному в @#774.
Также в загрузчике должен быть подготовлен код для печати сообщений ошибок загрузки в RTEM. Пример загрузчика для драйвера RK в RTEM:
Код:
.DRBOT RK,BOOT1,READ
.=RKBOOT+40
BOOT1: JMP @#BOOT-RKBOOT
.=RKBOOT+254
READ: MOV R0,R3 ;SAVE BLOCK NUMBER
MOV RKBOOT+772,R0 ;GET ADDRESS OF QIOW DPB
MOV R2,Q.IOPL(R0) ;SET BUFFER ADDRESS
ASL R1 ;CONVERT WORD COUNT TO BYTES
MOV R1,Q.IOPL+2(R0) ;SET BYTE COUNT
MOV R3,Q.IOPL+10(R0) ;SET BLOCK NUMBER
JMP @RKBOOT+774 ;PERFORM I/O
BOOT: JSR R0,BPRINT ;PRINT ERROR MESSAGE AND HALT
.ASCII <CR><0><LF><0>
.ASCII /?BOOT-U-Cannot boot RTEM standalone/<CR><LF><LF><200>
.ASSUME . LE RKBOOT+550
.=RKBOOT+550
BPRINT: TSTB @#TPS ;TERMINAL PRINTER READY?
BPL BPRINT ;PL = NO
MOVB (R0)+,@#TPB ;PRINT CHARACTER
BPL BPRINT ;PL = MORE TO PRINT
10$: HALT ;HALT PROCESSOR
BR 10$ ;
.ASSUME . LE RKBOOT+570
.=RKBOOT+570
JMP @#BIOERR ;RTEM BIOERR ENTRY
.=RKBOOT+576
JMP @#REPORT ;RTEM REPORT ENTRY
.DREND RK
В этом коде загрузчика есть некоторые неточности: с RTEMовских точек входа BIOERR и REPORT нужно отрабатывать вывод средствами RSX, а не ссылаться на аналогичные точки для обычной загрузки. Позже нарисую как должно быть.
- - - Добавлено - - -
Ну вот, вроде основное закончил. Дальше можно мучить тему. Есть еще кое-какая техническая информация вроде формата shared образа (озвучивал ранее кажется в теме про Э85 и DEC Pro), но она не так существенна. Чуть позже напишу о патчах для RT-11 V5.7 которые пришлось наложить, чтобы система нормально грузилась под RTEM (некоторые ошибки тянулись с самого RT-11 V5.0, некоторые (поддержка расширенных unit # на устройстве загрузки) просто не предусматривались ибо RTEM был заброшен раньше RT-11 V5.5, некоторые возможно вызвыны использованием старого RTEM - другого-то пока нет [хотя теперь можно подумать и о написании своего]), но исправления всяко не помешают даже если когда и найдем более поздний.