
- •Лабораторная работа №3 «Ядро Linux»
- •Цель работы
- •Порядок выполнения работы Задание 1. Анализ системных вызовов при выполнении команд с помощью утилиты strace
- •Задание 2. Системные вызовы вашей программы
- •Задание 3. Сборка и загрузка модуля в ядро Linux
- •Выполнение (ход работы) Задание 1. Анализ системных вызовов при выполнении команд с помощью утилиты strace
- •2. Ознакомьтесь со справкой об использовании утилиты strace: man strace.
- •Задание 2. Системные вызовы вашей программы
- •Задание 3. Сборка и загрузка модуля в ядро Linux
- •Заключение
Задание 2. Системные вызовы вашей программы
Выполните разбор системных вызовов для небольшой программы, написанной самостоятельно, и заполните таблицу 2 из задания 1.
Создам простую программу на языке Cи в файле proglr2.c и скомпилирую код командой gcc -o programma proglr2.c
Запустим программу командой strace -r ./programma
Заполним таблицу системных вызовов
№ |
Системный вызов |
Описание вызова |
Входные параметры |
Время выполнения, мкс |
Возвращаемое значение |
1 |
execve |
Выполнение новой команды в текущем процессе |
"./programma" - имя исполняемого файла ["./programma"], 0x7ffee0276e78 - аргументы вызова |
552 |
0 — успешное выполнение |
2 |
openat |
Открытие файла |
AT_FDCWD — директория, в которой лежит файл будет точкой отсчета. "/lib/x86_64-linux-gnu/libc.so.6" путь к файлу O_RDONLY|O_CLOEXEC — только чтение |
214 |
3- Файловый дескриптор |
3 |
mmap |
Отображение предварительно открытого файла / резервирование пространства в адресном пространстве процесса. |
NULL — укаатель на пространство памяти 102691 — количество считываемых байтов PROT_READ — режимы защиты памяти MAP_PRIVATE — тип считываемого объекта 3 — чтение не из файла 0 - смещение |
240 |
0x762702b59000 — указатель на память |
4 |
read |
Чтение из файла |
3 - Файловый дескриптор указатель на буфер, 832 — количество считываемых байтов |
234 |
832 — количество считанных байтов |
5 |
close |
Закрытие файла |
3 - Файловый дескриптор
|
223 |
0 - успех |
Задание 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
Установим модуль через команду insmod mhello.ko и посмотрим результат в dmesg.
5. Выгрузите модуль с помощью команды rmmod и включите снимок экрана вывода в отчет.
Выгружаем модуль командой rmmod mhello.ko и проверяем командой dmesg