Кто мог представить, что 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 компилируется.

Но он слишком медленный, чтобы его можно было использовать.

Дерьмо.

использованная литература