vak: (Default)
[personal profile] vak
Два крутых чувака сделали это возможным. Andras Tantos разработал симулятор для машин той архитектуры: Cray XMP/YMP-el/J90/SV1. Рекомендую серию статей в его блоге с подробным описанием исследования и разгадки устройства компьютера и софта. Jason Stevens (neozeed) установил на это дело юникс с компакт-дисков Unicos/10.0 (Cray-J90, Cray-SV1). Здесь я покажу, как запустить Крэй с юниксом на вашем компьютере.

Делать это надо на Линуксе. На маке или BSD даже не пытайтесь: слишком много завязок в реализации симулятора. Я вообще использую Raspberry Pi 5. Симулятор грузит одно из ядер процессора на 100%, что увеличивает потребление Raspberry Pi на два ватта. Весьма экономичный суперкомпьютер получается. 😀

1. Устанавливаем нужные линуксные пакеты

Здесь для Ubuntu, а для других линуксов действуйте по аналогии.
sudo apt install build-essential libboost-all-dev libncurses-dev libgpm-dev 7zz telnet net-tools bridge-utils

2. Собираем симулятор

Скачиваем исходники и компилируем.
git clone https://github.com/andrastantos/cray-sim.git
cd cray-sim/simulator
make build -j1
Установим бинарник симулятора в папку /usr/local/bin. Убедитесь, что она у вас находится в PATH.
sudo cp _bin/linux_release/cray_sim /usr/local/bin/

3. Скачиваем Unicos

В принципе, можно было бы установить систему с компакт-диска, но это тяжёлый процесс. Проще скачать готовые образы файловых систем с предустановленным Unicos. Приготовьте 7 гигабайт места.
wget https://archive.org/download/uni-cos-10.0.1.2-linux-x-86-64.7z/UniCOS-10.0.1.2_linux_x86_64.7z
7zz x -ounicos UniCOS-10.0.1.2_linux_x86_64.7z
Распакованные файлы оказываются в папке unicos:
$ tree unicos 
unicos
├── CON0
├── core.img
├── cray_sim
├── cray_sim.dbg
├── create-tap.sh
├── disk
├── dump
│ ├── ramfs.log
│ └── ramfs.mem
├── dump.img
├── krn_11
│ ├── clrymp
│ ├── grsysdmp
│ ├── mfboot
│ ├── mfchkye
│ ├── mfsysdmp
│ └── unicos.generic
├── krn_11.bgz
├── ram_fs
├── root.img
├── src.img
├── swap.img
├── tape
├── tmp.img
├── unicos
├── unicos.cfg
├── unicos.generic
├── unicos.param
├── unicos_ramfs
├── unicos_ramfs.cfg
├── unicos_ramfs.param
├── unicos.ymp.10012
├── usr.img
└── usr_tmp.img

5 directories, 30 files
Здесь нас будет интересовать файл конфигурации unicos.cfg.

4. Поправим конфигурацию

В принципе, всё готово к старту, но давайте изменим конфигурацию, чтобы симулятор не запускал кучу окошек xterm с консолями юникса. Лучше мы будем вручную коннектиться из другого окна посредством telnet. В текстовом редакторе в файле unicos.cfg исправьте строчку:
NewTerminalCommand          "xterm -e {cmd}&"
на:
NewTerminalCommand          "echo Use: {cmd}"

5. Включим виртуальный сетевой интерфейс

Симулятору требуется сетевой мост. В файле create-tap.sh находятся команды для его конфигурации. Выполним их от суперпользователя.
$ cd unicos
$ sudo sh -x create-tap.sh
+ brctl addbr craybr
+ ip tuntap add mode tap tap1
+ ifconfig tap1 up
+ brctl addif craybr tap1
+ ifconfig craybr 172.16.0.1 netmask 255.255.255.0

6. Запускаем

cray_sim unicos.cfg
Получаем текстовое окно симулятора.



Теперь с другого окошка заходим на консоль через telnet:
$ telnet localhost 20000
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
00:00:00(GMT) uts/c1/md/icpu.c-02: INFO Final IOAVAIL_mask is 01

Unicos/10.0.1.2: snxxxx-sin.0 (CRAY J90)

System gen time = 12/04/22 22:09:33
UNICOS binary size = 2275063 words
Memory configured = 268434432 words
Memory allowed = 33552384 words
Memory downed = 234881024 words @ address 00177774000
sysmem = 1876013 words
maxmem = 24415232 words
Buffer pool size = 262144 words (512 buffers)
User memory avail = 21190656 words

CPUs configured = 1, started = 1 (0)

System-Call Timing On

15:21:53(GMT) uts/fs/nc1/nc1vfsops.c-09: INFO Root path is /dev/dsk/root
15:21:53(GMT) uts/c1/os/sched.c-13: INFO MPX scheduling is not configurable.
15:21:53(GMT) uts/c1/os/sched.c-11: INFO packtime calc'd as 20 seconds.
15:21:53(GMT) uts/c1/os/sched.c-05: INFO gfactor1_in calc'd as 513 seconds.
15:21:53(GMT) uts/c1/os/sched.c-06: INFO gfactor1_in limited to 400 seconds.
15:21:53(GMT) uts/c1/os/sched.c-10: INFO gfactor1_out set to 0 seconds.
Похоже на некий начальный загрузчик. Продолжаем: жмём Enter.
Sun Feb  4 15:55:00 2024

The system date is set to Sun Feb 4 15:55:34 CST 2024

Checking /dev/dsk/root before running /etc/brc.guest.

/root: file system opened
/root: super block fname root, fpack root
/root: Phase 1 - Check Blocks and Sizes
/root: Phase 2 - Visit Directories
/root: Phase 3 - Checking Directories
/root: Phase 4 - Checking Non-Directories and Link Counts
/root: Phase 5 - Verify Dynamic Information - (Ignored)
/root: Phase 6 - Rebuilding Dynamic Information
/root: file system summary
/root: 32768 total i-nodes (31294 free i-nodes)
/root: 262144 total blocks (181073 free blocks)
/root: ***** FILE SYSTEM WAS MODIFIED *****

Executing /etc/brc.guest.
Linking Guest configuration files for HOST system startup:

No filenames exist in /etc/config/guest_config
mfsck: Starting pass 1
/root: file system opened
/root: super block fname root, fpack root
/root: Phase 1 - Check Blocks and Sizes
/root: Phase 2 - Visit Directories
/root: Phase 3 - Checking Directories
/root: Phase 4 - Checking Non-Directories and Link Counts
/root: Phase 5 - Verify Dynamic Information - (Ignored)
/root: Phase 6 - Rebuilding Dynamic Information
/root: file system summary
/root: 32768 total i-nodes (31293 free i-nodes)
/root: 262144 total blocks (181072 free blocks)
/root: ***** FILE SYSTEM WAS MODIFIED *****
mfsck: Starting pass 2
/usr: file system opened
/usr: super block fname usr, fpack usr
/usr: Phase 1 - Check Blocks and Sizes
/src: file system opened
/src: super block fname src, fpack src
/src: Phase 1 - Check Blocks and Sizes
/src: Phase 2 - Visit Directories
/usr: Phase 2 - Visit Directories
/usr: Phase 3 - Checking Directories
/usr: Phase 4 - Checking Non-Directories and Link Counts
/usr: Phase 5 - Verify Dynamic Information - (Ignored)
/usr: Phase 6 - Rebuilding Dynamic Information
/usr: file system summary
/usr: 32768 total i-nodes (22433 free i-nodes)
/usr: 1048576 total blocks (934231 free blocks)
/usr: ***** FILE SYSTEM WAS MODIFIED *****
/src: Phase 3 - Checking Directories
/src: Phase 4 - Checking Non-Directories and Link Counts
/src: Phase 5 - Verify Dynamic Information - (Ignored)
/src: Phase 6 - Rebuilding Dynamic Information
/src: file system summary
/src: 32768 total i-nodes (22043 free i-nodes)
/src: 262144 total blocks (189575 free blocks)
/src: ***** FILE SYSTEM WAS MODIFIED *****
mfsck: complete (0 min, 5 sec)


brc: Errors will be logged to /etc/brc.log

/core: file system opened
/core: can not find super block
/core: continue? yes
/core: super block fname , fpack
/core: lseek or read refused, block = -1, errno = 22
/core: Invalid argument
/core: Attempt to verify sb.s_fsize by reading last block of
filesystem failed.
/core: abort(y) or proceed with zeros in read buffer(n)? yes
/core: check aborted
/etc/mount: cannot mount /dev/dsk/core
Exec format error
coredd: /etc/mount /dev/dsk/core /mnt failed.
coredd: Manual intervention may be required.
brc: /etc/coredd exited with status 1.
System dump apparently not saved.
Startup output is being routed to /etc/rc.log.
Starting file system error log daemon
*Warning*: Using the root file system space for /tmp!

Checking file system /dev/dsk/usr.
/usr: file system opened
/usr: super block fname usr, fpack usr
/usr: clean exit for clean file system
Mounting file system /dev/dsk/usr on /usr.
/etc/mount: /usr mounted
Mounting user file systems.
User file systems successfully mounted.
Mounting file system /proc.
/etc/mount: /proc mounted
Mounting file system /inode.
/etc/mount: /inode mounted
15:55:45(CST) uts/c1/md/memc.c-03: WARNING
Single-bit memory error interrupts enabled.
MEUNCMAX = 64
MECORMAX = 2
MEINT = 50 sec (5000000000 clocks)
MEDISINT = 600
UMELIFE = 86400
UMEMAX = 0
UMEDOWN = 0
Starting the security log daemon.
15:55:46(CST) uts/c1/io/slog.c-01: WARNING slgtimes: no time change record in security log.
Setting security wild card files.
Setting network access lists.
Administrative clean up.
Writing accounting boot time.
Starting system accounting.
Starting system activity collection.
Starting SYS1 daemons: msgdaemon fsdaemon.
Binary hosts file is up-to-date.
Configuring TCP/IP network interfaces: lo0
en0 ethernet address: 2:1:43:52:41:59
en0.
Making dbm aliases file: WARNING: local host name (snxxxx) is not qualified; fix $j in config file
dbm map "Alias0": unsafe map file /usr/lib/aliases: Permission denied
Cannot rebuild aliases: no database format defined
Cannot create database for alias file /usr/lib/aliases
Starting TCP daemons: inetd portmap.
DCE was not started; skipping DFS startup.
Starting SYS2 daemons: errdemon cron.
Startup completed successfully.

Console Login: _

7. Входим в систему

Войти можно под именем суперпользователя root с паролем password, или как юзер neozeed с паролем password. При входе получаем грозное предупреждение.
Console Login: root
Password: ***

Active label set to : level0,none

This is a private computer facility. Access for any reason must be
specifically authorized by the owner. Unless you are so authorized,
your continued access and any other use may expose you to criminal
and/or civil proceedings.

snxxxx# uname -a
snxxxx snxxxx 10.0.1.2 sin.0 CRAY SV1

snxxxx# _
Кроме консоли, симулятор создаём ещё два терминала, к которым можно подсоединиться командами "telnet localhost 20001" и "telnet localhost 20002".
$ telnet localhost 20001
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

login: neozeed
Password: ***
...

snxxxx% df -P -k
Filesystem 1024-blocks Used Available Capacity Mounted on
/dev/dsk/root 1048576 324536 724040 31% /
/dev/dsk/usr 4194304 458004 3736300 11% /usr
/dev/dsk/src 1048576 290276 758300 28% /usr/src
/proc 190744 35624 155120 19% /proc
Остановить юникс можно командой "init 0" от суперпользователя. Чтобы остановить симулятор, надо ввести в его окошке "exit" и нажать Enter.

Что интересного можно попробовать в этом юниксе - напишу позже.

Date: 2024-02-05 03:54 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Первое, что нужно попробовать, это https://homepages.cwi.nl/~steven/enquire/enquire.c безальтернативно.

Date: 2024-02-05 16:30 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Может быть и бага в компиляторе. Например, как я недавно выяснил, если в K&R C для PDP-11 объявить больше трех register переменных, он валился по внутренней ошибке.

Date: 2024-02-06 01:48 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Вполне может быть. Если так, то проще заменить "long double" на double максимум в 17 местах, и посмотреть, что выйдет.

Date: 2024-02-06 18:15 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
16 байт long double - это явно дань фортрановскому double precision.

Теоретически можно в enquire.c заменить все явные константы на defines, определенные как операции деления, и посмотреть, что будет.

Date: 2024-02-06 17:52 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Это уже можно и как баг симулятора зафайлить.

Date: 2024-02-06 23:27 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Молодцы крэевцы, чо. Пожалели нескольких строк кода, чтобы нормально выдать сообщение "Cannot load arith. library".

А тебе теперь одна дорога - в https://retrocomputing.stackexchange.com/ :)

Трюк с макросами с делением - только на степени двойки, конечно: т. е. 1.5 - это строго (double)3/2, а не (double)15/10 - должен сработать, значит.