Чтение онлайн

на главную - закладки

Жанры

Linux: Полное руководство

Аллен Питер В.

Шрифт:

// Старший номер файла устройства

static int Major;

// Структура file_operations - пока пустая,

//но вскоре мы ее напишем

struct file_operations FO;

// Обработчик прерывания

void irq_handler(int irq, void *dev_id,

 struct pt_regs *regs) {

 return;

}

int init_module {

 // Регистрируем устройство

 printk("My module: starting...\n");

 Major = register_chrdev(0, DEV_NAME, &F0);

 if (Major < 0) {

// Устройство не зарегистрировано

printk("My module: registration failed\n");

return Major;

 }

 printk("My module: device registered, major number = %d\n",

Major);

 // Резервирование портов ввода-вывода

 printk("My module: allocating io ports\n");

 if (check_region(PORT_START, PORT_QTY)) {

printk("My module; allocation io ports failed\n");

return -EBUSY;

 }

 request_region(PORT_START, PORT_QTY, DEV_NAME);

 printk("My module: io ports allocated\n");

 // Резервирование памяти

 if (check_mem_region(MEM_START, MEM_QTY)) {

printk("My module: memory allocation failed\n");

release_region(PORT_START, PORT_QTY);

return -EBUSY;

 }

 request_mem_region(MEM_START, MEM_QTY, DEV_NAME);

 printk("My module: memory allocated\n");

 // Резервирование прерывания

 if (request_irq(IRQ_NUM, irq_handler, 0, DEV_NAME, NULL)) {

printk("My module: IRQ allocation failed\n");

release_mem_region(MEM_START, MEM_QTY);

release_region(PORT_START, PQRT_QTY);

return -EBUSY;

 }

 printk("My module: IRQ allocated\n");

 return 0;

}

void cleanup_module {

 // Освобождаем порты ввода-вывода

 release_region(PORT_START, PORT_QTY);

 printk("My module; release io ports\n");

 // Освобождаем память

 release_mem_region(MEM_START, MEM_QTY);

 printk("My module: release memory\n");

 // Освобождаем прерывание

 free_irq(IRQ_NUM, NULL);

 printk("My module: release irq\n");

 // Отменяем регистрацию устройства

 if (unregister_chrdev(Major, DEV_NAME) < 0){

printk("My module: cannot to unregister device\n");

 }

 printk("My module: device unregistered\n");

 return;

}

При загрузке модуля вы увидите следующее сообщение:

My module: device registered, major number = 255

Конечно, кроме этого сообщения будут и другие, но нас они не интересуют. Почему именно это сообщение так важно для нас? В первой части сообщения говорится, что наше устройство успешно зарегистрировано, а во второй сообщается старший номер устройства, который мы будем использовать для создания устройств /dev/device0 и /dev/device1.

Вы не забыли, что нам еще нужно создать два устройства типа device, чтобы программы могли работать с ними? Перейдите в каталог

/dev
и от имени суперпользователя выполните команды:

# mknod device с 255 0

# mknod device с 255 1

Здесь 255 — это старший номер устройства (у вас он будет другим), 0 и 1 — младшие номера устройств. После выполнения данных команд будут созданы два файла устройств —

/dev/device0
и
/dev/device1
.

После регистрации устройства функцией register_chrdev мы пытаемся захватить диапазон портов. Для этого предназначена функция request_region, но перед ее вызовом мы должны убедиться, что нужный нам диапазон не используется (функция check_region). Затем, если нужно, мы резервируем память для нашего устройства. Для резервирования памяти используется функция request_mem_region, а для проверки возможности захвата памяти предназначена функция check_mem_region. После успешной регистрации памяти можно попытаться захватить IRQ — функция request_irq.

Предположим, что на каком-то этапе регистрации модуля произошла ошибка. Если мы не смогли зарегистрировать порты ввода/вывода, вряд ли имеет смысл продолжать работу. Если же ошибка произошла при резервировании памяти, то перед завершением работы модуля нам нужно освободить порты ввода/вывода, которые мы зарегистрировали на предыдущем этапе. Аналогично поступаем при ошибке захвата IRQ — освобождаем порты и память. Функции

release_mem_region
,
release_region
и
free_irq
используются для освобождения памяти, портов и IRQ соответственно.

Поделиться:
Популярные книги

Старый, но крепкий 7

Крынов Макс
7. Культивация без насилия
Фантастика:
рпг
уся
фэнтези
5.00
рейтинг книги
Старый, но крепкий 7

Тринадцатый III

NikL
3. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Тринадцатый III

Оживший камень

Кас Маркус
1. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Оживший камень

Неучтенный элемент. Том 2

NikL
2. Антимаг. Вне системы
Фантастика:
городское фэнтези
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 2

Искатель 1

Шиленко Сергей
1. Валинор
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Искатель 1

Наследник

Шимохин Дмитрий
1. Старицкий
Приключения:
исторические приключения
5.00
рейтинг книги
Наследник

Древесный маг Орловского княжества 3

Павлов Игорь Васильевич
3. Орловское княжество
Фантастика:
аниме
сказочная фантастика
фэнтези
попаданцы
гаремник
5.00
рейтинг книги
Древесный маг Орловского княжества 3

Князь Целитель 2

Ткачев Андрей Юрьевич
2. Князь Целитель
Фантастика:
боевая фантастика
городское фэнтези
аниме
фэнтези
5.00
рейтинг книги
Князь Целитель 2

Наследие Маозари 9

Панежин Евгений
9. Наследие Маозари
Фантастика:
попаданцы
постапокалипсис
рпг
сказочная фантастика
6.25
рейтинг книги
Наследие Маозари 9

1941, Великая Отечественная катастрофа: Итоги дискуссии

Коллектив авторов
Документальная литература:
военная документалистика
6.25
рейтинг книги
1941, Великая Отечественная катастрофа: Итоги дискуссии

Кодекс Охотника. Книга ХХ

Винокуров Юрий
20. Кодекс Охотника
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга ХХ

Старый, но крепкий 2

Крынов Макс
2. Культивация без насилия
Фантастика:
рпг
уся
эпическая фантастика
5.00
рейтинг книги
Старый, но крепкий 2

На границе империй. Том 9. Часть 4

INDIGO
17. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 4

Жут

Май Карл Фридрих
Приключения:
вестерны
6.25
рейтинг книги
Жут