我正在尝试使用 proc
文件系统将数据从 linux 内核模块函数写入用户空间。我想使用 seq_file
迭代实现,以便它处理页面大小和所有有用的东西。我有一个函数,它不断地记录数据并创建一个结构并用数据填充该结构。我想将这些结构泵送到 proc
文件系统,以便用户空间中的应用程序可以获取这些结构并适本地处理它们。当用户空间准备好接收数据时,它将从 proc 文件系统读取数据,这将启动所有这些。我在想我不能将结构传递给 seq_file show
函数。那么我可以全局声明结构并将其从 seq_show
函数打印到 /proc/info
文件吗?下面是我目前正在尝试实现的。
typedef struct data_t{
unint32_t address;
unint8_t pid;
unint8_t info;
} data_t;
data_t data = NULL;
static void datalog(uint32_t addy, unint8_t info){
// this function is constantly logging data
data->address = addy;
data->info = info;
}
static void *seq_start(struct seq_file *s, loff_t *pos)
{
// seq file start stuff
}
static int seq_show(struct seq_file *s, void *v)
{
//print the data struct to the /proc/info file
return 0;
}
static void *seq_next(struct seq_file *s, void *v, loff_t *pos)
{
// move the pointer along
return v;
}
static void seq_stop(struct seq_file *s, void *v)
{
}
static struct seq_operations seq_ops = {
.start = seq_start,
.next = seq_next,
.stop = seq_stop,
.show = seq_show
};
static int open(struct inode *inode, struct file *file)
{
return seq_open(file, &seq_ops);
};
static struct file_operations fops = {
.owner = THIS_MODULE,
.open = open,
.read = seq_read,
.llseek = seq_lseek,
.release = seq_release
};
static int init(void)
{
struct proc_dir_entry *entry = NULL;
entry = proc_create("info", 0777, NULL, &fops);
data = (data_t *) kmalloc(sizeof(data_t), GFP_KERNEL);
return 0;
}
所以datalog
函数已经在一个常量循环中了。我想将所有这些结构抽取到 /proc/info
文件中,以便它们可以在用户空间中得到适当的处理。这将是速射数据,因此感觉 copy_to_user
不是可行的方法。如您所见,我不确定自己在做什么,因此非常感谢任何指导或帮助!谢谢!
最佳答案
假设您正在维护一个 struct data
数组,并且 count 是此类结构的编号。以下函数应该可以帮助您从用户空间读取结构。下面的代码假定日志缓冲区或数组在您读取时没有被修改(这是一个简单的例子)。您可以修改以下内容以满足您的需要。确保同步您的数据结构,例如日志缓冲区,以确保您读取的内容与当前的内容一致。
是的!您可以使用全局声明结构并在 seq_show 中使用它。
static void *seq_start(struct seq_file *s, loff_t *pos)
{
if (*pos > count)
return NULL;
return pos;
}
static int seq_show(struct seq_file *s, void *v)
{
loff_t *pos = (loff_t *)v;
if (*pos == 0) {
seq_printk(s, "Address\t\t\tPID\tInfo\n");
}
seq_printk(s, "0x%p\t%u\t%u\n", drv_data[*pos].address, drv_data[*pos].pid,
drv_data[*pos].info);
return 0;
}
static void *seq_next(struct seq_file *s, void *v, loff_t *pos)
{
(*pos)++;
if (*pos >= count)
return NULL;
return pos;
}
关于c - 使用 proc 文件系统将信息从 LKM 写入用户空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25130028/