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

на главную

Жанры

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 соответственно.

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

На границе империй. Том 5

INDIGO
5. Фортуна дама переменчивая
Фантастика:
боевая фантастика
попаданцы
7.50
рейтинг книги
На границе империй. Том 5

Довлатов. Сонный лекарь 2

Голд Джон
2. Не вывожу
Фантастика:
альтернативная история
аниме
5.00
рейтинг книги
Довлатов. Сонный лекарь 2

Всадник Системы

Poul ezh
2. Пехотинец Системы
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Всадник Системы

Фиктивная жена

Шагаева Наталья
1. Братья Вертинские
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Фиктивная жена

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

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

Неверный

Тоцка Тала
Любовные романы:
современные любовные романы
5.50
рейтинг книги
Неверный

Релокант. Вестник

Ascold Flow
2. Релокант в другой мир
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Релокант. Вестник

Адепт: Обучение. Каникулы [СИ]

Бубела Олег Николаевич
6. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.15
рейтинг книги
Адепт: Обучение. Каникулы [СИ]

Жена на четверых

Кожина Ксения
Любовные романы:
любовно-фантастические романы
эро литература
5.60
рейтинг книги
Жена на четверых

Черный маг императора 2

Герда Александр
2. Черный маг императора
Фантастика:
юмористическая фантастика
попаданцы
аниме
6.00
рейтинг книги
Черный маг императора 2

Я еще граф

Дрейк Сириус
8. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я еще граф

Возвышение Меркурия. Книга 15

Кронос Александр
15. Меркурий
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 15

Мимик нового Мира 5

Северный Лис
4. Мимик!
Фантастика:
юмористическая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Мимик нового Мира 5

Идеальный мир для Социопата 4

Сапфир Олег
4. Социопат
Фантастика:
боевая фантастика
6.82
рейтинг книги
Идеальный мир для Социопата 4