65843

УПРАВЛЕНИЕ ФУНКЦИОНАЛЬНОСТЬЮ ЯДРА ОПЕРЦИОННОЙ СИСТЕМЫ

Лабораторная работа

Информатика, кибернетика и программирование

Не вникая в подробности, можно сказать, что схемы идентификации PCI- и USB- устройств парой VendorID — DeviceID по сути одинаковы, поэтому написание своего модуля не составило большой сложности.

Русский

2014-08-09

168.27 KB

1 чел.

Министерство образования и науки Российской Федерации

Санкт-Петербургский государственный политехнический университет

Факультет технической кибернетики

Кафедра «Информационная безопасность компьютерных систем»

ОТЧЕТ

по лабораторной работе №2

«УПРАВЛЕНИЕ ФУНКЦИОНАЛЬНОСТЬЮ ЯДРА ОПЕРЦИОННОЙ

СИСТЕМЫ»

по курсу «Операционные системы»

Выполнил

студент гр. 2088/4    А.А.Чернышев

                           <подпись>

Руководитель     А.С. Коноплев

                           <подпись>

Санкт-Петербург

2012

  1.  Формулировка задания

Цель работы — изучение ядра ОС UNIX и модульной архитектуры ядра, исследование расширения функциональности ядра ОС.

2. Использованные теоретические сведения

Материалы из методического пособия 02.pdf, “Программирование модулей ядра Linux” Олег Цирюльник.

3. Результаты работы

3.1. Выполнение индивидуального задания

Разработать модуль, который при возникновении прерывания со стороны USB-порта должен выводить на экран сообщение “USB is in use”. 

На начальных этапах выполнения данного задания, возникло множество проблем и вопросов, однако все разрешились по прочтению части замечательной книги  “Программирование модулей ядра Linux”.

Не вникая в подробности, можно сказать, что схемы идентификации PCI- и USB- устройств парой VendorID — DeviceID по сути одинаковы, поэтому написание своего модуля не составило большой сложности.

В книге есть модуль, позволяющий следить за устройствами, VendorID и DeviceID которых занесены в некоторую структуру. Модуль позволяет получать детальную информацию об известном модулю USB-устройстве. В своем модуле я буду следить, только за одни устройством. Это обусловлено тем, что для того, чтобы наш модуль начал следить за устройством, надо для начала убить модули, которые уже работают с устройством.

В качестве устройства, за которым будет вестись “слежка”, был выбран небольшой беспроводной USB-нано-приемник.  

Для начала, подсоединил свое устройство, по команде lsusb в терминале отследил VendorID=046d и DeviceID=c21f, и сразу же в логе (dmesg) отследил, какие модули подключились для работы с моим устройством. По команде lsmod, убедился, что такие модули действительно работают.


Далее я “убиваю” модули:

sleep@FISL-PC:~/my_mod$ sudo rmmod xpad

sleep@FISL-PC:~/my_mod$ sudo rmmod ff_memless 

Проверяю, не осталось ли их:

Удостоверившись, можно, регистрировать свой модуль, но для начала соберем его.

Листинг модуля (usb_module.c):

#include <linux/module.h>

#include <linux/usb.h>

#include <linux/slab.h>

struct my_usb_info {

  int connect_count;

};

#define USB_INFO KERN_INFO "USB-module says: "

static int my_usb_probe( struct usb_interface *intf, const struct usb_device_id *id ) {

  struct my_usb_info *usb_info;

  static int my_counter = 0;

  printk( USB_INFO "Unit has connected!\n" );

  usb_info = kmalloc( sizeof( struct my_usb_info ), GFP_KERNEL );

  usb_info->connect_count = my_counter++;

  usb_set_intfdata( intf, usb_info );

  return 0;

}

static void my_usb_disconnect( struct usb_interface *intf ) {

  struct my_usb_info *usb_info;

  usb_info = usb_get_intfdata(intf);

  printk( USB_INFO "Unit has disconnected!\n" );

  kfree( usb_info );

}

static struct usb_device_id my_usb_table[] = {

  { USB_DEVICE( 0x046d, 0xc21f ) }, // Logitech Inc, F710 Wirelles Gamepad

  { USB_DEVICE( 0x046d, 0xc22f ) },    

  {  },                             

};

MODULE_DEVICE_TABLE( usb, my_usb_table );

static struct usb_driver my_usb_driver = {

  .name = "USB-xPad",

  .probe = my_usb_probe,

  .disconnect = my_usb_disconnect,

  .id_table = my_usb_table,

};

static int __init my_init_module( void ) {

  int err;

  printk( USB_INFO "Hello, USB module is startuping!\n" );

  err = usb_register( &my_usb_driver );

  return err;

}

static void my_cleanup_module( void ) {

  printk( USB_INFO "Goodbye, USB module is shutdowning!\n" );

  usb_deregister( &my_usb_driver );

}

module_init( my_init_module );

module_exit( my_cleanup_module );

MODULE_LICENSE( "GPL v2" );

Листинг Makefile:

CURRENT = $(shell uname -r)

KDIR = /lib/modules/$(CURRENT)/build

PWD = $(shell pwd)

DEST = /lib/modules/$(CURRENT)/misc

TARGET = usb_module

obj-m := $(TARGET).o

default:

$(MAKE) -C $(KDIR) M=$(PWD) modules

clean:

@rm -f *.o .*.cmd .*.flags *.mod.c *.order

@rm -f .*.*.cmd *.symvers *~ *.*~

@rm -fR .tmp*

 @rm -rf .tmp_versions

Листинг скрипта, запускающего процесс сборки модуля (makeit.sh):

make -C /usr/src/linux-headers-3.0.0-17-generic-pae SUBDIRS=$PWD modules

Итак, процесс сборки:

sleep@FISL-PC:~/my_mod$ sudo sh makeit.sh

make: Вход в каталог `/usr/src/linux-headers-3.0.0-17-generic-pae'

 CC [M]  /home/sleep/my_mod/usb_module.o

 Building modules, stage 2.

 MODPOST 1 modules

 CC      /home/sleep/my_mod/usb_module.mod.o

 LD [M]  /home/sleep/my_mod/usb_module.ko

make: Выход из каталога `/usr/src/linux-headers-3.0.0-17-generic-pae'

sleep@FISL-PC:~/my_mod$


Модуль собран, можно его регистрировать:

sleep@FISL-PC:~/my_mod$ sudo insmod usb_module.ko

Для вывода сообщений в окно терминала был написан скрипт (dialog.sh):

dmesg | grep says | tail -n3

Проверяем, зарегистрировался ли модуль (или lsmod | grep usb_module, или посмотреть выдаст ли модуль сообщение о запуске):

sleep@FISL-PC:~/my_mod$ sudo sh dialog.sh

[  468.400341] USB-module says: Hello, USB module is startuping!

Модуль зарегистрирован, подключаем наше устройство, смотрим, что выдаст модуль:

sleep@FISL-PC:~/my_mod$ sudo sh dialog.sh

[  911.933938] USB-module says: Hello, USB module is startuping!

[  911.933966] USB-module says: Unit has connected!

А теперь отключим устройство:

sleep@FISL-PC:~/my_mod$ sudo sh dialog.sh

[  911.933938] USB-module says: Hello, USB module is startuping!

[  911.933966] USB-module says: Unit has connected!

[  954.229947] USB-module says: Unit has disconnected!

После проверки работоспособности можем удалить модуль:

sleep@FISL-PC:~/my_mod$ sudo rmmod usb_module

sleep@FISL-PC:~/my_mod$ sudo sh dialog.sh

[  911.933966] USB-module says: Unit has connected!

[  954.229947] USB-module says: Unit has disconnected!

[  981.880705] USB-module says: Goodbye, USB module is shutdowning!

Модуль справляется с поставленной задачей полностью, и его можно дорабатывать дальше.

3.2. Ответы на контрольные вопросы

Что такое драйвер устройства?

Драйвер устройства - это компьютерная программа, с помощью которой другая программа (обычно операционная система) получает доступ к аппаратному обеспечению данного устройства. В общем случае, для использования любого устройства (как внешнего, так и внутреннего) необходим драйвер. Обычно с операционными системами поставляются драйверы для ключевых компонентов аппаратного обеспечения, без которых система не сможет работать. Однако для некоторых устройств (таких, как видеокарта или принтер) могут потребоваться специальные драйверы, обычно предоставляемые производителем устройства.

Каковы функции утилиты modprobe?

Когда ядро обнаруживает необходимость в тех или иных функциональных возможностях, еще не загруженных в память, то демон kmod вызывает утилиту modprobe, передавая ей строку в виде: <название модуля> <универсальный идентификатор>, например: softdog charmajor-10-30.

Что содержат части top half и bottom half функции-обработчика прерывания?

В top half выполняются минимальные действия по обнаружению прерывания и получению его

параметров, а в bottom half— все остальные нужные действия.

Каково назначение файловой системы /proc?

Первоначально она создавалась с целью получения сведений о процессах, теперь она интенсивно используется и самим ядром. Например, /proc/modules — список загруженных модулей,

/proc/meminfo— статистика использования памяти.

С какой целью используются ioctl-управляющих кодов?

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

4. Выводы

В данной работе были исследованы основные особенности работы с ядром операционной системы.


 

А также другие работы, которые могут Вас заинтересовать

11893. Определение кальция методом стандартных добавок 443.5 KB
  Лабораторная работа №104 Определение кальция методом стандартных добавок. Краткое теоретическое введение: Фотометрия пламени вид эмиссионного спектрального анализа в котором источниками возбуждения спектров являются пламена различных видов: ацетиленвоздух...
11894. Определение фосфора (ортофосфатов) в виде фосформолибденованадиевой гетерополикислоты 204 KB
  Лабораторная работа №107 Определение фосфора ортофосфатов в виде фосформолибденованадиевой гетерополикислоты. Краткое теоретическое введение: Методы молекулярной спектрометрии позволяют наблюдать результаты взаимодействия электромагнитного излучения с мо...
11895. Титрование цинка (II) раствором ЭДТА в присутствии индикатора эриохрома черного Т. 244 KB
  Лабораторная работа №110 Титрование цинка II раствором ЭДТА в присутствии индикатора эриохрома черного Т. Краткое теоретическое введение: Методы молекулярной спектрометрии позволяют наблюдать результаты взаимодействия электромагнитного излучения с молекула
11896. Определение хлоридов в растворе 68 KB
  Лабораторная работа №113 Определение хлоридов в растворе. Краткое теоретическое введение: Фототурбидиметрия и фотонефелометрия основаны на явлении рассеяния света дисперсными системами суспензиями или золями получаемыми в результате аналитических реакций. П...
11897. Анализ очищенного рассола для производства хлора и каустической соды 138.5 KB
  Лабораторная работа №203 Анализ очищенного рассола для производства хлора и каустической соды Краткое теоретическое введение: Общая характеристика метода. В основе потенциометрии лежит зависимость равновесного электродного потенциала от активности концент
11898. Кулонометрическое титрование кислот 154.5 KB
  Лабораторная работа №211 Кулонометрическое титрование кислот Краткое теоретическое введение: Кулонометрия объединяет методы анализа основанные на измерении количества электричества израсходованного на электрохимические реакции приводящие к количественному ...
11899. Определение жидких хлорметанов в их смеси 295 KB
  Лабораторная работа №301 Определение жидких хлорметанов в их смеси. Краткое теоретическое введение: Достоинства метода газожидкостной хроматографии ГЖХ и газовой хроматографии в целом: 1 высокая разделительная способность и экспрессность процесса; 2 возможнос
11900. Определение СН3СООН, СН3СООNa, NaCl в их смеси 402 KB
  Лабораторная работа №304 Определение СН3СООН СН3СООNa NaCl в их смеси Краткое теоретическое введение: Общая характеристика метода Ионообменная хроматография метод разделения смесей основанный на распределении компонентов смеси между раствором и ионообменником...
11901. Определение аминокислот в их смеси 289 KB
  Лабораторная работа №309 Определение аминокислот в их смеси. Краткое теоретическое введение: Общая характеристика метода Создание метода бумажной хроматографии в 1944 г. значительно расширило возможности разделения идентификации и количественного определен...