В результате выполнения этого задания вы на практике поработает с модулями ядра Linux.
- Сделайте копию Шаблона для домашнего задания себе на Google Disk.
- В названии файла введите корректное название лекции и вашу фамилию и имя.
- Зайдите в “Настройки доступа” и выберите доступ “Просматривать могут все в Интернете, у кого есть ссылка”. Ссылка на инструкцию Как предоставить доступ к файлам и папкам на Google Диске
- Скопируйте текст задания в свой документ.
- Выполните домашнее задание, запишите ответы и приложите необходимые скриншоты в свой Google Doc.
- Для проверки домашнего задания преподавателем отправьте ссылку на ваш документ в личном кабинете.
- Любые вопросы по решению задач задавайте в чате учебной группы.
- Как работает ядро 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 документ с выполненным заданием.
В документе настроены права доступа “Просматривать могут все в Интернете, у кого есть ссылка”
Зачет - выполнены все задания, ответы даны в развернутой форме, приложены соответствующие скриншоты и файлы проекта, в выполненных заданиях нет противоречий и нарушения логики.
На доработку - задание выполнено частично или не выполнено, в логике выполнения заданий есть противоречия, существенные недостатки.