Skip to content

Latest commit

 

History

History
140 lines (87 loc) · 6.44 KB

2-08.md

File metadata and controls

140 lines (87 loc) · 6.44 KB

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

Цель задания

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

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

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


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

В личном кабинете отправлена ссылка на Google документ с выполненным заданием.
В документе настроены права доступа “Просматривать могут все в Интернете, у кого есть ссылка”


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

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

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