My-library.info
Все категории

Денис Колисниченко - Linux: Полное руководство

На электронном книжном портале my-library.info можно читать бесплатно книги онлайн без регистрации, в том числе Денис Колисниченко - Linux: Полное руководство. Жанр: Программное обеспечение издательство -, год 2004. В онлайн доступе вы получите полную версию книги с кратким содержанием для ознакомления, сможете читать аннотацию к книге (предисловие), увидеть рецензии тех, кто произведение уже прочитал и их экспертное мнение о прочитанном.
Кроме того, в библиотеке онлайн my-library.info вы найдете много новинок, которые заслуживают вашего внимания.

Название:
Linux: Полное руководство
Издательство:
-
ISBN:
-
Год:
-
Дата добавления:
17 сентябрь 2019
Количество просмотров:
470
Читать онлайн
Денис Колисниченко - Linux: Полное руководство

Денис Колисниченко - Linux: Полное руководство краткое содержание

Денис Колисниченко - Linux: Полное руководство - описание и краткое содержание, автор Денис Колисниченко, читайте бесплатно онлайн на сайте электронной библиотеки My-Library.Info
Данная книга представляет собой великолепное руководство по Linux, позволяющее получить наиболее полное представление об этой операционной системе. Книга состоит из трех частей, каждая из которых раскрывает один из трех основных аспектов работы с Linux: Linux для пользователя, сетевые технологии Linux (и методика настройки Linux-сервера), программирование Linux. В книге охвачен очень широкий круг вопросов, начиная с установки и использования Linux «в обычной жизни» (офисные пакеты, игры, видео, Интернет), и заканчивая описанием внутренних процессов Linux, секретами и трюками настройки, особенностями программирования под Linux, созданием сетевых приложений, оптимизацией ядра и др.Изложение материала ведется в основном на базе дистрибутивов Fedora Cora (Red Hat) и Mandriva (Mandrake). Однако не оставлены без внимания и другие дистрибутивы SuSe, Slackware, Gentoo, Alt Linux, Knоppix. Дается их сравнительное описание, a по ходу изложения всего материала указываются их особенности.Книга написана известными специалистами и консультантами по использованию Linux, авторами многих статей и книг по Linux, заслуживших свое признание в самых широких Linux-кругах. Если вы желаете разобраться в особенностях Linux и познать ее внутренний мир, эта книга — ваш лучший выбор.

Linux: Полное руководство читать онлайн бесплатно

Linux: Полное руководство - читать книгу онлайн бесплатно, автор Денис Колисниченко

При регистрации устройства нужно указать его тип — старший номер устройства. Но для этого нужно знать, какие номера свободны. Проще всего указать первым аргументом 0 — тогда функция возвратит первый свободный старший номер символьного устройства для вашей системы. Если старший номер указать явно, может возникнуть конфликт номеров, и наше устройство не будет зарегистрировано.

Второй параметр определяет имя устройства («device»). Последний параметр очень важен. Это структура указателей на функции для работы с нашим устройством. Наш модуль содержит таблицу доступных функций, а операционная система вызывает нужную функцию, когда пользовательской программе нужно выполнить операцию с файлом устройства (открытие/закрытие, чтение/запись). Таблица функций символьного устройства хранится в структуре file_operations, которая передается при регистрации устройства.

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

Листинг 28.6. Драйвер устройства /dev/device (без структуры file_operations)

#define MODULE

#define __KERNEL__

#include <linux/module.h>

#include <linux/init.h>

#include <linux/kernel.h>

#include <linux/fs.h> // регистрация устройств

#include <linux/ioport.h> // работа с портами ввода/вывода

#include <linux/sched.h> // резервирование прерывания


// Имя нашего устройства

#define DEV_NAME "device"

// Порты ввода-вывода нашего устройства

#define PORT_START 0x2000 #define PORT_QTY 10

// Память нашего устройства

#define MEM_START 0x20000000

#define MEM_QTY 0x20

// Номер прерывания для нашего устройства

#define IRQ_NUM 9


MODULE_AUTHOR("Denis Kolisnichenko [email protected]");

MODULE_DESCRIPTION("Linux kernel module");


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

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 failedn");

  return Major;

 }


 printk("My module: device registered, major number = %dn",

  Major);


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

 printk("My module: allocating io portsn");

 if (check_region(PORT_START, PORT_QTY)) {

  printk("My module; allocation io ports failedn");

  return -EBUSY;

 }


 request_region(PORT_START, PORT_QTY, DEV_NAME);

 printk("My module: io ports allocatedn");

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

 if (check_mem_region(MEM_START, MEM_QTY)) {

  printk("My module: memory allocation failedn");

  release_region(PORT_START, PORT_QTY);

  return -EBUSY;

 }

 request_mem_region(MEM_START, MEM_QTY, DEV_NAME);

 printk("My module: memory allocatedn");


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

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

  printk("My module: IRQ allocation failedn");

  release_mem_region(MEM_START, MEM_QTY);

  release_region(PORT_START, PQRT_QTY);

  return -EBUSY;

 }

 printk("My module: IRQ allocatedn");

 return 0;

}


void cleanup_module() {

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

 release_region(PORT_START, PORT_QTY);

 printk("My module; release io portsn");

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

 release_mem_region(MEM_START, MEM_QTY);

 printk("My module: release memoryn");

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

 free_irq(IRQ_NUM, NULL);

 printk("My module: release irqn");

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

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

  printk("My module: cannot to unregister devicen");

 }

 printk("My module: device unregisteredn");

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

Обратите внимание: мы написали драйвер так, что он захватывает порты и память от имени одного устройства — DEV_NAME. В реальности все гораздо сложнее: нужно захватывать ресурсы для каждого устройства данного типа. К тому же придется предусмотреть поиск устройств модулем: в нашем случае мы знаем, что устройств только два, но у конечного пользователя таких устройств может быть больше или меньше, поэтому наш модуль не будет универсален, если он будет поддерживать только два устройства.

28.4. Операции над устройством. Поиск устройств

Наш модуль пока еще не может называться «драйвером» в прямом смысле этого слова: устройство-то он регистрирует, но не позволяет выполнить ни одной операции с ним — ведь структура file_operations пуста.

Кроме структуры file_operations нам еще понадобится структура для хранения информации о состоянии устройства, а так как устройств у нас два, то нужен также массив структур для хранения состояния каждого устройства. Индексами массива будут младшие номера устройств.

// Структура для хранения состояния устройства

struct device_state {

 int dev_open; // 1 - устройство открыто, 0 - закрыто

 ssize_t byte_read; // Количество прочитанных

                    // из устройства байтов

 ssize_t byte_write; // Количество записанных байтов

};

// Массив для хранения информации о состоянии устройств

static struct device_state state[2];

В принципе, можно обойтись и без кода поиска устройств — без него модуль будет проще (а значит, надежнее), да и работать он будет быстрее. Обойти поиск устройств можно следующим образом. Мы не знаем, сколько устройств типа device будет у конечного пользователя. Поэтому вместо массива state (он будет описан ниже) нужно использовать динамический список, который будет содержать информацию о каждом устройстве типа device. При загрузке модуля список будет содержать всего один элемент — для устройства /dev/device0. Если устройств этого типа в системе нет вообще, будем просто считать, что устройство device0 закрыто, а при попытке обращения к нему будем сообщать, что оно занято. По мере поступления запросов программ на открытие других устройств /dev/deviceX будем добавлять в наш список новые элементы.

Если же вам все-таки хочется узнать конкретное количество устройств /dev/deviceX, установленных у пользователя, можно просто просмотреть содержимое каталога /dev и посчитать количество файлов device*.


Денис Колисниченко читать все книги автора по порядку

Денис Колисниченко - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки My-Library.Info.


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

Отзывы читателей о книге Linux: Полное руководство, автор: Денис Колисниченко. Читайте комментарии и мнения людей о произведении.

Прокомментировать
Подтвердите что вы не робот:*
Подтвердите что вы не робот:*
Все материалы на сайте размещаются его пользователями.
Администратор сайта не несёт ответственности за действия пользователей сайта..
Вы можете направить вашу жалобу на почту librarybook.ru@gmail.com или заполнить форму обратной связи.