我正在尝试在从用户空间写入proc文件时实现回调函数。我正在使用file_ops来指定回调。
struct msg_t {
u32 length;
u8 type;
u16 cmd;
char[20] name;
int number;
} msg_t
userspace.cpp
msg_t msg = {0};
// populate msg struct accordingly
fwrite(&msg, sizeof(msg), 1, stream);
fflush();
LKM.c
static ssize_t write_proc( struct file *filp, const char __user *buff, size_t len, loff_t *data){
msg_t *msg = NULL;
printk(KERN_ALERT "len: %zd\n", len);
msg = (msg_t *) kmalloc(sizeof(msg_t), GFP_KERNEL);
memset(msg, 0, sizeof(msg_t));
copy_from_user( msg, buff, sizeof(msg_t));
switch (msg->cmd)
{
//switch stuff
}
kfree(msg);
return len;
}
static const struct file_operations fops = {
.owner = THIS_MODULE,
.write = write_proc,
};
static int __init o_init(void){
struct proc_dir_entry *proc_dir = proc_mkdir("app", NULL);
struct proc_dir_entry *proc_entry = proc_create("file", 0777, proc_dir, &fops);
}
所以上面的实现与proc文件系统回调的较早实现一起工作,即create_proc_read_entry
。当我将msg
结构从用户空间写入/proc/app/file
时,似乎有一个循环而len
等于20然后它倒计时直到0然后它从大小开始msg
struct然后递减几次然后停止。
len: 20
len: 19
len: 18
.
.
len: sizeof(msg)
.
.
我很难掌握新的proc文件实现(使用file_ops),所以任何帮助都表示赞赏。谢谢!