我在设备驱动程序中编写了一个用户定义的函数,我想从用户空间应用程序中调用它。我如何实现这一目标?
用户定义函数的意思是,除了内核定义的函数之外的任何函数。指针在struct file_operations
中定义,如下所示。
struct file_operations {
struct module *owner;
loff_t (*llseek) (struct file *, loff_t, int);
ssize_t (*read) (struct file *, char *, size_t, loff_t *);
ssize_t (*write) (struct file *, const char *, size_t, loff_t *);
int (*readdir) (struct file *, void *, filldir_t);
unsigned int (*poll) (struct file *, struct poll_table_struct *);
int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);
int (*mmap) (struct file *, struct vm_area_struct *);
int (*open) (struct inode *, struct file *);
int (*flush) (struct file *);
int (*release) (struct inode *, struct file *);
int (*fsync) (struct file *, struct dentry *, int datasync);
int (*fasync) (int, struct file *, int);
int (*lock) (struct file *, int, struct file_lock *);
ssize_t (*readv) (struct file *, const struct iovec *, unsigned long,
loff_t *);
ssize_t (*writev) (struct file *, const struct iovec *, unsigned long,
loff_t *);
};
例如。在我的驱动程序中,我有以下内容,
struct file_operations fops = {
.read = my_read,
.write = my_write,
};
我可以使用调用read
和write
从用户空间应用程序调用这些函数。
我在内核源代码中也有一个名为user_defined
的函数,我的问题是如何从用户空间程序中调用它?
答案 0 :(得分:4)
那么,你在那里所拥有的通常被称为"系统调用"。我建议你阅读内核开发者文档,了解如何公开新的系统调用。在用户空间方面,libc为您提供了一个函数系统调用,您可以使用它来调用内核空间。但通常你会在它周围写一个包装。
但是应该避免引入新的系统调用。调用内核空间的首选方法是使用sysfs并将用户空间可调用函数作为文件公开。
答案 1 :(得分:0)