Проблема с символьным устройством в ядре Linux

#c #linux #linux-kernel #kernel

#c #linux #linux-ядро #ядро

Вопрос:

У меня проблема в моем модуле ядра, я пишу модуль, который позволяет потокам из разных процессов обмениваться сообщениями, я генерирую разные CHRDriver для ее достижения. Я написал скелет нужных мне функций, но я заметил, что при одинаковом использовании драйвера file_operations они также разделяют значения переменных? Как мне сделать, чтобы они имели одинаковые логические переменные, но по разным адресам? Позвольте мне объяснить на примере:

 #include "group_message_manager.h"
#include <linux/kernel.h>

int open_value = 0;

int gmm_open(struct inode *inode, struct file *filp){
    printk(KERN_ALERT "open value %dn", open_value  );
    return 0;
}

ssize_t gmm_read(struct file * file, char * buffer, size_t lenght, loff_t * offset){
    return 0;
}

ssize_t gmm_write(struct file * file, const char __user * buffer, size_t lenght, loff_t * offset ){
    return 0;
}

struct file_operations file_ops_gmm_origin = {
    open: gmm_open,
    read: gmm_read,
    write: gmm_write,
    // unlocked_ioctl: mydev_ioctl,
    // compat_ioctl: mydev_ioctl,
    // release: mydev_release
};
// EXPORT_SYMBOL(file_ops_gmm_origin);  
  

ВЫШЕ .c ФАЙЛ, .h файл СЛЕДУЮЩИЙ

 #pragma once
#include <linux/fs.h>


int gmm_open(struct inode *inode, struct file *filp);

ssize_t gmm_read(struct file * file, char * buffer, size_t lenght, loff_t * offset);

ssize_t gmm_write(struct file * file, const char __user * buffer, size_t lenght, loff_t * offset );

extern struct file_operations file_ops_gmm_origin; 
  

Как мне сделать для любого драйвера собственную open_value переменную, начинающуюся с 0? Потому что в этот момент, если кто-то открывает файл, а затем открывает другой, переменной присваивается значение 2, в то время как я хочу, чтобы двум переменным было присвоено значение 1.

Обновить:

Ваш ответ полезен, но мне нужен механизм, позволяющий при каждом open() вызове находить одно и то же private_data , поэтому данные конкретного символьного файла, не относящиеся к одному вызову open() . Как я могу это сделать? Заранее благодарю

Комментарии:

1. В ядре есть много примеров того, как передать личную дату обратному вызову в файловых операциях.

Ответ №1:

В конце я решил, используя структуру данных хеш-таблицы, где ключ — это идентификатор индекса, а значение — указатель на структуру, содержащую значение, которым мне нужно управлять