Курс операционных систем, весна 2018

    Домашние задания

    Всего планируется около шести простых домашних заданий. Каждое домашнее задание оценивается в три балла, если сдано за три недели после публикации и в два балла, если сдано за пять недель. Помимо простых домашних заданий будет несколько сложных ближе к концу семестра. Сложные задания имеют большую стоимость - от четырех до шести баллов. Чтобы получить допуск к зачету необходимо набрать 12 баллов. Набрать эти баллы можно разными способами - или сдать четыре простых домашних задания вовремя, или все шесть невовремя, или решить около двух-трех сложных. Помимо этого можно получить зачет автоматом, если набрано строго больше 22 баллов(все простые задачи сданы вовремя и сделана одна не самая простая сложная). Время сдачи домашнего задания отсчитывается от момента его публикации. Сдача первых двух домашних заданий начинает отсчитываться с момента публикации этих правил.

    Правила немного изменились. Решили отказаться от сложных домашних заданий и увеличить количество простых. Разбалловка остается прежней - 12 баллов на допуск, > 22 на автомат.

    HW 1

    Сдача без штрафов: 7 апреля. Сдача со штрафом: 21 апреля

    Для групп 38-39: сдача без штрафов: 13 мая. Сдача со штрафом: 27 мая

    Необходимо написать упрощенный командный интерпретатор(shell).

    shell должен:

    1. В бесконечном цикле, как настоящий shell
    2. Считывать со стандартного ввода программу, которую необходимо
    3. запустить, вместе с ее аргументами. Программа задается в виде полного пути до исполняемого файла.
    4. Выполнять заданную программу с заданными аргументами
    5. Дожидаться завершения программы и выводить в стандартный поток вывода код ее завершения
    6. Необходимо обрабатывать ошибки всех используемых системных вызовов
    7. Необходимо обрабатывать конец вводу со стандартного потока

    HW 2

    Сдача без штрафов: 7 апреля. Сдача со штрафом: 21 апреля

    Для групп 38-39: сдача без штрафов: 27 мая. Сдача со штрафом: зачетная неделя(включительно)

    Необходимо написать подмножество утилиты find.

    Программа должна:

    1. Первым аргументом принимать абсолютный путь, в котором будет производиться поиск файлов
    2. По-умолчанию выводить в стандартный поток вывода все найденные файлы по этому пути
    3. Поддерживать аргумент -inum num. Аргумент задает номер инода
    4. Поддерживать аргумент -name name. Аргумент задает имя файла
    5. Поддерживать аргумент -size [-=+]size. Аргумент задает фильтр файлов по размеру(меньше, равен, больше)
    6. Поддерживать аргумент -nlinks num. Аргумент задает количество hardlink'ов у файлов
    7. Поддерживать аргумент -exec path. Аргумент задает путь до исполняемого файла, которому в качестве единственного аргумент нужно передать найденный в иерархии файл
    8. Поддерживать комбинацию аргументов. Например хочется найти все файлы с размером больше 1GB и скормить их утилите /usr/bin/sha1sum.
    9. Выполнять поиск рекурсивно, в том числе во всех вложенных директориях.

    Сильные духом призываются к выполнению задания с использованием системного вызова getdents(2). Остальные могут использовать readdir и opendir для чтения содержимого директории.

    HW 3

    Сдача без штрафов: 14 апреля. Сдача со штрафом: 28 апреля

    Для групп 38-39: сдача без штрафов: 27 мая. Сдача со штрафом: зачетная неделя(включительно)

    Кусочек JIT компилятора

    Программа должна:

    1. Выделить память с помощью mmap(2)
    2. Записать в выделенную память машинный код, соответсвующий какой-либо функции
    3. Изменить права на выделенную память - чтение и исполнение. See: mprotect(2)
    4. Вызвать функцию по указателю на выделенную память
    5. Освободить выделенную память

    Что может помочь при выполнении задания?

    1. man mmap(2), munmap(2), mprotect(2)
    2. GDB: help disassemble
    3. man objdump

    Сильные духом призываются к возможности модификации кода выполняемой функции в runtime. Например, вы можете получить аргументом вызова вашей программы какое-то число и пропатчить машинный код этим числом. Эта часть задания будет оцениваться дополнительно в два балла.

    HW 4

    Сдача без штрафов: 25 апреля. Сдача со штрафом: 9 мая

    Для групп 38-39: сдача без штрафов: зачетная неделя. Сдача со штрафом: зачетная неделя(включительно)

    Необходимо создать статическую, и две динамических библиотеки и программу, которая будет их использовать.

    Помимо этого нужен Makefile, с помощью которого можно будет собрать все части.

    Статическая библиотека должна:

    1. Собираться статически
    2. Предоставлять какие-то функции

    Первая динамическая библиотека должна:

    1. Собираться динамически
    2. Динамически линковаться с программой на этапе линковки
    3. Предоставлять какие-то функции

    Вторая динамическая библиотека должна:

    1. Собираться динамически
    2. Предоставлять какие-то функции

    Программа должна

    1. Статически линковаться с статической библиотекой и вызывать предоставляемые ей функции
    2. Динамически линковаться с первой динамической библиотекой и вызывать предоставляемые ей функции
    3. Во время выполнения в явном виде загружать вторую динамическию библиотеку с помощью dlopen(3) и вызывать какие-то функции из нее

    Что может помочь при выполнении задания?

    1. man dlopen(3), man ld(1), man gcc(1)

    HW 5

    Сдача без штрафов: 6 мая. Сдача со штрафом: 20 мая

    Для групп 38-39: сдача без штрафов: зачетная неделя. Сдача со штрафом: зачетная неделя(включительно)

    Необходимо попробовать клиент-серверное взаимодействие через синхронные сокеты.

    Помимо этого нужен Makefile, с помощью которого можно будет собрать клиент и сервер.

    Семейство протоколов для использования на выбор: AF_UNIX, AF_INET, AF_INET6

    Сервер должен:

    1. В качестве аргументов принимать адрес, на котором будет ожидать входящих соединений.
    2. Стартовать, делать bind(2) на заданный адрес и ожидать входящих соединений
    3. При получении соединения, выполнять серверную часть придуманного вами протокола
    4. После обработки принятого соединения возвращаться в режим ожидания входящих соединений

    Клиент должен:

    1. Принимать параметром адрес, к которому стоит подключиться
    2. Выполнять клиентскую часть придуманного вами протокола
    3. Завершаться

    Для сильных духом предлагается выбрать какой-то существующий протокол и имплементировать его, или его разумное подмножество.

    Сильность духа будет оцениваться в два балла, при условии что выбранный протокол сложнее чем ECHO(https://tools.ietf.org/html/rfc862).

    HW 6

    Сдача без штрафов: 19 мая. Сдача со штрафом: зачетная неделя(включительно)

    Для групп 38-39: сдача без штрафов: зачетная неделя. Сдача со штрафом: зачетная неделя(включительно)

    Необходимо попробовать клиент-серверное взаимодействие с использованием механизмов мультиплексирования.

    Помимо этого нужен Makefile, с помощью которого можно будет собрать клиент и сервер.

    Семейство протоколов для использования на выбор: AF_UNIX, AF_INET, AF_INET6

    Сервер должен:

    1. В качестве аргументов принимать адрес, на котором будет ожидать входящих соединений.
    2. Стартовать, делать bind(2) на заданный адрес и ожидать входящих соединений с использованием одного из механизмов мультиплексирования
    3. При получении соединения, добавлять дескриптор в механизм мультиплексирования и ожидать событий и на нем
    4. Выполнять на принятых соединениях серверную часть протокола
    5. По завершении обработки соединения удалять все события из механизмов мультиплексирования

    Клиент должен:

    1. Принимать параметром адрес, к которому стоит подключиться
    2. Используя механизмы мультиплексирования подключаться к серверу
    3. Используя механизмы мультиплексирования выполнять клиентскую часть протокола
    4. Завершаться

    Для сильных духом предлагается реализовать код, который будет работать на двух разных ОС, используя на каждой специфичные механизмы мультиплексирования

    Сильность духа будет оцениваться в два балла.

    HW 7

    Сдача без штрафов: зачетная неделя

    Необходимо получить опыт работы с IPC. Нужно создать приложение клиента и сервера.

    Клиент и сервер обшаются через UNIX сокет.

    Клиент подключается к серверу через UNIX сокет, получает от сервера файловый дескриптор, соответсвующий объекту какого-либо вида IPC.

    Клиент и сервер выполняют какое-то взаимодействие используя IPC

    Сервер должен:

    1. Ожидать подключений на UNIX сокете
    2. Для новых соединений создавать новый вид IPC, объекты которого представимы в виде файловых дескрипторов
    3. Передавать через UNIX сокет клиенту файловый дескриптор IPC соответсвующий клиенту
    4. Ожидать выполнения какого-либо протокола поверх IPC с клиентом

    Клиент должен:

    1. Подключиться на UNIX сокет к серверу
    2. Получать в виде файлового дескриптора клиентскую часть IPC
    3. Взаимодействовать с сервером через IPC для выполнения какого-либо протокола

    Примерами IPC могут служить: PIPE, socket, файловые дескрипторы для разделямой памяти или сообщений(POSIX), файловые дескрипторы для анонимной памяти

    Что может помочь при выполнении задания?

    1. man 7 unix

    HW 8

    Сдача без штрафов: зачетная неделя

    Необходимо написать обработчик сигнала SIGSEGV. Обработчик должен:

    1. Дампить значения general purpose регистров, соответствуюших моменту падения
    2. Дампить память поблизости от адреса, по которому произошло нарушение защиты памяти

    Что может помочь при выполнении задания?

    1. man 2 sigaction, man 2 getcontext

    HW 9

    Сдача без штрафов: зачетная неделя

    Необходимо описать работу загрузчика из MBR, а именно:

    1. Взять MBR загрузчик
    2. Дизассемблировать его
    3. Описать его работу на уровне "зачем нужна конкретная инструкция или группа инструкций"