Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторные работы терминал / Terminal_LR3_Gorodetskiy_BST2154_v1-2.docx
Скачиваний:
13
Добавлен:
28.10.2024
Размер:
2.28 Mб
Скачать

Задание 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. Выполнение работы Задание 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.