В 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
Скачайте его с сайта 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)
-
Для начала соберите ядро и файловую систему (просто
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
. Обратите внимание, что все эти программы имеют окна одинакового размера и открываются в верхнем левом углу экрана, поэтому вам может понадобиться немного подвинуть окна. -
Чтобы выключить - просто нажмите кнопку питания. :-)
См. deobfuscated/README-RU
.
- http://pdos.csail.mit.edu/6.828/2011/xv6.html - XV6, простая UNIX-подобная ОС с исходниками всего на 277 килобайт! Это всего лишь в 78 раз больше, чем Gavin!
- http://wiki.osdev.org - wiki о разработке ОС
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.