Skip to content

alexust27/OperatingSystems

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Домашние задания по операционным системам

HW 1

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

shell должен:

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

HW 2

Необходимо написать подмножество утилиты 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

Кусочек 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

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

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

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

    • Собираться статически
    • Предоставлять какие-то функции
  • Первая динамическая библиотека должна:

    • Собираться динамически
    • Динамически линковаться с программой на этапе линковки
    • Предоставлять какие-то функции
  • Вторая динамическая библиотека должна:

    • Собираться динамически
    • Предоставлять какие-то функции
  • Программа должна

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

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

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

HW 5

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

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

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

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

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

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

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

HW 6

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

Помимо этого нужен 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), файловые дескрипторы для анонимной памяти

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

  1. man 7 unix

HW 8

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

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

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

  1. man 2 sigaction
  2. man 2 getcontext

About

operating systems homeworks

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published