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

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

Жанры

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

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

Дым и пепел

Хафф Таня
3. Дымовая трилогия
Фантастика:
ужасы и мистика
8.21
рейтинг книги
Дым и пепел

Отморозок 3

Поповский Андрей Владимирович
3. Отморозок
Фантастика:
попаданцы
5.50
рейтинг книги
Отморозок 3

Возвышение Рима. Создание Великой Империи

Эверет Энтони
Научно-образовательная:
история
5.00
рейтинг книги
Возвышение Рима. Создание Великой Империи

Расстрелянный парламент

Грешневиков Анатолий Николаевич
Научно-образовательная:
история
политика
5.00
рейтинг книги
Расстрелянный парламент

Последний Паладин. Том 6

Саваровский Роман
6. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 6

Дневник (1887-1910)

Ренар Жюль
Проза:
проза прочее
4.00
рейтинг книги
Дневник (1887-1910)

Звезда смерти

Мартин Джордж Р.Р.
Фантастика:
научная фантастика
5.00
рейтинг книги
Звезда смерти

Американский доктор из России, или история успеха

Голяховский Владимир Юльевич
Документальная литература:
биографии и мемуары
6.60
рейтинг книги
Американский доктор из России, или история успеха

Кавказская овчарка

Некрасова Ирина Николаевна
Все о собаках
Дом и Семья:
домашние животные
6.25
рейтинг книги
Кавказская овчарка

Не может быть мёртв

Рэнкин Иэн
2. Инспектор Малькольм Фокс
Детективы:
полицейские детективы
4.50
рейтинг книги
Не может быть мёртв

И тогда мы скоро полетим на Марс, если только нам это будет нужно

Павлов Алексей Андреевич
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
И тогда мы скоро полетим на Марс, если только нам это будет нужно

Шпионы XX века

Найтли Филлип
Научно-образовательная:
история
политика
5.00
рейтинг книги
Шпионы XX века

Первый среди равных. Книга V

Бор Жорж
5. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Первый среди равных. Книга V

Башни полуночи

Сандерсон Брендон
13. Колесо Времени
Фантастика:
фэнтези
8.53
рейтинг книги
Башни полуночи