В этом задании вы на практике поработаете с модулями ядра Linux.
- Домашнее задание выполните в Google Docs и отправьте на проверку ссылку на ваш документ в личном кабинете.
- В названии файла введите корректное название лекции и ваши фамилию и имя.
- Зайдите в «Настройки доступа» и выберите доступ «Просматривать могут все в интернете, у кого есть ссылка». Ссылка на инструкцию «Как предоставить доступ к файлам и папкам на Google Диске».
- Скопируйте текст задания в свой документ.
- Выполните домашнее задание, запишите ответы и приложите необходимые скриншоты в свой Google Документ.
- Для проверки домашнего задания преподавателем отправьте ссылку на ваш документ в личном кабинете.
- Любые вопросы по решению задач задавайте в чате учебной группы.
- Как работает ядро Linux.
- Что такое ядро Linux.
- Модули ядра.
- Управление модулями ядра Linux.
- Модули ядра Linux.
- Команда strace в Linux.
При каких событиях выполнение процесса переходит в режим ядра?
Напишите ответ в свободной форме.
Найдите имя автора модуля libcrc32c
.
В качестве ответа приложите снимок экрана с выводом команды.
Используя утилиту strace
, выясните, какой системный вызов использует команда cd
, чтобы сменить директорию.
Примечание
- Команда
cd
не является внешним файлом, но для наших целей можно использовать:strace bash -c 'cd /tmp'
. - При выводе
strace
вы можете увидеть много системных вызовов. Чтобы разобраться, за что отвечает каждый из них, можете воспользоваться встроенной помощьюman
.
В качестве ответа напишите название системного вызова.
Эти задания дополнительные. Выполнять их не обязательно, и на зачёт они не повлияют. Вы можете их выполнить, если хотите глубже и/или шире разобраться в материале.
Соберите свой модуль и загрузите его в ядро.
Примечание: лучше использовать чистую виртуальную машину, чтобы нивелировать шанс сломать систему.
1. Установим необходимые пакеты:
apt-get install gcc make linux-headers-$(uname -r)
2. Создаём файл модуля:
mkdir kmod-hello_world
cd kmod-hello_world/
touch ./mhello.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
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
— это табуляция, а не пробелы. Для синтаксиса Makefile это важно.
4. Собираем модуль и устанавливаем его с помощью insmod.
make all
insmod path/to/module.ko
В качестве ответа приложите скриншот вывода установки модуля в dmesg
.
- В личном кабинете отправлена ссылка на Google Документ с выполненным заданием.
- В документе настроены права доступа «Просматривать могут все в интернете, у кого есть ссылка».
Зачёт — выполнены все задания, ответы даны в развёрнутой форме, приложены соответствующие скриншоты и файлы проекта, в выполненных заданиях нет противоречий и нарушения логики.
На доработку — задание выполнено частично или не выполнено, в логике выполнения заданий есть противоречия, существенные недостатки.