 
        
        lab_2 / Отчёт_по_лабораторной_работе_№2_Мажукин_БСТ2104
.docxМинистерство цифрового развития связи и массовых коммуникаций
Ордена Трудового Красного Знамени
Федеральное государственное бюджетное образовательное учреждение
высшего образования
«МОСКОВСКИЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
СВЯЗИ И ИНФОРМАТИКИ»
Кафедра «Системное программирование»
Отчёт по лабораторной работе №2
по дисциплине «Операционные системы»
Выполнил: студент группы БСТ2104
Мажукин И.Н.
Проверил: ст. преп. Алексанян Д.А.
Москва, 2023 г.
Цели лабораторной работы:
1) изучить архитектуру и основные компоненты ядра Linux, включая механизм системных вызовов.
2) изучить возможности утилиты strace для отладки и анализа работы программ на уровне системных вызовов.
3) приобрести практический навык создания и загрузки модуля в ядро Linux.
Задание на лабораторную работу
- Проанализировать системные вызовы при выполнении команд с помощью утилиты strace 
- Собрать и загрузить модуль в ядро Linux 
- Написать программу, создающую два дочерних процесса с использованием двух вызовов fork (). Родительский и два дочерних процесса должны выводить на экран свой pid и pid родительского процесса и текущее время в формате: часы:минуты:секунды. Используя вызов system (), выполнить команду ps -x в родительском процессе. Найти свои процессы в списке запущенных процессов. Первый дочерний процесс, помимо указанного вывода, также выводит информацию о портах и соединениях. 
Второй дочерний процесс после вывода основной информации должен быть замещен задачей, создающей два дочерних потока.
4) Написать программу, создающую два дочерних потока. Родительский процесс и два дочерних потока должны выводить на экран свой id и pid родительского процесса и текущее время в формате: часы:минуты:секунды
Задание 1.1. Анализ системных вызовов при выполнении команд с помощью утилиты strace
На рисунке 1 представлена установка утилиты strace
 
Рисунок 1 – Установка утилиты strace
На рисунке 2 представлена команда, предоставляющая ознакомление со справкой об использовании утилиты strace, на рисунке 3 представлен результат её выполнения.
 
Рисунок 2 – Команда, предоставляющая ознакомление со справкой об использовании утилиты strace
 
Рисунок 3 – Справка об использовании утилиты strace
На рисунке 4 представлен запуск strace для команды clear
 
Рисунок 4 – Запуск strace для команды clear
| № | Системный вызов | Описание вызова | Входные параметры | Время выполнения, мкс | Возвраща-емое значение | 
| 1 | execve | Выполняет программу, задаваемую аргументом. | execve("/usr/bin/clear", ["clear"], 0x7ffefdc422b0 /* 81 vars */) | 560 | 0 | 
| 2 | munmap | Функция munmap () должна удалять любые сопоставления для всех страниц , содержащих любую часть адресного пространства процесса, начиная с addr и продолжая len байт. | (0x7f01de1f9000, 162263) | 21 | 0 | 
| 3 | arch_prctl | устанавливает специфичное для данной архитектуры состояние процесса или треда. | (ARCH_SET_FS, 0x7f01ddfdb740) | 5 | 0 | 
| 4 | access | проверяет, имеет ли вызвавший процесс права доступа к файлу pathname. | ("/etc/ld.so.preload", R_OK) | 18 | -1 | 
| 5 | brk | Вызов brk() изменяет расположение маркера окончания программы (program break), который определяет конец сегмента данных процесса. устанавливает конец сегмента данных в значение, указанное в аргументе addr, если это значение является приемлемым, система имеет достаточно памяти и процесс не достиг максимально возможного размера своего сегмента данных. | (NULL) | 5 | 0x56122d106000 | 
Таблица 1 – Результаты системных вызовов
На рисунке 5 представлена команда для перенаправления вывода strace в файл log в вашей домашней директории
 
Рисунок 5 – Команда для перенаправления вывода strace в файл log
На рисунке 6 представлена команда для получения статистики выполненных системных вызовов, на рисунке 7 представлен результат её выполнения
Рисунок 6 – Команда для получения статистики выполненных системных вызовов
 
Рисунок 7 – Выполненные системные вызовы
На рисунке 8 представлена команда для вывода списка процессов со всей доступной информацией, включая PID
 
Рисунок 8 – Команда для вывода списка процессов
На рисунке 9 представлен один из работающих процессов, который будет использоваться для трассировки системных вызовов
 
Рисунок 9 – Процесс, использующийся для трассировки системных вызовов
На рисунке 10 представлена команда для трассировки системных вызовов, на рисунке 11 представлен результат её выполнения
 
Рисунок 10 – Команда для трассировки системных вызовов
Р исунок
11 – Результат выполнения
трассировки системных вызовов
  
исунок
11 – Результат выполнения
трассировки системных вызовов
Задание 1.2. Сборка и загрузка модуля в ядро Linux
На рисунках 12 и 13 представлены команды для установки необходимых пакетов при сборке и загрузке модуля в ядро Linux
 
Рисунок 12 – Команда для установки утилиты make, компилятора gcc и заголовков ядра
На рисунке 13 представлены команды для создания и перехода в каталог модуля
 
Рисунок 13 – Команды для создания и перехода в каталог модуля
На рисунке 14 представлены команды для создания файла mhello.c и его открытия в текстовом редакторе
 
Рисунок 14 – Команды для создания файла mhello.c и его открытия
На рисунке 15 представлено содержимое файла mhello.c
 
Рисунок 15 – Содержимое файла mhello.c
На рисунке 16 представлены команды для создания файла Makefile и его открытия в текстовом редакторе
 
Рисунок 16 – Команды для создания файла Makefile и его открытия
На рисунке 17 представлено содержимое файла Makefile
 
Рисунок 17 - Содержимое файла Makefile
На рисунке 18 представлена сборка модуля ядра с помощью команды make
 
Рисунок 18 – Сборка модуля ядра
На рисунке 19 представлена команда для просмотра сборки модуля ядра, на рисунке 20 представлен результат её выполнения
 
Рисунок 19 – Команда для просмотра загрузи модуля ядра
 
Рисунок 20 – Просмотр загрузи модуля ядра
На рисунке 21 представлена команда для установки модуля ядра
 
Рисунок 21 – Команда для установки модуля ядра
На рисунке 22 представлена команда для просмотра установки модуля ядра, на рисунке 23 представлен результат её выполнения
Рисунок 22 – Команда для просмотра установки модуля ядра
 
Рисунок 23 – Просмотр установки модуля ядра
На рисунке 24 представлена команда для выгрузки модуля ядра
 
Рисунок 24 – Команда для выгрузки модуля ядра
На рисунке 25 представлена команда для просмотра выгрузки модуля ядра и результат её выполнения
 
Рисунок 25 – Команда для просмотра выгрузки модуля ядра и результат её выполнения
Задание 2. Процессы и потоки
На рисунке 26 представлен код приложения для задания 1, обеспечивающий работу с процессами и потоками
 
  
 
Рисунок 26 – Код приложения
На рисунке 27 представлен результат работы программы
 
Рисунок 27 – Результат работы программы
Вывод
Изучил архитектуру и основные компоненты ядра Linux, включая механизм системных вызовов. Изучил возможности утилиты strace для отладки и анализа работы программ на уровне системных вызовов. Приобрел практический навык создания и загрузки модуля в ядро Linux.
