- •«Московский технический университет связи и информатики» (мтуси)
- •Цель работы
- •Задания на лабораторную работу Задание 1. Анализ системных вызовов при выполнении команд с помощью утилиты strace
- •Задание 2. Системные вызовы вашей̆ программы
- •Задание 3. Сборка и загрузка модуля в ядро Linux
- •Выполнение работы Задание 1.
- •Задание 2.
- •Задание 3.
- •Приложение 1: «Список группы бст2154».
Задание 2. Системные вызовы вашей̆ программы
Выполните разбор системных вызовов для небольшой программы, написанной самостоятельно (можно взять, например, простую программу, печатающую в заданный файл 5 строк) и заполните таблицу 2 из задания 1.
Задание 3. Сборка и загрузка модуля в ядро Linux
1. Установите необходимые пакеты:
apt-get install gcc make linux-headers-$(uname -r)
2. Создайте файл модуля:
mkdir kmod-hello_world ; cd kmod-hello_world/ ;
touch ./mhello.c c содержимым:
#define MODULE
#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>
MODULE_LICENSE("GPLv3");
int init_module(void){
printk("<1> Hello,World\n");
return 0;
}
void cleanup_module(void){
printk("<1> Goodbye.\n");
}
3. Создайте Makefile: touch ./Makefile c содержимым:
obj-m += mhello.o
hello-objs := mhello.c
all:
make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) clean
Перед командой "make" необходимо использовать табуляцию для создания отступа, а не пробелы.
4. Соберите модуль и установите его с помощью insmod.
make all ; insmod path/to/module.ko
В отчете по работе приведите снимок экрана вывода установки модуля в dmesg.
5. Выгрузите модуль с помощью команды rmmod и включите снимок экрана
вывода в отчет.
Выполнение работы Задание 1.
Команда top показывает список работающих в данный момент процессов и информацию о них, включая использование ими памяти и процессора.
Рисунок 1. Проверка наличия утилиты strace.
Рисунок 2. Справка об использовании утилиты strace
Рисунок 3. Запуск strace для команды date. Для заполнения таблицы, потребуеится знать время затраченное на выполнение вызова. Обычно в выводе strace нет точного времени выполнения вызова. Это связано с тем, что время выполнения может быть очень маленьким (в микросекундах), и его трудно измерить точно. Кроме того, время выполнения зависит от многих факторов, таких как нагрузка на систему, скорость диска и т.д. Если нужно приблизительно оценить время выполнения, можно попробовать использовать опцию -T в strace, которая будет показывать время, затраченное на каждый вызов.
Таблица 3. Результаты анализа
№ |
Системный вызов |
Описание вызова |
Входные параметры |
Время выполнения, мкс |
Возвращаемое значение |
1. |
execuve |
Запускает новую программу, заменяя текущий процесс. |
date |
0.001669 |
0 |
2. |
mmap |
для выделения памяти |
NULL - Указывает, что ядро должно выбрать адрес для выделения памяти. |
0.000143 |
7c4c0d1e8000 |
3. |
access |
Проверяет доступность файла по указанному пути. mode определяет тип доступа (чтение, запись, выполнение). |
Путь /etc/ld.so.preload |
0.000016 |
-1 ENOENT (No such file or directory) |
4. |
openat |
Открывает файл для чтения, записи или и того и другого. dirfd указывает на директорию, в которой нужно искать файл. flags определяет тип доступа (чтение, запись, создание). |
Путь /etc/ld.so.cache
O_RDONLY|O_CLOEXEC: Флаги, которые указывают на то, что файл нужно открыть только для чтения, а дескриптор файла должен быть автоматически закрыт при выполнении execve |
0.000044 |
3 |
5. |
fstat |
Получает информацию о файле, открытом с помощью дескриптора fd. Информация о файле хранится в структуре stat. |
3: Дескриптор открытого файла (получен в openat). {st_mode=S_IFREG|0644, st_size=63567, ...}: Структура stat, в которую записывается информация о файле. |
0.000009 |
0 |
6. |
close |
Закрывает файл, открытый с помощью дескриптора fd. |
3: Дескриптор открытого файла |
0.000009 |
0 |
7. |
read |
используется для чтения из файла |
3: Дескриптор открытого файла
|
0.000055 |
832 |
Имя вызова: В каждой строчке текста, которая описывает системный вызов, первым идет его имя. Например, execve, brk, mmap, mprotect, access, open, fstat, read, close, write, exit_group.
Параметры: После имени вызова в скобках идут параметры, которые передаются в этот вызов. Например, execve("/bin/date", ["date"], [/ 53 vars /]). Здесь /bin/date – это путь к исполняемому файлу, ["date"] – аргументы, которые передаются программе, а [/ 53 vars /] – это окружение.
Возвращаемое значение: В конце строки часто указывается результат выполнения вызова. Это результат выполнения системного вызова. Он может быть:
0 (ноль): Вызов прошел успешно.
-1 (минус один): Вызов завершился с ошибкой. В этом случае в переменной errno (номер ошибки) хранится код ошибки, который можно расшифровать с помощью perror(errno).
Целое число: Например, в open возвращается дескриптор открытого файла.
Адрес памяти: Например, в mmap возвращается адрес выделенной памяти.
Это может быть число, адрес памяти или специальный символ (например, "?").
Рисунок 4. Запись вывода команды sudo strace -T date в файл. В активной директории появился новый файл.
Рисунок 5. В домашнем каталоге выполнение записи в файл недоступно в ОС Ubuntu24.
Рисунок 6. Получена статистика выполненных системных вызовов.
Рисунок 7. Для выполнения трассировки системных вызовов для работающего процесса, необходимо узнать его PID. При помощи команды top получен список самых активных процессов с их идентификаторами.
Рисунок 8. Команда sudo
strace
-p
724
вывела трасировку
процесса NetworkManager.
