- •«Московский технический университет связи и информатики»
- •1. Задание 1. Ядро Linux 3
- •Задание 1. Ядро Linux
- •2. Задание 1.1. Анализ системных вызовов при выполнении команд с помощью утилиты strace
- •Задание 1.2. Сборка и загрузка модуля в ядро Linux
- •Задание 2. Функции получения системной информации
- •Задание 2.1. Получение системной информации.
МИНИСТЕРСТВО ЦИФРОВОГО РАЗВИТИЯ, СВЯЗИ И МАССОВЫХ КОММУНИКАЦИЙ РОССИЙСКОЙ ФЕДЕРАЦИИ
Ордена Трудового Красного Знамени федеральное государственное бюджетное образовательное учреждение высшего образования
«Московский технический университет связи и информатики»
Кафедра «Системного программирования»
Дисциплина «Операционные системы»
Лабораторная работа 2
«Ядро Linux. Процессы и потоки в ОС GNU/LINUX»
Выполнил:
студент группы БСТ2104
Станишевский И.А.
Проверила: Алексанян Д. А.
Москва, 2023 г.
Содержание
1. Задание 1. Ядро Linux 3
2. Задание 1.1. Анализ системных вызовов при выполнении команд с помощью утилиты strace 3
3. Задание 1.2. Сборка и загрузка модуля в ядро Linux 8
5. Задание 2.1. Получение системной информации. 13
Вывод 16
1. Задание 1. Ядро Linux 3
2. Задание 1.1. Анализ системных вызовов при выполнении команд с помощью утилиты strace 3
3. Задание 1.2. Сборка и загрузка модуля в ядро Linux 9
4. Задание 2. Функции получения системной информации 13
5. Задание 2.1. Получение системной информации. 13
Вывод 16
Задание 1. Ядро Linux
Цели работы:
1) изучить архитектуру и основные компоненты ядра Linux, включая механизм системных вызовов.
2) изучить возможности утилиты strace для отладки и анализа работы программ на уровне системных вызовов.
3) приобрести практический навык создания и загрузки модуля в ядро Linux.
2. Задание 1.1. Анализ системных вызовов при выполнении команд с помощью утилиты strace
На рисунке 1 представлено установка утилиты strace. Команда «sudo pacman -S strace» устанавливает пакет strace с использованием менеджера пакетов pacman под учетной записью с привилегиями суперпользователя.
Рисунок 1 – Установка пакета strace
На рисунке 2 представлено проверка установки утилиты и вывод характеристик о ней. Команда «pacman -Qi strace», выводит информацию о пакете strace, включая его имя, версию, описание и другую полезную информацию.
Рисунок 2 – Вывод информации о пакете strace
Запускаю strace для команды необходимого варианта. На основании полученных результатов заполняю таблицу 1 для 5-7 различных системных вызовов.
Вариант №19 Команда: head
Команда head выводит начальные строки (по умолчанию — 10) из одного или нескольких документов. Для реализации команды head нужно создать текстовый файл. На рисунке 3 представлен текст для работы команды head.
Рисунок 3 – Текстовый файл для работы с head
Выполним команду «strace -c head -n 'filename.txt'», где:
-c -- флаг указывает strace выводить итоговую статистику системных вызовов, подсчитывая количество вызовов каждого типа.
head -- это утилита командной строки, которая используется для вывода начальных строк из файла или стандартного ввода, где n означает вывод первых строк из файла.
'filename.txt' -- это аргумент команды, который указывает на файл, из которого будут выводиться строки с помощью команды head.
На рисунке 4 представлен вывод команды head.
Рисунок 4 – вывод команды head
Заполним таблицу 1, в которой опишем информацию о нескольких системных вызовах на основании полученных результатов.
№ |
Системный вызов |
Описание вызова |
Входные параметры |
Время выполнения, мкс |
Возвращаемое значение |
1 |
read |
пытается прочитать количество байт из файлового дескриптора в буфер, начинающийся по адресу. |
(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\220~\2\0\0\0\0\0"..., 832) |
349 |
832 (количество успешных прочитанных байтов) |
2 |
arch_prctl |
устанавливает специфичное для данной архитектуры состояние процесса или треда. |
(0x3001 /* ARCH_??? */, 0x7fff8609fe30) |
5 |
-1 |
3 |
getdents64 |
читает несколько структур из каталога, на который указывает открытый файловый дескриптор fd, в буфер, указанный в dirp. |
(3, 0x56448e9ee110 /* 3 entries */, 32768) |
33 |
96 |
4 |
access |
проверяет, имеет ли вызвавший процесс права доступа к файлу pathname. |
("/etc/ld.so.preload", R_OK) |
0 |
-1 ENOENT (Нет такого файла или каталога) |
5 |
futex |
предоставляет программам метод для ожидания пока определённое условие не станет истинным. Также futex() можно использовать для пробуждения процессов или нитей, ожидающих определённого условия. |
(0x7febe2a3f72c, FUTEX_WAKE_PRIVATE, 214748364) |
4 |
FUTEX_WAKE_PRIVATE: 0
|
6 |
brk |
Вызов brk() изменяет расположение маркера окончания программы (program break), который определяет конец сегмента данных процесса. устанавливает конец сегмента данных в значение, указанное в аргументе addr, если это значение является приемлемым, система имеет достаточно памяти и процесс не достиг максимально возможного размера своего сегмента данных. |
NULL |
21 |
0x559a143d0000 |
Таблица 1 – Информация о системных вызовах команды head
На рисунке 5 показана перенаправление вывода strace в файл log в домашнюю директорию. Для этого нужно использовать команду strace -c head –n 3 'filename.txt’> ~/log, где оператор> перенаправляет стандартный вывод команды strace в файл log в вашей домашней директории (~/log).
Рисунок 5 – Перенаправление вывода strace в файл log в вашей домашней директории и вывод статистики
Выполняем трассировку системных вызовов для произвольного работающего процесса, подключившись к нему по PID. Для этого используем команду htop, чтобы узнать, какие процессы происходят сейчас.
Рисунок 6 – Перенаправление вывода strace в файл log в вашей домашней директории и вывод статистики
С помощью команды sudo strace –p 641.Флаг –p указывается для идентификатора процесса, который нужно прослушать.
Рисунок 7 – Перенаправление вывода strace в файл log в вашей домашней директории и вывод статистики