Skip to content

Latest commit

 

History

History
143 lines (87 loc) · 6.35 KB

2-08.md

File metadata and controls

143 lines (87 loc) · 6.35 KB

Домашнее задание к занятию «Ядро операционной системы»

Цель задания

В этом задании вы на практике поработаете с модулями ядра Linux.

Инструкция к заданию

  1. Домашнее задание выполните в Google Docs и отправьте на проверку ссылку на ваш документ в личном кабинете.
  2. В названии файла введите корректное название лекции и ваши фамилию и имя.
  3. Зайдите в «Настройки доступа» и выберите доступ «Просматривать могут все в интернете, у кого есть ссылка». Ссылка на инструкцию «Как предоставить доступ к файлам и папкам на Google Диске».
  4. Скопируйте текст задания в свой документ.
  5. Выполните домашнее задание, запишите ответы и приложите необходимые скриншоты в свой Google Документ.
  6. Для проверки домашнего задания преподавателем отправьте ссылку на ваш документ в личном кабинете.
  7. Любые вопросы по решению задач задавайте в чате учебной группы.

Инструменты и дополнительные материалы, которые пригодятся для выполнения задания

  1. Как работает ядро Linux.
  2. Что такое ядро Linux.
  3. Модули ядра.
  4. Управление модулями ядра Linux.
  5. Модули ядра Linux.
  6. Команда strace в Linux.

Задание 1

При каких событиях выполнение процесса переходит в режим ядра?

Напишите ответ в свободной форме.


Задание 2

Найдите имя автора модуля libcrc32c.

В качестве ответа приложите снимок экрана с выводом команды.


Задание 3

Используя утилиту strace, выясните, какой системный вызов использует команда cd, чтобы сменить директорию.

Примечание

  1. Команда cd не является внешним файлом, но для наших целей можно использовать: strace bash -c 'cd /tmp'.
  2. При выводе strace вы можете увидеть много системных вызовов. Чтобы разобраться, за что отвечает каждый из них, можете воспользоваться встроенной помощью man.

В качестве ответа напишите название системного вызова.


Дополнительные задания (со звездочкой*)

Эти задания дополнительные. Выполнять их не обязательно, и на зачёт они не повлияют. Вы можете их выполнить, если хотите глубже и/или шире разобраться в материале.

Задание 4*

Соберите свой модуль и загрузите его в ядро.

Примечание: лучше использовать чистую виртуальную машину, чтобы нивелировать шанс сломать систему.

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.


Правила приёма работы

  1. В личном кабинете отправлена ссылка на Google Документ с выполненным заданием.
  2. В документе настроены права доступа «Просматривать могут все в интернете, у кого есть ссылка».

Критерии оценки

Зачёт — выполнены все задания, ответы даны в развёрнутой форме, приложены соответствующие скриншоты и файлы проекта, в выполненных заданиях нет противоречий и нарушения логики.

На доработку — задание выполнено частично или не выполнено, в логике выполнения заданий есть противоречия, существенные недостатки.