Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабы / 2 лабораторная (исправленная).docx
Скачиваний:
0
Добавлен:
09.07.2025
Размер:
6.51 Mб
Скачать

МИНИСТЕРСТВО ЦИФРОВОГО РАЗВИТИЯ, СВЯЗИ И МАССОВЫХ

КОММУНИКАЦИЙ РОССИЙСКОЙ ФЕДЕРАЦИИ

ордена Трудового Красного Знамени федеральное государственное бюджетное образовательное учреждение высшего образования

«Московский технический университет связи и информатики»

Операционные системы

Лабораторная работа №2

Москва, 2024 г.

Содержание

1 Задание 1. Ядро Linux 3

4 Задание 2. Процессы и потоки в ОС GNU/LINUX 15

3 Вывод 21

1 Задание 1. Ядро Linux

Цели работы:

● изучить архитектуру и основные компоненты ядра Linux, включая механизм системных вызовов

● изучить возможности утилиты strace для отладки и анализа работы программ на уровне системных вызовов

● приобрести практический навык создания и загрузки модуля в ядро Linux

Задание 1.1. Анализ системных вызовов при выполнении команд с помощью утилиты strace

  1. Убедитесь, что strace установлена, запустив ее с параметром -V: strace -V. Если утилита отсутствует, установите ее: sudo apt install strace.

  2. Ознакомьтесь со справкой об использовании утилиты strace: man strace.

  3. Запустите strace для команды, соответствующей варианту. Обратите внимание, что в некоторых случаях потребуется задать аргументы. На основании полученных результатов заполните таблицу 1 для 5-7 различных системных вызовов.

  4. Перенаправьте вывод strace в файл log в вашей домашней директории.

  5. Получите статистику выполненных системных вызовов.

  6. Выполните трассировку системных вызовов для произвольного работающего процесса, подключившись к нему по PID.

Проверим наличие утилиты strace и ознакомимся со справкой об использовании утилиты (рисунок 1 - 2).

Рисунок 1 – Проверка наличия утилиты и вызов справки

Рисунок 2 – Справка об использовании утилиты

Запустим strace для команды head для файла test_head (содержимое файла представлено на рисунке 7) (в соответствии с вариантом) (рисунок 3).

Рисунок 3 – Результат выполнения команды head

На основании полученных результатов заполним таблицу 1 для 5 различных системных вызовов.

Таблица 1 – Результаты анализа

Системный

Вызов

Описание вызова

Входные параметры

Время выполнения, мкс

Возвращаемое значение

1

Execve

Используется для выполнения новой команды в текущем процессе

"/usr/bin/head" – исполняемый файл, который должен быть запущен

["head"] – массив аргументов, передаваемых новой программе

315

0 – успешное выполнение

2

Access()

Используется для проверки наличия прав доступа к файлу/директории

"/etc/ld.so.preload" – Путь к файлу/директории

R_OK – флаг. Вызов должен проверить, есть ли права на чтение

9

- 1 ENOENT 

расшифровывается как "No such file or directory"

3

Openat

Используется для открытия файла/директории

AT_FDCWD - базовый дескриптор файла (в данном случае, текущий рабочий каталог).

"/etc/ld.so.cache" путь к файлу, который будет открыт

O_RDONLY|O_CLOEXEC флаги для открытия файла

6

= 3

файл был успешно открыт, и дескриптор файла (3) был назначен данному файлу

4

Mmap

Используется для создания отображения в памяти (memory mapping) / резервирования адресного пространства в адресном пространстве процесса.

NULL предпочтительное местоположение отображения в памяти

8192 размер отображения в байтах

PROT_READ|PROT_WRITE права доступа к отображению

MAP_PRIVATE|MAP_ANONYMOUS тип отображения

-1 файловый дескриптор

0 смещение в файле

17

= 0x76bb58224000

адрес, по которому было создано отображение в памяти

5

Mprotect

Используется для изменения прав доступа к участкам памяти в процессе

0x76bb581ff000 адрес начала участка памяти, для которого изменяются права доступа.

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

PROT_READ новые права доступа для участка памяти

18

= 0 успешное выполнение

В strace часто время выполнения не выводится напрямую, но мы можем измерить его, добавив -T.

Использовав команду strace -T head 'test_head.txt', получим общее время выполнения (рисунок 4).

Рисунок 4 – Время работы команды

Перенаправим вывод strace в файл strace_log в домашней директории (рисунок 5).

Рисунок 5 – Вывод в log

Просмотрим вывод strace в файл strace_log (рисунок 6).

Рисунок 6 - Вывод strace в файл strace_log

Получим статистику выполненных системных вызовов.

Команда head выводит начальные строки (по умолчанию — 10) из одного или нескольких документов. Для реализации команды head нужно создать текстовый файл. На рисунке 7 представлен текст для работы команды head.

Рисунок 7 – Текстовый файл для работы с head

Выполним команду «strace -c head -n 'strace_head.txt'», где:

  • -c -- флаг указывает strace выводить итоговую статистику системных вызовов, подсчитывая количество вызовов каждого типа.

  • head -- это утилита командной строки, которая используется для вывода начальных строк из файла или стандартного ввода, где n означает вывод первых строк из файла.

  • 'filename.txt' -- это аргумент команды, который указывает на файл, из которого будут выводиться строки с помощью команды head.

Рисунок 8 – Cтатистика системных вызовов

Команда head выполнила 3 системных вызова ‘read’, 7 системных вызова ‘close’, 10 системных вызовов ‘mmap’, 3 системных вызова ‘mprotect’ и так далее.

Запустим браузер FireFox и определим PID, которые он использует (рисунок 9).

Рисунок 9 – Поиск PID в FireFox

Выполним трассировку процесса с PID 26533. Флаг –p указывается для идентификатора процесса, который нужно прослушать (рисунок 10).

Рисунок 10 – трассировка процесса 26533

Задание 1.2. Сборка и загрузка модуля в ядро Linux

  1. Установите необходимые пакеты: apt-get install gcc make linux-headers-$(uname -r).

  2. Создайте файл модуля: mkdir kmod-hello_world; cd kmod-hello_world/; touch. /mhello.c c содержимым.

  3. Создайте Makefile: touch. /Makefile c содержимым.

  4. Соберите модуль и установите его с помощью insmod.

  5. Выгрузите модуль с помощью команды rmmod.

Результаты выполнения выше перечисленных действий представлены на рисунках 11-20.

Установим необходимые пакеты (рисунок 11).

Рисунок 11 – Установка необходимых пакетов

Создадим файл модуля. Используем команду mkdir kmod-hello_world для создания директории, где будет создавать файл модуля. Через команду cd перейдем в эту категорию. На рисунке 12 представлены команды для создания и перехода в каталог модуля.

Рисунок 12 – Команды для создания и перехода в каталог модуля

Команда touch используется для создания файла mhello.c. Команда позволяет работать с текстовым редактором в Unix-подобных системах. На рисунке 13 представлены команды для создания файла mhello.c и его открытия в текстовом редакторе.

Рисунок 13 – Команды для создания файла mhello.c и его открытия

На рисунке 14 представлено содержимое файла mhello.c.

Рисунок 14 – Содержимое файла mhello.c

На рисунке 15 представлены команды для создания файла Makefile и его открытия в текстовом редакторе.

Рисунок 15 – Команды для создания файла Makefile и его открытия

На рисунке 16 представлено содержимое файла Makefile.

Рисунок 16 - Содержимое файла Makefile

На рисунке 17 представлена сборка модуля ядра с помощью команды make.

Рисунок 17 – Сборка модуля ядра

На рисунке 18 представлена команда для установки модуля ядра.

Рисунок 18 – Команда для установки модуля ядра

На рисунке 19 представлена команда для выгрузки модуля с помощью команды rmmod

Рисунок 19 – Команда для выгрузки модуля ядра

На рисунке 20 представлена команда для просмотра выгрузки модуля ядра и результат её выполнения.

Рисунок 20 – Команда для просмотра выгрузки модуля ядра и результат её выполнения

Соседние файлы в папке Лабы