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 – Результат выполнения трассировки системных вызовов
Задание 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.