Домашние задания
Всего планируется около шести простых домашних заданий. Каждое домашнее задание
оценивается в три балла, если сдано за три недели после публикации и в два
балла, если сдано за пять недель. Помимо простых домашних заданий будет
несколько сложных ближе к концу семестра. Сложные задания имеют большую
стоимость - от четырех до шести баллов. Чтобы получить допуск к зачету
необходимо набрать 12 баллов. Набрать эти баллы можно разными способами - или
сдать четыре простых домашних задания вовремя, или все шесть невовремя, или
решить около двух-трех сложных. Помимо этого можно получить зачет автоматом,
если набрано строго больше 22 баллов(все простые задачи сданы вовремя и сделана
одна не самая простая сложная). Время сдачи домашнего задания отсчитывается от
момента его публикации. Сдача первых двух домашних заданий начинает
отсчитываться с момента публикации этих правил.
Правила немного изменились. Решили отказаться от сложных домашних заданий и увеличить
количество простых. Разбалловка остается прежней - 12 баллов на допуск, > 22 на автомат.
HW 1
Сдача без штрафов: 7 апреля. Сдача со штрафом: 21 апреля
Для групп 38-39: сдача без штрафов: 13 мая. Сдача со штрафом: 27 мая
Необходимо написать упрощенный командный интерпретатор(shell).
shell должен:
- В бесконечном цикле, как настоящий shell
- Считывать со стандартного ввода программу, которую необходимо
запустить, вместе с ее аргументами. Программа задается в виде полного
пути до исполняемого файла.
- Выполнять заданную программу с заданными аргументами
- Дожидаться завершения программы и выводить в стандартный поток
вывода код ее завершения
- Необходимо обрабатывать ошибки всех используемых системных вызовов
- Необходимо обрабатывать конец вводу со стандартного потока
HW 2
Сдача без штрафов: 7 апреля. Сдача со штрафом: 21 апреля
Для групп 38-39: сдача без штрафов: 27 мая. Сдача со штрафом: зачетная неделя(включительно)
Необходимо написать подмножество утилиты find.
Программа должна:
- Первым аргументом принимать абсолютный путь, в котором будет производиться поиск файлов
- По-умолчанию выводить в стандартный поток вывода все найденные файлы по этому пути
- Поддерживать аргумент -inum num. Аргумент задает номер инода
- Поддерживать аргумент -name name. Аргумент задает имя файла
- Поддерживать аргумент -size [-=+]size. Аргумент задает фильтр файлов по размеру(меньше, равен, больше)
- Поддерживать аргумент -nlinks num. Аргумент задает количество hardlink'ов у файлов
- Поддерживать аргумент -exec path. Аргумент задает путь до исполняемого файла, которому в качестве единственного аргумент нужно передать найденный в иерархии файл
- Поддерживать комбинацию аргументов. Например хочется найти все файлы с размером больше 1GB и скормить их утилите /usr/bin/sha1sum.
- Выполнять поиск рекурсивно, в том числе во всех вложенных директориях.
Сильные духом призываются к выполнению задания с использованием системного вызова getdents(2). Остальные могут использовать
readdir и opendir для чтения содержимого директории.
HW 3
Сдача без штрафов: 14 апреля. Сдача со штрафом: 28 апреля
Для групп 38-39: сдача без штрафов: 27 мая. Сдача со штрафом: зачетная неделя(включительно)
Кусочек JIT компилятора
Программа должна:
- Выделить память с помощью mmap(2)
- Записать в выделенную память машинный код, соответсвующий какой-либо функции
- Изменить права на выделенную память - чтение и исполнение. See: mprotect(2)
- Вызвать функцию по указателю на выделенную память
- Освободить выделенную память
Что может помочь при выполнении задания?
- man mmap(2), munmap(2), mprotect(2)
- GDB: help disassemble
- man objdump
Сильные духом призываются к возможности модификации кода выполняемой функции
в runtime. Например, вы можете получить аргументом вызова вашей программы
какое-то число и пропатчить машинный код этим числом. Эта часть задания будет
оцениваться дополнительно в два балла.
HW 4
Сдача без штрафов: 25 апреля. Сдача со штрафом: 9 мая
Для групп 38-39: сдача без штрафов: зачетная неделя. Сдача со штрафом: зачетная неделя(включительно)
Необходимо создать статическую, и две динамических библиотеки и программу, которая будет их использовать.
Помимо этого нужен Makefile, с помощью которого можно будет собрать все части.
Статическая библиотека должна:
- Собираться статически
- Предоставлять какие-то функции
Первая динамическая библиотека должна:
- Собираться динамически
- Динамически линковаться с программой на этапе линковки
- Предоставлять какие-то функции
Вторая динамическая библиотека должна:
- Собираться динамически
- Предоставлять какие-то функции
Программа должна
- Статически линковаться с статической библиотекой и вызывать предоставляемые ей функции
- Динамически линковаться с первой динамической библиотекой и вызывать предоставляемые ей функции
- Во время выполнения в явном виде загружать вторую динамическию библиотеку с помощью dlopen(3) и вызывать какие-то функции из нее
Что может помочь при выполнении задания?
- man dlopen(3), man ld(1), man gcc(1)
HW 5
Сдача без штрафов: 6 мая. Сдача со штрафом: 20 мая
Для групп 38-39: сдача без штрафов: зачетная неделя. Сдача со штрафом: зачетная неделя(включительно)
Необходимо попробовать клиент-серверное взаимодействие через синхронные сокеты.
Помимо этого нужен Makefile, с помощью которого можно будет собрать клиент и сервер.
Семейство протоколов для использования на выбор: AF_UNIX, AF_INET, AF_INET6
Сервер должен:
- В качестве аргументов принимать адрес, на котором будет ожидать входящих соединений.
- Стартовать, делать bind(2) на заданный адрес и ожидать входящих соединений
- При получении соединения, выполнять серверную часть придуманного вами протокола
- После обработки принятого соединения возвращаться в режим ожидания входящих соединений
Клиент должен:
- Принимать параметром адрес, к которому стоит подключиться
- Выполнять клиентскую часть придуманного вами протокола
- Завершаться
-
Для сильных духом предлагается выбрать какой-то существующий протокол и имплементировать его, или его разумное подмножество.
Сильность духа будет оцениваться в два балла, при условии что выбранный протокол сложнее чем ECHO(https://tools.ietf.org/html/rfc862).
HW 6
Сдача без штрафов: 19 мая. Сдача со штрафом: зачетная неделя(включительно)
Для групп 38-39: сдача без штрафов: зачетная неделя. Сдача со штрафом: зачетная неделя(включительно)
Необходимо попробовать клиент-серверное взаимодействие с использованием механизмов мультиплексирования.
Помимо этого нужен Makefile, с помощью которого можно будет собрать клиент и сервер.
Семейство протоколов для использования на выбор: AF_UNIX, AF_INET, AF_INET6
Сервер должен:
- В качестве аргументов принимать адрес, на котором будет ожидать входящих соединений.
- Стартовать, делать bind(2) на заданный адрес и ожидать входящих соединений с использованием одного из механизмов мультиплексирования
- При получении соединения, добавлять дескриптор в механизм мультиплексирования и ожидать событий и на нем
- Выполнять на принятых соединениях серверную часть протокола
- По завершении обработки соединения удалять все события из механизмов мультиплексирования
Клиент должен:
- Принимать параметром адрес, к которому стоит подключиться
- Используя механизмы мультиплексирования подключаться к серверу
- Используя механизмы мультиплексирования выполнять клиентскую часть протокола
- Завершаться
-
Для сильных духом предлагается реализовать код, который будет работать на двух разных ОС, используя на каждой специфичные механизмы мультиплексирования
Сильность духа будет оцениваться в два балла.
HW 7
Сдача без штрафов: зачетная неделя
Необходимо получить опыт работы с IPC. Нужно создать приложение клиента и сервера.
Клиент и сервер обшаются через UNIX сокет.
Клиент подключается к серверу через UNIX сокет, получает от сервера файловый дескриптор, соответсвующий объекту какого-либо вида IPC.
Клиент и сервер выполняют какое-то взаимодействие используя IPC
Сервер должен:
- Ожидать подключений на UNIX сокете
- Для новых соединений создавать новый вид IPC, объекты которого представимы в виде файловых дескрипторов
- Передавать через UNIX сокет клиенту файловый дескриптор IPC соответсвующий клиенту
- Ожидать выполнения какого-либо протокола поверх IPC с клиентом
Клиент должен:
- Подключиться на UNIX сокет к серверу
- Получать в виде файлового дескриптора клиентскую часть IPC
- Взаимодействовать с сервером через IPC для выполнения какого-либо протокола
Примерами IPC могут служить: PIPE, socket, файловые дескрипторы для разделямой памяти или сообщений(POSIX), файловые дескрипторы для анонимной памяти
Что может помочь при выполнении задания?
- man 7 unix
HW 8
Сдача без штрафов: зачетная неделя
Необходимо написать обработчик сигнала SIGSEGV. Обработчик должен:
- Дампить значения general purpose регистров, соответствуюших моменту падения
- Дампить память поблизости от адреса, по которому произошло нарушение защиты памяти
Что может помочь при выполнении задания?
- man 2 sigaction, man 2 getcontext
HW 9
Сдача без штрафов: зачетная неделя
Необходимо описать работу загрузчика из MBR, а именно:
- Взять MBR загрузчик
- Дизассемблировать его
- Описать его работу на уровне "зачем нужна конкретная инструкция или группа инструкций"