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 标识符,值是指向包含我需要管理的值的结构的指针
我的内核模块有问题,我正在编写一个允许来自不同进程的线程交换消息的模块,我正在生成不同的 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 标识符,值是指向包含我需要管理的值的结构的指针