Кто мог представить, что Unix будет существовать так долго?
Я большой поклонник старинных компьютеров, и среди них есть один, который все считают классикой: почтенный супермини компьютер VAX 11/780, разработанный Digital Equipment Corporation, и выпущен в 1978 году.
Название VAX происходит от аббревиатуры Virtual Address eXtension: это 32-битный компьютер, необходимая эволюция линейки 16-битных мини-компьютеров, PDP-11, на которых примерно в 1970 году были изобретены операционные системы Unix. Это центральный процессор ( CPU) работает на частоте 5 МГц (в 800 раз медленнее современных ПК).
На VAX UNIX может стать зрелой операционной системой, в частности, благодаря выпуску BSD 4.3 для Berkeley Software Distribution версии 4.3. Это было немного медленно, но более надежно, чем 4.1 и 4.2. Позже он был улучшен версией 4.4, которая была немного быстрее. BSD4.3 было достаточно просто развернуть и поддерживать.
С последним выпуском программного обеспечения для эмуляции VAX 11/780, которое теперь работает в сети, я решил запустить свою собственную виртуальную машину VAX под BSD4.3.
Тот факт, что эмулируемый VAX поддерживает работу в сети, значительно упрощает задачу, потому может легко передавать файлы из Интернета на мой компьютер (быстро), а затем на VAX с приличной скоростью.
Я следовал обычным шагам, описанным в документации, например. загрузитесь с минирута, скопируйте его на диск, загрузитесь с диска, установите ПО с ленты и т. д.
Когда ядро загружается в первый раз, оно пишет:
WARNING: clock lost 121 days -- CHECK AND RESET THE DATE!
Я подумал: хорошо, системная дата неверна, мне просто нужно установить дату, как мне это сделать? Я помню, это не менялось с 1985 года, я думаю, это должна быть команда date
:
$ date -s usage: date [-n] [-u] [yymmddhhmm[.ss]
Дерьмо. Я имею в виду дерьмо не потому, что ошибся с параметром -s
, а из-за формата времени. Да, год — это двухзначное число, и если я введу 17, система подумает, что это 1917 год. Дерьмо. Я взглянул на источник даты, и действительно, программа добавляет константу 1900 к двум цифрам: year += 1900;
(строка 193 из date.c). Хреново дерьмо и дерьмо.
Я думал, какой самый быстрый способ установить систему на текущую дату? Напишите небольшую программу на C с жестко заданной датой и установите ее с помощью соответствующего системного вызова? Это заноза в заднице, поэтому я решил сделать то, что казалось простым: изменить значение переменной _time в памяти ядра. Время Unix представляет собой 32-битное целочисленное значение, которое отсчитывает секунды с 1 января 1970 года.
Я искал в Интернете конвертер времени unix и быстро нашел сайт http://www.unixtimestamp.com/, который выглядел подходящим.
Текущее время 1493139799, поэтому мне просто нужно ввести это значение в адрес памяти _time. 1493139799 не в шестнадцатеричном формате, и я не могу вспомнить, как вводить десятичное число с помощью отладчика adb . Да, я планировал использовать adb, хотя он и доисторический, но у него есть несколько полезных функций для проверки и модификации работающего ядра, так что раньше я его хорошо знал.
1493139799 в десятичном формате - это 0x58FF8157 в шестнадцатеричном формате (база 16), как говорит Google:
Все готово Но НАЧАЛО!
`$ adb -w /vmunix /dev/kmem time/W0x58FF8157 _time: b72c490 = 56df8157
ВТФ? Я прошу записать значение 0x58FF8157, а фактически сохраненное значение равно 56df5e0e? Дата сейчас вторник, 8 марта, 15:21:00 по тихоокеанскому времени 2016 года, около года назад.
Не буду врать, мне потребовалось некоторое время, чтобы найти это. Я начал с проверки 16 левой и правой частей 32-битной переменной _time. Самые младшие цифры правильно менялись каждую секунду, и я также мог изменить старшие 2 байта:
`_time: 81c0 _time+2: b72c /w5600 _time+2: b72c = 5600 time/X _time: _time: 560081e7
Так что я мог бы установить 0x5600‹что-то›, почему бы не 58? Давайте попробуем снова установить старшие байты:
_time+2: 5600 /w58ff _time+2: 5600 = 58ff time/X _time: _time: 58ff8211
Странно, сработало.
Потом я увидел разницу. То, что я вводил, было вырезанием и вставкой вывода Google: 0x58FF8157, и это не работало, но когда я ввел 0x58ff вручную, все заработало. 0x58FF и 0x58ff.
да. Вот в чем была проблема: adb не любит заглавные буквы в шестнадцатеричном числе или любит их, но Бог знает, что он с ними делает, я не хочу знать. Если я использую строчные буквы, например. 0x58ff8157 работает отлично.
Мне повезло (или не повезло?), что в младших 16 битах не было букв, поэтому я не мог понять, почему одна половина может быть написана правильно, а другая нет.
$ date Tue Apr 25 14:42:21 PST 2017
Теперь можно приступать к серьезной работе. Давайте подключимся к ftp.gnu.org…
ftp> get emacs-18.59.tar.gz 200 PORT command successful. Consider using PASV. 150 Opening BINARY mode data connection for emacs-18.59.tar.gz (2962652 bytes). 226 Transfer complete. local: emacs-18.59.tar.gz remote: emacs-18.59.tar.gz 2962652 bytes received in 71 seconds (40 Kbytes/s) ftp>
Я счастлив. Emacs компилируется.
Но он слишком медленный, чтобы его можно было использовать.
Дерьмо.
использованная литература
- Эмулятор SIMH. Я использую последнюю бета-версию с github, которая включает в себя работу с сетью и эмуляцию VAX 11/780.
- Где можно найти ленты BSD4.3.
- Как установить BSD4.3 на VAX.
- Исходники BSD 4.3 (в HTML).
- Как настроить сеть (работает просто замечательно, если вы используете то же устройство, что и Windows)
netstat -rn
от cygwin. - Документация VAX 11/780 SIMH.
- Некоторые уже скомпилированные GNUdies в формате ленты SIMH.
- GNUdies, явно старые http://ftp.gnu.org/old-gnu