Linux 内核中的字符设备问题

Problem with character device in Linux kernel

我的内核模块有问题,我正在编写一个允许来自不同进程的线程交换消息的模块,我正在生成不同的 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 %d\n", 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() 个。 我该怎么做? 提前谢谢你

最后我通过使用散列 table 数据结构解决了这个问题,其中键是 inode 标识符,值是指向包含我需要管理的值的结构的指针