Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
Наш драйвер пока еще не может называться драйвером в прямом смысле этого слова: устройство-то он регистрирует, но не позволяет выполнить ни одной операции с устройством – ведь структура file_operations пуста.
Кроме структуры file_operations, нам еще понадобится структура для хранения информации о состоянии устройства, а так как устройств у нас два, то также нужен массив структур для хранения состояния каждого устройства. Индексами массива будут младшие номера устройств.
// Структура для хранения состояния устройства
struct device_state
{
// 1 – устройство открыто, 0 - закрыто
int dev_open;
// Количество прочитанных байт из устройства
ssize_t byte_read;
// Количество записанных байт
ssize_t byte_write;
};
// Массив для хранения информации о состоянии устройств
static struct device_state state[2];
В принципе можно обойтись и без кода поиска устройств – без него модуль будет проще, да и работать он будет быстрее. А мы знаем, чем проще программа, тем она надежнее. Обойти поиск устройств можно следующим образом. Мы не знаем, сколько устройств типа device будет у конечного пользователя – у него может быть только одно устройство – /dev/device0, а может быть целых 20 устройств – /dev/device0…/dev/device19. Поэтому вместо описанного выше массива state, нужно использовать динамический список, который будет содержать информацию о каждом устройстве типа device. При загрузке модуля он будет содержать всего один элемент – для устройства /dev/device0. Даже если этого устройства не будет в системе, будем считать, что оно просто закрыто, а при попытке обращения к нему будем сообщать, что оно занято. По мере поступления запросов программ на открытие других устройств /dev/deviceX будем добавлять новые элементы в наш список. Чтобы не усложнять код нашего модуля, в этой статье мы не будем использовать динамические структуры – для вас как начинающего разработчика модулей ядра Linux, главное – разобраться с написанием самого модуля, а добавить динамические списки вы можете в любой момент сами.
Если же вам все-таки хочется узнать конкретное количество устройств /dev/deviceX, установленных у пользователя, можно просто просмотреть содержимое каталога /dev и посчитать количество файлов device*.
Все готово для того, чтобы написать функцию открытия устройства.
Листинг 8. Функция открытия устройства
static int device_open(struct inode *inode, struct file *fp)
{
struct device_state *dev_state;
printk("My module: try to open device with minor number %d ", MINOR(inode->i_rdev));
dev_state = &state[MINOR(inode->i_rdev)];
if(dev_state->dev_open)
{
printk("Devise is busy ");
return -EBUSY;
}
dev_state->dev_open = 1;
dev_state->byte_read = 0;
dev_state->byte_write = 0;