Отчёт по лабораторной работе №2
.docxМинистерство цифрового развития связи и массовых коммуникаций
Ордена Трудового Красного Знамени
Федеральное государственное бюджетное образовательное учреждение
высшего образования
«МОСКОВСКИЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
СВЯЗИ И ИНФОРМАТИКИ»
Кафедра «Системное программирование»
Отчёт по лабораторной работе №2
по дисциплине «Операционные системы»
Выполнил: студент группы БСТ2104
Ягудин Р.Р.
Проверил: ст. преп. Алексанян Д.А.
Москва, 2023 г.
Цели лабораторной работы:
Изучить архитектуру и основные компоненты ядра Linux, включая механизм системных вызовов
Изучить возможности утилиты strace для отладки и анализа работы программ на уровне системных вызовов
Приобрести практический навык создания и загрузки модуля в ядро Linux
Получение практических навыков использования Win32 API для исследования процессов
Задание на лабораторную работу
Проанализировать системные вызовы при выполнении команд с помощью утилиты strace
Собрать и загрузить модуль в ядро Linux
Написать программу, которая выполняет следующие действия в интерактивном режиме:
Принимая дескриптор, имя или полное имя модуля, возвращает другие два элемента в своих выходных параметрах
Будет выполнять последовательно по шагам следующие задачи:
Используя функцию GetCurrentProcessId определит идентификатор текущего процесса.
Используя функцию GetCurrentProcess определит псевдодескриптор текущего процесса.
Используя функцию DuplicateHandl и значение псевдодескриптора определит дескриптора текущего процесса.
Используя функцию OpenProcess определит копию дескриптора текущего процесса.
Закроет дескриптор, полученный функцией DuplicateHandl.
Закроет дескриптор, полученный функцией OpenProcess.
Выдаст список перечисления всех процессов, потоков, модулей и их свойства в системе: для Windows NT (и список загруженных драйверов устройств).
Задание 1.1. Анализ системных вызовов при выполнении команд с помощью утилиты strace
На рисунке 1 представлена установка утилиты strace
Рисунок 1 – Установка утилиты strace
На рисунке 2 представлена команда, предоставляющая ознакомление со справкой об использовании утилиты strace, на рисунке 3 представлен результат её выполнения.
Рисунок 2 – Команда, предоставляющая ознакомление со справкой об использовании утилиты strace
Рисунок 3 – Справка об использовании утилиты strace
На рисунке 4 представлен запуск strace для команды getconf
Рисунок 4 – Запуск strace для команды getconf
№ |
Системный вызов |
Описание вызова |
Входные параметры |
Время выполнения, мкс |
Возвраща-емое значение |
1 |
execve |
используется для выполнения новой программы в текущем процессе |
"/usr/bin/getconf" ["getconf"] 0x7fff6e2dab80 /* 27 vars */ |
0 |
0 (вызов выполнен успешно) |
2 |
arch_prctl |
используется для управления архитектурными параметрами процессора в пользовательском пространстве |
0x3001 /* ARCH_??? */ 0x7ffe2fc092c0
|
37 |
-1 (Недопустимый аргумент) |
3 |
openat |
используется для открытия файлов относительно указанного каталога; обеспечивает более гибкий способ работы с путями к файлам и каталогам |
AT_FD CWD "/etc/ld.so.cache" 0_RDONLY|0_CLOEXEC |
349 |
3 (вызов выполнен успешно) |
4 |
openat |
используется для открытия файлов относительно указанного каталога; обеспечивает более гибкий способ работы с путями к файлам и каталогам |
AT_FD CWD "/usr/lib/libc.so.6" 0_RDONLY|0_CLOEXEC |
349 |
3 (вызов выполнен успешно) |
5 |
set_tid_address |
используется для установки адреса, по которому будет сохраняться идентификатор (ID) потока для текущего потока. Этот вызов полезен, когда требуется управлять созданием и завершением потоков и получать их идентификаторы |
0x7f7284f36950 |
38 |
1557 (вызов выполнен успешно) |
Таблица 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 – Команда для установки заголовочных файлов
На рисунке 14 представлены команды для создания и перехода в каталог модуля
Рисунок 14 – Команды для создания и перехода в каталог модуля
На рисунке 15 представлены команды для создания файла mhello.c и его открытия в текстовом редакторе
Рисунок 15 – Команды для создания файла mhello.c и его открытия
На рисунке 16 представлено содержимое файла mhello.c
Рисунок 16 – Содержимое файла mhello.c
На рисунке 17 представлены команды для создания файла Makefile и его открытия в текстовом редакторе
Рисунок 17 – Команды для создания файла Makefile и его открытия
На рисунке 18 представлено содержимое файла Makefile
Рисунок 18 - Содержимое файла Makefile
На рисунке 19 представлена сборка модуля ядра с помощью команды make
Рисунок 19 – Сборка модуля ядра
На рисунке 20 представлена команда для просмотра сборки модуля ядра, на рисунке 21 представлен результат её выполнения
Рисунок 20 – Команда для просмотра сборки модуля ядра
Рисунок 21 – Просмотр сборки модуля ядра
На рисунке 22 представлена команда для установки модуля ядра
Рисунок 22 – Команда для установки модуля ядра
На рисунке 23 представлена команда для просмотра установки модуля ядра, на рисунке 24 представлен результат её выполнения
Рисунок 23 – Команда для просмотра установки модуля ядра
Рисунок 24 – Просмотр установки модуля ядра
На рисунке 25 представлена команда для выгрузки модуля ядра
Рисунок 25 – Команда для выгрузки модуля ядра
На рисунке 26 представлена команда для просмотра выгрузки модуля ядра и результат её выполнения
Рисунок 26 – Команда для просмотра выгрузки модуля ядра и результат её выполнения
Задание 2. Процессы и потоки
На рисунке 27 представлен код приложения, обеспечивающий работу с процессами и потоками
Рисунок 27 – Код приложения
На рисунке 28 представлен результат работы программы
Рисунок 28 – Результат работы программы
