Skip to content

Latest commit

 

History

History
128 lines (103 loc) · 10.2 KB

README-RU.markdown

File metadata and controls

128 lines (103 loc) · 10.2 KB

Что такое Gavin?

В 2004 году Gavin Barraclough создал мультизадачную графическую операционную систему для i386 с файловой системой и поддержкой мыши (у ОС нет имени, поэтому я назову её Gavin), Она написана на Си, у неё всего один файл с исходным кодом и его размер 3.5 килобайт! Потом Gavin отправил свою ОС на IOCCC (the International Obfuscated C Code Contest/Международный Конкурс непонятного кода на Си) и победил. Конечно, его код совершенно непонятен, например:

F
U (Y (t + 28) + 1536) |=
62 & -n;
M
U (d + D) =
X (D, Y (t + 12) + 26628, 412162) ? X (D, Y (t + 12) + 27653,
					410112) ? 31 : 0 : U (d + D);
for (; j < 12800; j += 8)
	P (d + 27653 + Y (t + 12) + ' ' * (j & ~511) + j % 512,
		U (Y (t + 28) + j / 8 + 64 * Y (t + 20)), 0);
}

В 2011 году я деобфусцировал (распутал) и откомментировал этот код. Например, это тот же код:

case msg_render:
	/* This code draws content of window (black frame, white area and text) */
	{
		char *dest = (char *)arg;
		if (shell){
			(*content)[(LINES - 1) * COLUMNS] = '>';
		}
		/* Frame */
		draw_rectangle(dest + my_task->begin, TITLE_HEIGHT + 8, 4,            LINES * SYMBOL_HEIGHT + 3, COLUMNS * SYMBOL_WIDTH + 2, BLACK);
		/* Area */
		draw_rectangle(dest + my_task->begin, CONTENT_TOP,      CONTENT_LEFT, LINES * SYMBOL_HEIGHT + 1, COLUMNS * SYMBOL_WIDTH,     WHITE);
		/* Text */
		for (int i = 0; i != LINES; ++i){
			for (int j = 0; j != COLUMNS; ++j){
				draw_symbol(dest + my_task->begin + (CONTENT_TOP + i * SYMBOL_HEIGHT) * SCREEN_WIDTH + CONTENT_LEFT + j * SYMBOL_WIDTH, (*content)[(*line + i) * COLUMNS + j], BLACK);
			}
		}
	}
	break;

Что в этом пакете?

Этот пакет содержит всё, что вы хотите знать про Gavin, а именно:

  • Некоторые файлы, которые могут вам помочь запустить оригинальный Gavin. Они в каталоге orig
  • Деобфусцированный Gavin. Он в каталоге deobfuscated

Как запустить оригинальный Gavin?

Скачайте его с сайта IOCCC (в этом архиве есть и другие победители IOCCC).

Следуйте инструкциям в файлах gavin.hint и gavin_install.txt (или воспользуйтесь русским переводом в файлах orig/gavin_ru.hint и orig/gavin_install_ru.txt из этого пакета), но обратите внимание на следующее:

  • Чтобы собрать только Gavin, наберите make gavin

  • Самый простой способ запустить Gavin - это Qemu. Сперва попробуйте его. Потом - остальное

  • Чтобы загрузиться из Qemu, наберите: qemu -m 256 -kernel /путь/к/kernel -initrd /путь/к/fs.tar /dev/null (естественно, нужно сперва собрать Gavin)

  • В Qemu будут странные цвета

  • LILO устарел. lilo.conf и boot.b не нужны. Используйте любой современный загрузчик Linux. Я рекомендую GRUB 2 (но не используйте слишком современный загрузчик: GRUB 1.98 работает, а GRUB 1.99 - нет). Если у вас GRUB 2, нажмите "c" при загрузке и наберите:

    linux16 /путь/к/kernel initrd16 /путь/к/fs.tar boot

  • Дискеты устарели. Gavin можно грузить с любого диска

  • Нужен очень старый gcc 3.x (он должен быть 32-битным, ОС может быть как 32-битной, так и 64-битной)

  • Если не получается скомпилировать Gavin, воспользуйтесь скомпилированными orig/kernel и orig/fs.tar из этого пакета для реального железа и orig/qemu-kernel и orig/qemu-fs.tar для Qemu

  • Этот пакет содержит исходники утилиты prim в файле orig/prim.c (спасибо жюри IOCCC)

Как запустить деобфусцированный Gavin (основано на комментариях Gavin'а)

  • Для начала соберите ядро и файловую систему (просто make). (Этот шаг можно пропустить, так как этот пакет содержит скомпилированные deobfuscated/kernel и deobfuscated/fs.tar для реального железа и deobfuscated/qemu-kernel и deobfuscated/qemu-fs.tar для Qemu.) Если кратко, то собирать нужно на x86-компьютере с GNU/Linux'ом. Если вы хотите собрать на другой ОС, нужно изменить Makefile чтобы скомпилировать sh, vi и prim используя кросс-компилятор, который генерирует ELF-бинарники - то есть кросс-компилятор с target'ом x86 GNU/Linux. Также, нужен очень старый gcc 3.x (он должен быть 32-битным, ОС может быть как 32-битной, так и 64-битной).

  • Теперь найдите подходящий компьютер. Запуск будет совершенно безопасен, так как ОС не пытается обратится к жёстким дискам (только к ramdisk, загруженному загрузчиком ядра), это не причинит вреда установленным системам, НО Я НЕ НЕСУ НИКАКОЙ ОТВЕТСТВЕННОСТИ ЗА ЛЮБОЙ УЩЕРБ, ПРИЧИНЁННЫЙ ЭТОЙ ПРОГРАММОЙ. Вы запускаете её на свой риск. ОС была протестирована на полдюжине машин или около того и работала на всех, кроме одной. Она перезагружалась во время загрузки ОС без опасных побочных эффектов.

  • Системные требования - процессор i386 или лучше, но графический интерфейс необычайно ресурсоёмкий, поэтому я рекомендую быстрый процессор (протестировано на Pentium 3/Pentium 4/Athlon). Минимальная рекомендуемая память - что-то вроде 32 мегабайт. Нужны PS2 мышь и клавиатура (никакого USB, я боюсь). Использует VESA VBE 3.0, поэтому должно работать на любой современной графической карте (протестировано на картах Nvidia, Matrox и SiS).

  • Теперь вам нужна виртуальная машина (это самый простой способ) или загрузчик ядра.

  • Виртуальная машина. Я рекомендую Qemu. Просто наберите qemu -m 256 -kernel /путь/к/kernel -initrd /путь/к/fs.tar /dev/null. Но в этом случае надо было собирать Gavin командой make QEMU=1.

  • Загрузчик (GRUB 2). Не используйте слишком современный загрузчик: GRUB 1.98 работает, а GRUB 1.99 - нет. Нажмите "c" в меню загрузки чтобы войти в командную строку, потом наберите linux16 (hd0,1)/путь/к/kernel (подставляя номер нужного диска/раздела), затем initrd /путь/к/fs.tar, и наконец boot.

  • Допустим, ОС загрузилась, что теперь? Ну что ж, начните с команды sh чтобы открыть ещё один командный интерпретатор. Затем попробуйте vi mkkernel.c чтобы отрыть исходный текст ядра в просмотрщике файлов (вверх/вниз или PgUp/PgDown для листания). Также попробуйте prim. Обратите внимание, что все эти программы имеют окна одинакового размера и открываются в верхнем левом углу экрана, поэтому вам может понадобиться немного подвинуть окна.

  • Чтобы выключить - просто нажмите кнопку питания. :-)

Как работает деобфусцированный Gavin?

См. deobfuscated/README-RU.

Ссылки

Сайт

https://github.com/safinaskar/gavin

Копирайт

Все исходные коды находятся в общетвенном достоянии. Документация использует следующий копирайт:

Copyright (C) 2004, Landon Curt Noll, Simon Cooper, Peter Seebach and Leonid A. Broukhis. All Rights Reserved. Permission for personal, educational or non-profit use is granted provided this copyright and notice are included in its entirety and remains unaltered. All other uses must receive prior permission from the contest judges.