Открыть Электронные книги
Категории
Открыть Аудиокниги
Категории
Открыть Журналы
Категории
Открыть Документы
Категории
Можно
решить одну из двух задач на выбор или обе.
Описание задачи
Sand - игрушечный sandbox, реализованный с использованием технологии VTX. Он может
запускать 32-битный код под контролем гипервизора.
Требуется внести ряд улучшений в его работу.
Замечание:
руководство по настройке рабочего окружения использует материалы из
статьи: http://ncmiller.github.io/2016/05/14/linux-and-qemu.html
Рабочее окружение
Для тестирования гипервизора потребуется компьютер с поддержкой технологии
аппаратной виртуализации VTX и расширением EPT.
Замечание:
Проверить, поддерживаются ли процессором необходимые расширения, можно просмотрев
содержимое файла /proc/cpuinfo. В поле flags должны встречаться значения vmx и ept.
Так как гипервизор – модуль ядра, тестировать его на рабочей машине непосредственно
может быть плохой идеей. Поэтому для экспериментов будет использоваться Qemu/KVM.
Создадим минимальную сборку системы GNU/Linux для запуска в Qemu, а модуль ядра
будем линковать в ядро гостевой Linux.
Замечание:
Данная инструкция описывает создание рабочего окружения для дистрибутива Ubuntu, но
использование Ubuntu не является обязательным. Для других дистрибутивов процедура
настройки рабочего окружения будет аналогичной.
Замечание:
Возможно, при сборке выяснится, что упущены еще какие-то зависимости. Тогда требуемые
пакеты также следует установить.
Надо включить опцию "Build BusyBox as a static binary" в Busybox Settings, опцию можно найти
через поиск Kbuild (введите '/', как в vi).
make -j4
make install
● Создадим init-скрипт:
touch init
chmod +x init
#!/bin/sh
mount -t proc none /proc
mount -t sysfs none /sys
mount -t devtmpfs none /dev
echo -e "Hello, Mr. Sandman!\n"
exec /bin/sh
● Соберем initramfs:
find . -print0 \
| cpio --null -ov --format=newc \
| gzip -9 > $PROJ/build/initramfs.cpio.gz
qemu-system-x86_64 \
-kernel build/linux-5.5.11/arch/x86_64/boot/bzImage \
-initrd build/initramfs.cpio.gz \
-nographic -append "console=ttyS0" \
-cpu host \
-machine q35 \
-enable-kvm
Замечание:
Выйти из терминала Qemu можно, нажав Ctrl+A, C и следом q.
Для начала соберем утилиту sandctl, которая понадобится для работы на initramfs. Перейдем
в sand/source/linux-5.5.11/drivers/misc/sand и выполним команды.
cp sandctl $PROJ/build/initramfs/usr/bin
find . -print0 \
| cpio --null -ov --format=newc \
| gzip -9 > $PROJ/build/initramfs.cpio.gz
Пересоберем ядро после наложения патча, для этого, находясь в каталоге sand/build/linux-
5.5.11 выполним:
make -j4
Запустим Qemu, чтобы проверить, что все работает. Команда уже указывалась выше.
Задания
Замечание:
Не обязательно выполнять все задания. Пожалуйста выполните те задания, которые
сможете.
4. Чтобы гостевой код мог получать данные из внешнего мира, реализуйте обработку
гипер-вызовов. Напишите код, демонстрирующий получение значения от гипервизора и
выполнение вычислений с использованием этого значения.
7. Если в госте исполнить INT3 (инструкция 0xCC), то получится Triple Fault. Реализуйте
возможность обработки простейших исключений в sandbox. Пусть в момент, когда
приходит гостевое исключение, хост получает уведомление через гипер-вызов.
Дополнительные вопросы
Начальный набор справок, которые гражданин имеет на руках может быть непустым.
Требуется:
Определить, что целевые справки в принципе можно получить при заданных правилах
работы контор
Дополнительные условия:
Пусть каждая справка имеет срок действия, а конторе для выдачи справки требуется
время.
Таким образом, может случится ситуация, при которой срок действия какой-либо
имеющейся на
руках справки истечет, при этом другие справки из целевого набора еще не будут
выданы.
Требуется определить, что при заданных правилах работы контор с учетом сроков
действия справок и сроков подготовки справок может быть получен целевой набор
справок так, что ни для одной из них срок действия еще не истек.