Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторные работы терминал / Terminal_KR_Gorodetskiy_BST2154_v2 .docx
Скачиваний:
21
Добавлен:
28.10.2024
Размер:
12.75 Mб
Скачать
  1. Ядро Linux

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

Наблюдение состоит из двух этапов: сначала за системной командой, указанной в соответствии с вариантом, а затем за собственной программой. В обоих случаях составлены таблицы с наиболее распрастраненными вызовами, такими как: execve, brk, mmap, mprotect, access, open, fstat, read, close, write, exit_group, wait4, ioctl, clone, rt_sigaction, rt_sigprocmask, rt_sigreturn. Их основные свойства были также описаны в таблицах.

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

Команда top показывает список работающих в данный момент процессов и информацию о них, включая использование ими памяти и процессора.

Рисунок 4-3-1. Проверка наличия утилиты strace.

Рисунок 4-3-2. Справка об использовании утилиты strace

Рисунок 4-3-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-3-4. Запись вывода команды sudo strace -T date в файл. В активной директории появился новый файл.

Рисунок 4-3-5. В домашнем каталоге выполнение записи в файл недоступно в ОС Ubuntu24.

Рисунок 4-3-6. Получена статистика выполненных системных вызовов.

Рисунок 4-3-7. Для выполнения трассировки системных вызовов для работающего процесса, необходимо узнать его PID. При помощи команды top получен список самых активных процессов с их идентификаторами.

Рисунок 4-3-8. Команда sudo strace -p 724 вывела трасировку процесса NetworkManager.