Железные призраки прошлого

Компьютерная история

СтатьиСтатьиСтатьи
Cтарое железо и софт

МузейМузейМузей
Старые компьютеры

ФорумФорумФорум
Полигон призраков

ОбщалкаКонкурсыКонкурсы
Статьи и фото



Искать на сайте:
VAX 20 лет спустя



Эта статья прислана на конкурс.

SuperMax (автор участвует в конкурсе под псевдонимом)

1. Немного о истории создания VAX-а


Процитирую вики:


Первая серийная модель архитектуры VAX была представлена публике 25 октября 1977. Это была модель VAX-11/780 «Star» с процессором KA780 (29 печатных плат ТТЛ) и 4 МБ ОЗУ с коррекцией ошибок. В качестве консольного процессора использовалась специализированная версия PDP-11. Машина была крайне коммерчески успешна. Последовала разработка «второй серии», уже не на рассыпной логике, а на gatearray, и спустя примерно год после модели «Star» была представлена модель VAX-11/750 «Comet».

Эта сухая информация не дает понимания грандиозности события, и я постараюсь разъяснить некоторые важные моменты. В 1973 году платформе PDP-11, которая, кстати, производилась в течении 25 лет (!), становится тесно на 4 МБ ОЗУ. Вдумайтесь – 4 мегабайта памяти, и это тогда, когда Intel еще "ходил под стол пешком" (8080 появился только в 1974-ом году).

Что такое 4 мегабайта в 73-м? Мне сложно подобрать эпитеты, насколько это круто, я просто приведу для сравнения прайс NIX-a 1994ого года:


Кликните для просмотра исходного изображения


Цена планки памяти 4 МБ 70нс - $200 за наличный расчет.


Описывать архитектуру PDP11 в этой статье я не считаю необходимым, лишь отмечу, что некоторый штатный ее функционал, реализованный в начале 70-х, до x86 платформы дошел только через 20 лет.


Сейчас же наши восторги посвящены VAX-у. Само название образовано из Virtual Address eXtension. То есть, в архитектуре была реализована аппаратная поддержка виртуального адресного пространства (да-да, это то, что было частично реализовано Intel в 85-ом – в i386).

Будет не лишним отметить и заслуги операционной системы VMS, наработки которой позволили Microsoft-у породить нормальную операционную систему New Technology, название которой в последствии было сокращено до Windows NT.

Кратко о VMS следует сказать, что это сверхнадежная ОС, сертифицированная по С2 (и возможен подъем до B1). Именно под VMS разрабатывалась система международных межбанковских транзакций SWIFT. Основное применение VMS сейчас – сверхкритичные задачи: оборонное направление, атомная энергетика и банковские системы.

По давней традиции VAX и VMS были “содраны” в СССР и были рождены клоны – СМ1700 и операционная система МОС32.


Итак, по счастливой случайности, у меня получилось приобрести VAX 4000-600A.

Кодовое имя этой модели - "Omega/N+", представлена на рынок 12 октября 1993-го года.

Процессорная плата KA691 содержит NVAX процессор с тактовой частотой 83 МГц и кэшем 512 КБ.

Получается, что это почти топовый VAX – круче только плата KA692 c процессором на 100 МГц и кэшем 2МБ.

В моей комплектации установлена одна из 4 возможных плат памяти – 128 МБ, т.е. максимальное расширение оперативной памяти в этой серии серверов возможно до 512 МБ. Для машины 93 года это очень много, достаточно вспомнить стоимость 4-х мегабайтов оперативной памяти в 94-м. Ориентировочная стоимость этой машины в 1993 - около $180 000 - 230 000.


Начнем осмотр снаружи.


VAX 4000-600A - внешний вид

VAX 4000-600A - внешний вид

VAX 4000-600A - внешний вид


Машина представляет собой тумбочку среднего размера на колесиках. Колесики, к сожалению, не поворотные, но их наличие существенно упрощает передвижение машины, вес которой явно больше 60 кг.

Проведем осмотр машины внутри:




Отсек процессорной платы и памяти:




Вынимаем процессор и память:




Плата процессора:


VAX 4000-600A. Плата процессора


Плата памяти:


VAX 4000-600A - Плата памяти


Теперь посмотрим, что у нас в QBUS.


2 шт. DSV11-SA M3108-PA Synchronous Communication Controller:




2 шт. CXY08-M M3119-YA 8 ASYNC LINE:




1 шт. KZQSA M5976-SA - SCSI адаптер:




1 шт. DEFQA M7534-AD - это FDDI сетевой адаптер 100 Mbit:




Все в порядке – можно включать.






Я уже привык к шумным серверам и, включая, ожидал дикий вой системы охлаждения, но я услышал только звук старта жестких дисков – они SCSI и не содержат гидродинамических подшипников. С другой стороны, может, наличие честных подшипников и позволило машине запуститься спустя 20 лет простоя.


При первом включении 6-й жесткий диск начал “стучаться головой”. Соответственно, было принято решение его отключить.








После обращаем внимание на ошибку, связанную с памятью:





2. Получение доступа в систему


Итак, ревизия сервера проведена - включаем:

KA691-A V2.3, VMB 2.14
Performing normal system tests.
70..69..68..67..66..65..64..63..62..61..60..59..58..57..56..55..
54..53..52..51..50..49..48..47..46..45..44..43..42..41..40..39..
38..37..36..35..34..33..32..31..30..29..28..27..26..25..24..23..

? Test_Subtest_40_06 Loop_Subtest=00 Err_Type=FF DE_Memory_count_pages.lis
Vec=0000 Prev_Errs=0000 P1=00000001 P2=00000001 P3=7FFFFFFF P4=00000000
P5=00004000 P6=00040000 P7=00004000 P8=00000000 P9=00000000 P10=00000000
r0=00000002 r1=00000001 r2=00000000 r3=FFFFFFFF r4=000000A0 r5=00000000
r6=00000000 r7=00000000 r8=00000000 r9=20140758 r10=00000000 r11=2014044B
dser=0000 cesr=00000000 icsr=01 pcsts=F800 pcctl=FC13 cctl=00000021
bcetsts=0000 bcedsts=0000 cefsts=00000200 nests=00 mmcdsr=01111000
mesr=00085000

Normal operation not possible.

>>>


Осмотримся в загрузочной консоли. Вспоминаем RT-11 и набираем:


>>>help

Following is a brief summary of all the commands supported by the console:

   UPPERCASE denotes a keyword that you must type in
   | denotes an OR condition
   [] denotes optional parameters
   <> denotes a field specifying a syntactically correct value
   .. denotes one of an inclusive range of integers
   ... denotes that the previous item may be repeated

Valid qualifiers:
   /B /W /L /Q /INSTRUCTION
   /G /I /V /P /M
   /STEP: /N: /NOT
   /WRONG /U

Valid commands:
   BOOT [[/R5:]<boot_flags>] [<boot_device>]
   CONFIGURE
   CONTINUE    DEPOSIT [<qualifiers>] <address> <datum> [<datum>...]
   EXAMINE [<qualifiers>] [<address>]
   FIND [/MEMORY | /RPB]
   HALT
   HELP
   INITIALIZE
   LOGIN
   MOVE [<qualifiers>] <address> <address>
   NEXT [<count>]
    REPEAT <command>
   SEARCH [<qualifiers>] <address> <pattern> [<mask>]
   SET BFLG <boot_flags>
   SET BOOT <boot_device>
   SET CONTROLP <0..1 | DISABLED | ENABLED>
   SET DSSI_ID <bus_number> <id> ! Type F for ID to use BUS ID plugs
   SET HALT <0..4 | DEFAULT | RESTART | REBOOT | HALT | RESTART_REBOOT>
   SET HOST/DUP/DSSI/BUS:<0..3> <node_number> [<task>]
   SET HOST/DUP/UQSSP </DISK | /TAPE> <controller_number> [<task>]
   SET HOST/DUP/UQSSP <physical_CSR_address> [<task>]
   SET HOST/MAINTENANCE/UQSSP/SERVICE <controller_number>
   SET HOST/MAINTENANCE/UQSSP <physical_CSR_address>
   SET LANGUAGE <1..15>
   SET PSE <0..1 | DISABLED | ENABLED>
   SET PSWD
   SET RECALL <0..1 | DISABLED | ENABLED>
   SHOW BFLG
   SHOW BOOT
   SHOW CONFIG
   SHOW CONTROLP
   SHOW DEVICE
   SHOW DSSI [0..3]
   SHOW DSSI_ID
   SHOW ERRORS
   SHOW ETHERNET
   SHOW HALT
   SHOW LANGUAGE
   SHOW MEMORY [/FULL]
   SHOW PSE
   SHOW QBUS
   SHOW RECALL
   SHOW RLV12
   SHOW SAVED_STATE
   SHOW SCSI
   SHOW TESTS
   SHOW TRANSLATION <physical_address>
   SHOW UQSSP
   SHOW VERSION
   START <address>
   TEST <test_code> [<parameters>]
   UNJAM
   X <address> <count>
>>>


Отлично!


Осмотримся:


>>>SHOW VERSION
KA691-A V2.3, VMB 2.14

>>>SHOW DEVICE
DSSI Bus 0 Node 0 (SYSTEM)
-DIA0 (RF36)


DSSI Bus 0 Node 1 (USER)
-DIA1 (RF36)

DSSI Bus 0 Node 2 (TROLL2)
-DIA2 (RF36)

DSSI Bus 0 Node 3 (TROLL3)
-DIA3 (RF36)

DSSI Bus 0 Node 4 (TROLL4)
-DIA4 (RF36)

DSSI Bus 0 Node 6 (T88ZQ0)
-MIA6 (TF85)

DSSI Bus 0 Node 7 (*)

DSSI Bus 1 Node 7 (*)

SCSI Adapter 0 (761400), SCSI ID 7

Ethernet Adapter
-EZA0 (08-00-2B-3E-98-E9)

Надо что-то сделать с ошибками. Для начала запустим все тесты - посмотрим, какие вообще есть:

>>>show test

Test
# Address Name Parameters

___________________________________________________________________________
20051600 SCB
20054C3C De_executive
30 20069924 Memory_Init_Bitmap *** mark_Hard_SBEs ******
31 20069F1C Memory_Setup_CSRs *********
32 2005C530 NMC_registers **********
33 2005C70C NMC_powerup **
34 2005DAC0 SSC_ROM ***
35 2005EF78 B_Cache_diag_mode bypass_test_mask *********
37 20060978 Cache_w_Memory bypass_test_mask *********
3F 2006B954 Mem_FDM_Addr_shorts *** cont_on_err ******
40 2006A9DC Memory_count_pages First_board Last_bd Soft_errs_allowed *******
41 200680D4 Board_Reset *
42 20060C68 Chk_for_Interrupts **********
46 200604AC P_Cache_diag_mode bypass_test_mask *********
47 2006A0EC Memory_Refresh start_a end incr cont_on_err time_seconds *****
48 2006A410 Memory_Addr_shorts start_add end_add * cont_on_err pat2 pat3 ****
49 2006B2E0 Memory_FDM *** cont_on_err ******
4A 20069624 Memory_ECC_SBEs start_add end_add add_incr cont_on_err ******
4B 200687F4 Memory_Byte_Errors start_add end_add add_incr cont_on_err ******
4C 20068F88 Memory_ECC_Logic start_add end_add add_incr cont_on_err ******
4D 200683D0 Memory_Address start_add end_add add_incr cont_on_err ******
4E 20068570 Memory_Byte start_add end_add add_incr cont_on_err ******
4F 2006ABFC Memory_Data start_add end_add add_incr cont_on_err ******
51 20057424 FPA **********
52 20057918 SSC_Prog_timers which_timer wait_time_us ***
53 20057C00 SSC_TOY_Clock repeat_test_250ms_ea Tolerance ***
54 20057000 Virtual_Mode ********
55 20058254 Interval_Timer *****
56 20064464 SHAC_LPBCK From_bus To_bus passes *******
58 2006510C SHAC_RESET dssi_bus port_number time_secs not_pres *
59 20061B60 SGEC_LPBCK_ASSIST time_secs **
5C 200620F8 SHAC SHAC_number *********
5F 20060DA0 SGEC loopback_type no_ram_tests ******
60 2006D928 SSC_Console_SLU start_BAUD end_BAUD *******
62 20057F04 console_QDSS mark_not_present selftest_r0 selftest_r1 *****
63 2005808C QDSS_any input_csr selftest_r0 selftest_r1 ******
80 2005C7A8 CQBIC_memory bypass_test_mask *********
81 20058AB4 Qbus_MSCP IP_csr ******
82 20058C94 Qbus_DELQA device_num_addr ****
83 20059C44 QZA_Intlpbck1 controller_number ********
84 2005B304 QZA_Intlpbck2 controller_number *********
85 20058E84 QZA_memory incr test_pattern controller_number *******
86 2005932C QZA_DMA Controller_number main_mem_buf ********
90 2005787C CQBIC_registers *
91 200577F8 CQBIC_powerup **
99 2005D034 Flush_Ena_Caches dis_flush_VIC dis_flush_BC dis_flush_PC
9A 20063398 INTERACTION pass_count disable_device *******
9B 20068230 Init_memory **
9C 20065704 List_CPU_registers *
9D 2006C280 Utility Flags *********
9E 20058424 List_diagnostics script_number *
9F 200675B4 Create_A0_Script **********
C1 20056C70 SSC_RAM_Data *
C2 20056E60 SSC_RAM_Data_Addr *
C5 20057DD0 SSC_registers *
D0 20060058 V_Cache_diag_mode bypass_test_mask *********
D2 2005D278 O_Bit_diag_mode bypass_test_mask *********
DA 20060784 PB_Flush_Cache **********
DB 2005DC38 Speed print_speed *********
DC 2006C208 NO_Memory_present ********
DD 2005E4C4 B_Cache_Data_debug start_add end_add add_incr *******
DE 2005E04C B_Cache_Tag_Debug start_add end_add add_incr *******
DF 2005D690 O_BIT_DEBUG start_add end_add add_incr seg_incr ******

Scripts
# Description

A0 User defined scripts
A1 Powerup tests, Functional Verify, continue on error, numeric countdown
A3 Functional Verify, stop on error, test # announcements
A4 Loop on A3 Functional Verify
A6 Memory tests, mark only multiple bit errors
A7 Memory tests
A8 Memory acceptance tests, mark single and multi-bit errors, call A7
A9 Memory tests, stop on error
B5 Extended tests, then loop

Load & start system exerciser
100 Customer mode, 2 passes
101 CSSE mode, 2 passes
102 CSSE mode, continous until ^C
103 Manuf mode, continous until ^C
104 Manuf TINA mode, continous until ^C
105 Manuf mode, 2 passes
106 CSSE mode, select tests, continous until ^C
107 Manuf mode, select tests, continous until ^C

Просто огромный список! Но мы сложностей не боимся и прогоняем все тесты и... ошибка памяти уходит (на самом деле надо было начать с команды UNJAM и INITIALIZE, но об этом я прочитал позднее).


Так как мы не знаем паролей от пользователя SYSTEM (аналог root в *nix), попробуем его сбросить. Получение доступа в систему (получается системное устройство DIA0), произведем загрузку системы в ограниченном режиме - в утилиту SYSBOOT:


>>>BOOT /R5:1 DIA0:
(BOOT/R5:1 DIA0:)

    2..
-SYSTEM$DIA0
   1..0..

SYSBOOT> SET/STARTUP OPA0:

SYSBOOT> SET WINDOW_SYSTEM 0

SYSBOOT> SET WRITESYSPARAMS 0

SYSBOOT> CONTINUE

VAX/VMS Version V5.5-2H4 Major version id = 1 Minor version id = 0


OPA0: - это консоль. После загрузки ОС пытаемся запустить утилиту AUTHORIZE, но получаем отлуп:


$ SET DEFAULT SYS$SYSTEM
SET DEFAULT SYS$SYSTEM
$ RUN AUTHORIZE
RUN AUTHORIZE
%DCL-W-ACTIMAGE, error activating image SECURESHRP
-CLI-E-IMGNAME, image file SYSTEM$DIA0:[SYS0.SYSCOMMON.][SYSLIB]SECURESHRP.EXE;5
-SYSTEM-F-PROTINSTALL, protected images must be installed
   SYSTEM job terminated at 3-MAY-2015 11:33:35.82

   Accounting information:
   Buffered I/O count: 48 Peak working set size: 650
   Direct I/O count: 24 Peak page file size: 3364
   Page faults: 235 Mounted volumes: 0
   Charged CPU time: 0 00:00:00.08 Elapsed time: 0 00:00:35.18

Сейчас надо нажать "reset", потому что мы забыли команду SPAWN. Этой ошибки не повторяем, нам не страшно - сказано инсталлировать - ставим:


$ SET NOON
$ SPAWN
SPAWN
%DCL-S-SPAWNED, process SYSTEM_1 spawned
%DCL-S-ATTACHED, terminal now attached to process SYSTEM_1
$ SPAWN
%DCL-S-SPAWNED, process SYSTEM_2 spawned
%DCL-S-ATTACHED, terminal now attached to process SYSTEM_2
$ SPAWN
%DCL-S-SPAWNED, process SYSTEM_3 spawned
%DCL-S-ATTACHED, terminal now attached to process SYSTEM_3
$ SPAWN
%DCL-S-SPAWNED, process SYSTEM_4 spawned
%DCL-S-ATTACHED, terminal now attached to process SYSTEM_4
$ SPAWN$ INSTALL:== $INSTALL/COMMAND_MODE
%DCL-S-SPAWNED, process SYSTEM_5 spawned
%DCL-S-ATTACHED, terminal now attached to process SYSTEM_5
%DCL-S-RETURNED, control returned to process SYSTEM_4
$ SET NOON
$ INSTALL
INSTALL> ADD/OPEN/HEADER/SHARE SYS$SHARE:SECURESHR.EXE
INSTALL> ADD/OPEN/HEADER/PROTECT/SHARE SYS$SHARE:SECURESHRP.EXE
INSTALL> EXIT

SET DEFAULT SYS$SYSTEM
$ SET DEFAULT SYS$SYSTEM
$ RUN AUTHORIZE
UAF> MODIFY SYSTEM /PASSWORD=pass
%UAF-I-MDFYMSG, user record(s) updated
UAF> EXIT
%UAF-I-DONEMSG, system authorization file modified
%UAF-I-NAFNOMODS, no modifications made to network proxy data base
%UAF-I-RDBNOMODS, no modifications made to rights data base

После перезагрузки при первом логоне система нас попросит сразу сменить пароль:




   Accounting information:
   Buffered I/O count: 3439 Peak working set size: 962
   Direct I/O count: 3214 Peak page file size: 6996
   Page faults: 19100 Mounted volumes: 1
   Charged CPU time: 0 00:00:10.64 Elapsed time: 0 00:01:52.11

       Welcome to VAX/VMS V5.5-2H4

Username: SYSTEM
Password:
       Welcome to VAX/VMS version V5.5-2H4 on node TROLL
    Last interactive login on Sunday, 3-MAY-2015 01:23
    Last non-interactive login on Thursday, 15-JUN-1995 09:26


Your password has expired; you must set a new password to log in

New password:
Verification:
Password found in history list; please choose a new password
Please try again or press to abort login

Повтор пароля не прошел - VMS 1993 года - это не винда, уровень безопасности на несколько порядков выше.


New password:
Verification:

%%%%%%%%%%% OPCOM 3-MAY-2015 12:18:59.88 %%%%%%%%%%%
Message from user AUDIT$SERVER on TROLL
Security alarm (SECURITY) and security audit (SECURITY) on TROLL, system id: 1026
Auditable event: System UAF record modification
Event time: 3-MAY-2015 12:18:59.79
PID: 0000021C
Username: SYSTEM
Image name: SYSTEM$DIA0:[SYS0.SYSCOMMON.][SYSEXE]LOGINOUT.EXE
Object name: SYS$COMMON:[SYSEXE]SYSUAF.DAT;1
Object type: file
User record modified: SYSTEM
Fields modified: PASSWORD

Итак - мы в консоли!


3. Настройка сети


Так как у меня не нашлось в запасе конвертеров AUI в UTP, подключаем сеть по коаксиалу.




Следует отметить, что сети на тонком коаксиале достаточно надежны при надлежащем их исполнении. К сожалению, их репутацию в свое время испортили криворукие монтажники, использующие некачественные коаксиальные кабели и разъемы под обжимку. Обжимные разъемы в принципе не пригодны для высокочастотных сетей с высокими требованию к качеству. В сетях на коаксиале нужна пайка и только пайка.

Помню, в 95-м году мы с друзьями растянули первую в городе домашнюю сеть - на коаксиале - длина сегмента у нас получилась 370м. Как, спросите вы? Оно еще и работало? На самом деле всё очень просто: мы взяли качественный кабель с низкими потерями. Единственное, что нам пришлось подобрать, так это номиналы терминаторов, и смириться с коллизиями из-за длины сегмента. Последнее нас практически не беспокоило, т.к. "нас" было всего 4 компа в сети. Впрочем, я отвлекся.


Вернемся к нашей задаче - надо подключить VAX к сети.


Для настройки используем утилиту UCX. В утилите корректно работает help, но я не буду загромождать статью его публикацией.


Посмотрим, что у нас сейчас:


$UCX
UCX> show INTERFACE
Interface: ZE0
   IP_Addr: 128.0.0.100 NETWRK: 255.255.0.0 BRDCST: 128.0.255.255
          Ethernet_Addr: AA-00-04-00-02-04 MTU: 1500
    Flags: UP BRDCST NOTRL RUN
          RECEIVE SEND
   Packets 616 4
       IP packets 0 0
       Broadcast IP packets 278 0
       Trailer 1 IP packets 0
       Trailer 2 IP packets 0
   ARP packets 0 0
   Broadcast ARP packets 338 4
   Drops
      IP packets 0 0
      ARP packets 0 0
   Errors
       Hardware 0 0
      Software 0 0
   Restarting attempts 0
   Successful restarts 0

Interface: LO0
   IP_Addr: 127.0.0.1 NETWRK: 255.0.0.0 BRDCST:
          Ethernet_Addr: MTU: 65535
       Flags: UP LOOP
          RECEIVE SEND
   Packets 0 0
      IP packets 0 0
      Broadcast IP packets 0 0
      Trailer 1 IP packets 0
      Trailer 2 IP packets 0
      ARP packets 0 0
      Broadcast ARP packets 0 0
   Drops
      IP packets 0 0
      ARP packets 0 0
   Errors
      Hardware 0 0
      Software 0 0
   Restarting attempts 0
   Successful restarts 0

ok


Настроим на мою адресацию:


UCX> set INTERFACE ZE0 /ADDRESS=192.168.0.10 /ACTIVE /ARP
UCX> set INTERFACE ZE0 /NETWORK_MASK=255.255.255.0
UCX> set INTERFACE ZE0 /BROADCAST_MASK=192.168.0.255


Смотрим:


UCX> UCX> SHOW INTERFACE ZE0
    Interface: ZE0
       IP_Addr: 192.168.0.10 NETWRK: 255.255.255.0 BRDCST: 192.168.0.255
          Ethernet_Addr: AA-00-04-00-02-04 MTU: 1500
       Flags: UP BRDCST NOTRL RUN
          RECEIVE SEND
    Packets 5444 21
       IP packets 2575 11
       Broadcast IP packets 350 0
       Trailer 1 IP packets 0
       Trailer 2 IP packets 0        ARP packets 0 2
       Broadcast ARP packets 2519 8
    Drops
       IP packets 0 0
       ARP packets 0 0
    Errors
       Hardware 0 0
       Software 0 0
    Restarting attempts 0
    Successful restarts 0

# ping 192.168.0.10
PING 192.168.0.10 (192.168.0.10) 56(84) bytes of data.
64 bytes from 192.168.0.10: icmp_seq=0 ttl=255 time=1.64 ms
...
64 bytes from 192.168.0.10: icmp_seq=13 ttl=255 time=0.505 ms

--- 192.168.0.10 ping statistics ---
14 packets transmitted, 14 received, 0% packet loss, time 12999ms
rtt min/avg/max/mdev = 0.481/0.592/1.646/0.295 ms, pipe 2


Отлично! Пробуем подключаться:


# telnet 192.168.0.10
Trying 192.168.0.10...
Connected to 192.168.0.10 (192.168.0.10).
Escape character is '^]'.


       Welcome to VAX/VMS V5.5-2H4

Username: SYSTEM
Password:
User authorization failure
Username: SYSTEM
Password:
       Welcome to VAX/VMS version V5.5-2H4 on node TROLL
    Last interactive login on Friday, 8-MAY-2015 10:10
    Last non-interactive login on Thursday, 15-JUN-1995 09:26
       1 failure since last successful login


Ошибка при вводе пароля сразу фиксируется и показывается при успешном логоне. Для VAXа мы выглядим так:


$ show terminal
Terminal: _TNA1: Device_Type: VT102 Owner: _TNA1:
Username: SYSTEM
Remote Port Info: Host: 192.168.0.1 Port: 57549

    Input: 9600 LFfill: 0 Width: 80 Parity: None
    Output: 9600 CRfill: 0 Page: 24

Terminal Characteristics:
    Interactive Echo Type_ahead No Escape
    Hostsync TTsync Lowercase Tab
    Wrap Scope No Remote No Eightbit
    Broadcast No Readsync No Form Fulldup
    No Modem No Local_echo No Autobaud Hangup
    No Brdcstmbx No DMA No Altypeahd Set_speed
    No Commsync Line Editing Overstrike editing No Fallback
    No Dialup No Secure server No Disconnect No Pasthru
    No Syspassword No SIXEL Graphics No Soft Characters Printer port
    Numeric Keypad ANSI_CRT No Regis No Block_mode
    Advanced_video Edit_mode DEC_CRT No DEC_CRT2
    No DEC_CRT3 No DEC_CRT4 VMS Style Input
$


Сразу бросается в глаза мгновенный отклик, тогда как при работе через консоль 9600 скорость вывода адекватно не быстрая. При этом на консоль вышло сообщение:


%%%%%%%%%%% OPCOM 8-MAY-2015 13:29:25.52 %%%%%%%%%%%
Message from user INTERnet on TROLL
TELNET Login Request from Remote Host: 192.168.0.1 Port: 57549

Фиксирует ;-)



4. Операционная система VMS


Вообще операционные системы корпорации Digital изначально дружественны к пользователю и значительно более понятны на уровне командного языка, чем MS-DOS, CP/M, UNIX и прочие, созданные в те "давние времена". Основное явное преимущество - это наличие корректной помощи по командам.

К примеру:


$help copy /backup

COPY

    /BACKUP

       Modifies the time value specified with the /BEFORE or the /SINCE
       qualifier. The /BACKUP qualifier selects files according to the
       dates of their most recent backups. This qualifier is incompatible
       with the following qualifiers that also allow you to select files
       according to time attributes: /CREATED, /EXPIRED, and /MODIFIED.
       If you specify none of these four time qualifiers, the default is
       the /CREATED qualifier.

И мы сразу получаем развернутую инструкцию. Для сравнения наберите man cp в *nix системе. Даже он не дотягивает до уровня стандартного help-а VMS или RT-11.


Сам командный язык подразумевает интерактивность.


К примеру:


$ copy
_From: WP.EXE;1
_To: WP.EXE;2


Т.е., если параметры не указаны в командной строке - они будут запрошены.



Навигация по системе


Основная команда - set default каталог. Это назначение текущего каталога, в котором работаем. Может, это и непривычно, но иерархическая система каталогов в VMS полноценна и вполне удобна. Относительная сложность команды - set default относительно привычного CD обусловливается спецификой времени, когда VMS создавалась - файлов в системе было относительно немного, каждый пользователь работал в своем домашнем каталоге, и бегать ему по системе было совсем не надо. Соответственно, написать set default было ему совсем не трудно и требовалось не так часто, как сейчас, когда на наших дисках миллионы файлов и десятки тысяч директорий.


Примеры работы с каталогами:


$ set default sys$system

$ dir

Directory SYS$SYSROOT:[SYSEXE]

AGEN$ADDHISTORY.DAT;1       AGEN$FEEDBACK.DAT;1
AGEN$FEEDBACK.REPORT;8        AGEN$FEEDBACK.REPORT;7
AGEN$PARAMS.REPORT;8       AGEN$PARAMS.REPORT;7
AGEN$PARAMS.REPORT;6

....

Можно идти выше:


$ set default [-]

$ dir

 

Directory SYS$SYSROOT:[000000]

 

DBM$RUJ.DIR;1       DECNET.DIR;1        FAL$SERVER.DIR;1    MAIL$SERVER.DIR;1

MIRRO$SERVER.DIR;1  MOM$SYSTEM.DIR;1    NML$SERVER.DIR;1    PCSA.DIR;1

PHONE$SERVER.DIR;1  PWVN$PRIVATE.DIR;1  RDM$RUJ.DIR;1       SYS$LDR.DIR;1

SYS$STARTUP.DIR;1   SYSCBI.DIR;1        SYSCOMMON.DIR;1     SYSERR.DIR;1

SYSEXE.DIR;1        SYSHLP.DIR;1        SYSLIB.DIR;1        SYSMAINT.DIR;1

SYSMGR.DIR;1        SYSMSG.DIR;1        SYSTEST.DIR;1       SYSUPD.DIR;1

UCX_LPD.DIR;1       UCX_SMTP.DIR;1      VPM$SERVER.DIR;1

 

Total of 27 files.

Directory SYS$COMMON:[000000]

 

CDA$LIBRARY.DIR;1   CDD$TEMPLATE.DIR;1  CDD$TEMPLATEDB.DIR;1

CDDPLUS.DIR;1       CDD_EXTENSIONS.DIR;1                    DBM$REMOTE.DIR;1

DECW$BOOK.DIR;1     DECW$DEFAULTS.DIR;1 DECW$INCLUDE.DIR;1  DTR.DIR;1

MOM$SYSTEM.DIR;1    PCSA.DIR;1          PWL$COMMON.DIR;1    PWVN$COMMON.DIR;1

RDB$REMOTE.DIR;1    SQLSRV.DIR;1        SYS$KEYMAP.DIR;1    SYS$LDR.DIR;1

SYS$STARTUP.DIR;1   SYSCBI.DIR;1        SYSERR.DIR;1        SYSEXE.DIR;1

SYSFO NT.DIR;1       SYSHLP.DIR;1        SYSLIB.DIR;1        SYSMAINT.DIR;1

SYSMGR.DIR;1        SYSMSG.DIR;1        SYSTEST.DIR;1       SYSUPD.DIR;1

VUE$LIBRARY.DIR;1   XDPS$INCLUDE.DIR;1

 

Total of 32 files.

 

Grand total of 2 directories, 59 files.



Пробуем идти выше (на самом деле идти некуда, ибо [000000] означает корень):


$ dir [-]
%DIRECT-E-OPENIN, error opening [-] as input
-RMS-F-DIR, error in directory name
$ set default [-]
%RMS-F-DIR, error in directory name
$

По вышеуказанным причинам у нас это не вышло. Пробуем посмотреть содержимое директории CDA$LIBRARY.DIR, это можно сделать двумя путями:


1) $ DIR CDA$LIBRARY

Directory SYS$COMMON:[CDA$LIBRARY]

CL_DAY.DOC_STYLE;1 DEFSTYLE.DDIF;2

Total of 2 files.

И второй путь:


2) $ set default CDA$LIBRARY
$ dir

Directory SYS$COMMON:[CDA$LIBRARY]

CL_DAY.DOC_STYLE;1 DEFSTYLE.DDIF;2

Total of 2 files.

Можем посмотреть и то, что выше.


5. DECNET


Подключаем VAX по протоколу DECNET к серверу Windows 2003. На стороне WIN cервера ставим Pathworks32 v7.4. Я присваиваю виндовому серверу имя ноды FILSVR и адрес 1.70






Теперь идем на VMS и запускаем утилиту управления - NCP. Есть 2 варианта запуска:


1) $ RUN SYS$SYSTEM:NCP и 2) $ mcr ncp

Итак:


NCP>help

    Information available:

    CLEAR Commands CONNECT COPY DEFINE DISCONNECT EVENTS
    EXIT HELP LIST LOAD LOOP PARAMETERS Prompting
    PURGE SET SHOW TELL TRIGGER ZERO

NCP>show node
Node ID (node-name, address): *

Known Node Volatile Summary as of 10-MAY-2015 12:23:24

Executor node = 1.2 (TROLL)

State = on
Identification = DECnet-VAX V5.5-2, VMS V5.5-2H4


       Node State Active Delay Circuit Next node
          Links
    1.1 (MCB) unreachable
    1.70 reachable        ISA-0 1.70
    1.101 (PC1) unreachable
    1.102 (PC2) unreachable
    1.103 (ALEX) unreachable
    1.104 (PC3) unreachable
    1.105 (PC4) unreachable
    1.106 (PC5) unreachable
    1.107 (PC7) unreachable
    1.108 (TC) unreachable
    1.110 (NIKO) unreachable
    1.170 (V1301) unreachable
    1.175 (SANYCH) unreachable
    1.199 (HP4SI) unreachable
    1.201 (TVC) unreachable
    1.777 (VXT) unreachable
NCP>

Мы видим себя - нода TROLL c адресом 1.2. Сам факт обнаружения соседней ноды (Adjacent) фиксируется на консоли:


%%%%%%%%%%% OPCOM 10-MAY-2015 11:17:07.58 %%%%%%%%%%%
Message from user DECNET on TROLL
DECnet event 4.15, adjacency up
From node 1.2 (TROLL), 10-MAY-2015 11:17:07.58
Circuit ISA-0, Adjacent node = 1.70

Вводим данные для подключения:




Теперь со стороны винды мы можем обмениваться файлами с VAXом:




Настроим видимость со стороны VAXa:


NCP>set node FILSRV host 1.70 NAME FILSRV ACCESS BOTH

Проверим:


NCP>show ACTIVE NODES

Active Node Volatile Summary as of 10-MAY-2015 11:17:22

Executor node = 1.2 (TROLL)

State = on
Identification = DECnet-VAX V5.5-2, VMS V5.5-2H4


    Node State Active Delay Circuit Next node
Links

1.70 (FILSRV) reachable ISA-0 1.70 (FILSRV)

$SHOW NETWORK
VAX/VMS Network status for local node 1.2 TROLL on 10-MAY-2015 21:33:35.72


        Node Links Cost Hops Next Hop to Node

    1.2 TROLL 0 0 0 (Local) -> 1.2 TROLL
    1.70 FILSRV 0 4 1 ISA-0 -> 1.70 FILSRV

Total of 2 nodes.

Идем на винду - надо на ней настроить сервер в каталоге C:\PW32 (каталог установки PathWorks по-умолчанию). Есть утилита NCP, запускаем ее, проверим, запущен ли сервер. Обнаружив, что нет - запускаем его и проверим видимость соседней ноды:




На винде добавляем пользователя VAX11 с паролем заглавными буквами (в домен или локальную базу пользователей). На VAXе делаем:


NCP>set node FILSRV NONPRIVILEGED USER VAX11 PASSWORD ПАРОЛЬ
NCP>set node FILSRV PRIVILEGED USER VAX11 PASSWORD ПАРОЛЬ

NCP>show node FILSRV CHAR

Node Volatile Characteristics as of 11-MAY-2015 10:58:43

Remote node = 1.70 (FILSRV)

Host = 1.70 (FILSRV)
Privileged user id = VAX11
Privileged password = ПАРОЛЬ
Nonprivileged user id = VAX11
Nonprivileged password = ПАРОЛЬ
Access = incoming and outgoing

Пробуем подключиться:


$ dir FILSRV::"C:\"
%DIRECT-E-OPENIN, error opening FILSRV::"C:\" as input
-RMS-E-FND, ACP file or directory lookup failed
-SYSTEM-F-INVLOGIN, login information invalid at remote node

$ dir FILSRV"VAX11 пароль"::"C:\"
%DIRECT-E-OPENIN, error opening FILSRV"VAX11 password"::"C:\" as input
-RMS-E-FND, ACP file or directory lookup failed
-SYSTEM-F-INVLOGIN, login information invalid at remote node

И при этом в логе сообщений на винде появляются сообщения:


11:12:29 SPAW9999E: NT LogonUser fails, name='VAX11' lacks the user right 'Log on as a batch job'

Задача ясна. На винде запускаем:


secpol.msc /s
Local Policies / User Rights Assignment / Log on as batch job

Добавляем пользователя, а так как у меня это контроллер домена, то я иду немного другим путем:




На VAX даем команду:


$ dir FILSRV::"C:\"

Directory FILSRV::

"C:\.DFS" "C:\.DSF_BACKUP" "C:\.catalog" "C:\1.1"
....
Total of 36 files.

В логе на винде фиксируется:


11:53:38 SPAW9999N: Command C:\PW32\FAL32.EXE -use 2 -access 3 executed.

Можно себя поздравить - DECNET работает!


6. Бекап на внешние ресурсы


Сеть у нас уже подключена, можно сделать бекапы рабочих дисков. Смотрим, какие устройства у нас есть:


$ show dev
Device Device Error Volume Free Trans Mnt
    Name Status Count Label Blocks Count Cnt
SYSTEM$DIA0: Mounted 0 VAXVMS2H4055 148161 299 1
TROLL2$DIA2: Online 0
TROLL3$DIA3: Online 0
TROLL4$DIA4: Online 0
USER$DIA1: Mounted 0 USER21 373305 1 1

Device Device Error Volume Free Trans Mnt
    Name Status Count Label Blocks Count Cnt
T88ZQ0$MIA6: Online 1

Делаем бекап на винду:


$backup/phys SYSTEM$DIA0: FILSRV::"F:\VAX\DIA0.BKP" /save
$backup/phys USER$DIA1: FILSRV::"F:\VAX\DIA1.BKP" /save

Затем надо и остальные диски, но сначала примонтируем их:


$ mount TROLL2$DIA2: TROLL2
%MOUNT-I-OPRQST, device _TROLL2$DIA2: contains the wrong volume
%MOUNT-I-OPRQST, Please mount volume TROLL2 in device _TROLL2$DIA2:

Однако мы не угадали с именем тома, сообщение "Please mount" означает, что система ждет, когда оператор воткнет в устройство TROLL2$DIA2: диск с именем тома TROLL2. Так как мы "сами себе оператор", то пробуем узнать правильное имя тома:


$mount TROLL2$DIA2: TROLL2 /NOASSIST
%MOUNT-I-OPRQSTCAN, operator request canceled
%MOUNT-F-INCVOLLABEL, incorrect volume label
-MOUNT-I-VOLIDENT, label = 'ST400 ', owner = ' ', format = 'DEC
FILE11B '

Ага, имя тома известно - теперь монтируем:


$ mount TROLL2$DIA2: ST400
%MOUNT-I-MOUNTED, ST400 mounted on _TROLL2$DIA2:

Теперь все проходит без проблем:


$ show dev

Device Device Error Volume Free Trans Mnt
Name Status Count Label Blocks Count Cnt
SYSTEM$DIA0: Mounted 0 VAXVMS2H4055 148161 299 1
TROLL2$DIA2: Mounted alloc 0 ST400 1255248 1 1
TROLL3$DIA3: Mounted alloc 0 USER22 846 1 1
TROLL4$DIA4: Mounted alloc 0 OPENVMS061 113529 1 1
USER$DIA1: Mounted 0 USER21 373305 1 1

Device Device Error Volume Free Trans Mnt
Name Status Count Label Blocks Count Cnt
T88ZQ0$MIA6: Online 1

Делаем бекап оставшихся дисков:


$backup/phys TROLL2$DIA2: FILSRV::"F:\VAX\DIA2.BKP" /save

7. Ассемблер VAX


Вы прочитали множество дифирамбов VAX-у и его создателям, однако, возможно, вы еще не прониклись величием этой архитектуры. Посмотрим же на основные моменты, которые, я уверен, вас обязательно покорят, если вы когда-либо программировали на ассемблере.


Я постараюсь кратко описать технические характеристики и особенности архитектуры.


1. Регистры


В процессоре VAX-11 16 регистров общего назначения, последние 4 имеют специализацию:


R12 = AP - Указатель аргументов.

R13 = FP - Указатель кадра.

R14 = SP - Указатель стека.

R15 = PC - Программный счетчик.


2. Типы


Цельночисленные:

B - Байт (8 bit);

W - Слово (16 bit);

L - Длинное слово (32 bit);

Q - Тетраслово (64 bit);

O - Октаслово (128 bit).


P - упакованное десятичное число (этот тип обрабатывают не все команды)


С плавающей точкой:

F - одинарная точность (32 bit);

D - двойная точность (64 bit);

G - тип G (64 bit) (отличается от D меньшей длиной мантиссы);

H - тип H (128 bit) (112 bit мантисса, 15 bit порядок).


Прочие:

C - символьная строка

V - двоичное поле переменной длины


3. Команды


Так как прародителем является PDP-11, то прослеживается некоторое сходство, но явно с большим размахом.


Пересылка:

MOVx откуда, куда

x - это тип данных (cм. типы)

Пример: MOVD 10(R1),(R11)+


Умножение:

MULx2 операнд1, операнд2 результат в операнд2

MULx3 операнд1, операнд2, результат

2 и 3 - это количество операндов.

Т.е. можно:

MULQ3 (R1)+,(R2)+,(R3)+

Это пример кусочка пакетного перемножения, в регистрах адреса в памяти операндов.


Инструкция для работы с двумерными массивами (в принципе, ее можно использовать и для многомерных массивов):

INDEX sub,low,high,size,ixin,ixout



Задача инструкции - облегчить доступ к элементам массива.


Преобразование символьного кода в десятичный упакованный:

CVTSP число цифр без учета знака, адрес цепочки, число цифр, адрес результата.

Т.е., на входе у нас символьная строка кодов ASCII - на выходе число!

И не надо никаких функций преобразования строки в число!


Управление циклами:

SOBGTR x,адрес //вычесть 1, перейти, если больше 0

SOBGEQ х,aдрес //вычесть 1, перейти, если больше или равно 0


Преобразование типов:

CVTxy

xy - типы данных.

Всего 40 комбинаций.


Переходы.

Появились модификации, где смещение - слово, т.к. в PDP-11 приходилось вставлять JMP-ы после условий в дальних переходах.


Из экзотических команд есть:

POLYF и POLY - вычисление полинома.


Команда MOVAx позволяет получить адрес объекта.

Пример:

ABC: .BLKL 30 ; массив элементов

...

MOVAL ABC,R0 ; указатель адреса в R0

Этой команды не хватало в PDP-11 для полностью перемещаемых программ и приходилось извращаться конструкцией

MOV PC,@#OFFSET ; сохраним начальный адрес

SUB #1002,@#OFFSET ; сразу вычтем адрес компиляции и смещение при запуске

затем

;   MOV #TNAM01,R1 ; метка, скомпилированная при начальном адресе =1000

;   ADD @#OFFSET,R1 ; добавим реальное смещение - в итоге в R1

;     ; получим реальный адрес, независимый от запуска программы



4. Методы адресации


Сначала перечислим 12 методов адресации, знакомых нам по PDP-11.


1. Регистровый режим Rn

Пример: MOVL2 R1,R10 - переслать R1 в R10.


2. Непосредственный режим #n

Пример: МОVL2 #154,R8 - переслать константу 154 в R8.


3. Регистровый косвенный режим (Rn)

Пример: MOVL2 (R0),R3 - переслать данные по адресу в R0 в регистр R3.


4. Автоинкременный режим (Rn)+

Пример: MOVL2 (R0)+,R3 - переслать данные по адресу в R0 в регистр R3.

После выполнения значение R0 будет увеличено на длину операнда в байтах, в данном случае на 4.


5. Автодекрементный режим -(Rn)

Пример: MOVL2 -(R0),R3 - переслать данные по адресу в R0 в регистр R3.

До выполнения пересылки, значение R0 будет уменьшено на длину операнда в байтах, в данном случае на 4.


6. Относительный A

Пример: MOVL2 2500,R1 - переслать значение ячейки 2500 в регистр R1.

Адрес 2500 относительный.
7. Косвенный @A


8. Абсолютный @#A

MOVL2 @#2500,R1 - переслать значение ячейки 2500 в регистр R1.

Отличие от относительного - адрес 2500 будет всегда 2500, вне зависимости от адреса выполнения.


9. Косвенная со смещением D(Rn)

Содержимое Rn суммируется с D. Получаемая сумма используется как адрес адреса операнда.


10. Косвенный c автоинкрементом @(Rn)+

Содержимое Rn используется как адрес адреса операнда, а затем увеличивается.


11. Косвенный c автодекрементом @-(Rn)

Содержимое Rn уменьшается, а затем новое содержимое используется как адрес адреса операнда.


12. Косвенный со смещением @D(Rn)

Содержимое Rn суммируется с D. Получаемая сумма используется как адрес адреса операнда.


Новые режимы адресации, которые появились в VAX-11.


13. Относительный - индексный A[Rn]

Пример: CLRL 10[R0]

14. Относительный индексный, автоинкрементный регистровый (Rn)+[Rm]

Пример: CLRL (R2)+[R0]

Значение в регистре R0 умножается на 4 (оперируем 32-битным числом в котором 4 байта), складывается со значением адреса в регистре R2, после чего производится очистка ячейки, расположенной по вычисленному адресу.

15. Относительный индексный, автодекрементный регистровый -(Rn)[Rm]

16. Относительный индексный, регистровый (Rn)[Rm]

17. Абсолютная с индексированием @#A[Rn]

18. Относительный косвенный с индексированием @A[Rn]

19. Адресация со смещением и индексированием A(Rn)[Rm]

20. Косвенная со смещением, автоинкрементом и индексированием @(Rn)+[Rm]

21. Косвенная со смещением, автодекрементом и индексированием @-(Rn)[Rm]

22. Косвенная со смещением и индексированием @A(Rn)[Rm]


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


В VAX-11 реализовали все мыслимые варианты адресации, и можно считать VAX-11 самым "CISC" процессором, созданным за всю историю вычислительной техники человечества


Заключение


Надеюсь, знакомство с архитектурой VAX "живьем" было интересным, и вы продолжите следить за моими экспериментами, которые я буду освещать на форуме PDP-11.RU. К сожалению, я не успел в этой статье осветить более детально программирование на ассемблере VAX-11 и провести сравнительное тестирование эффективности кода, но я думаю, что это не страшно - статья уже и так получилась достаточно объемная.


Заключительное фото - сервер установлен в моей домашней серверной:





Обсудить статью в специально созданной ветке форума. Эта статья прислана на конкурс.

© Текст, фотографии - SuperMax

© Железные призраки прошлого - 2015 г.

Опубликовано 21.05.2015 г.


Дополнения или поправки на phantom@sannata.ru

 


На главную страницу сайта

На страницу конкурсов



Авторские права и условия копирования материалов