刚学习写驱动,以前有看过一些内核的东西,只记得些大概的工作机制,细节东西一点不记得了。
今天仔细了解了下file_operation数据结构,据说这个数据结构可以看做是一个驱动的核心框架,所以下了点功夫认真读了下。
在这个数据结构里发现一个不知道是什么东西,在csdn上发帖求助得到了下面一些回复。
不懂的是下面的定义里面的_user数据类型,前面加了一个下划线,很奇怪的东西,不知道这个参数怎么回事:
struct file_operations {
struct module * owner;
loff_t ( * llseek) (struct file * , loff_t, int);
ssize_t ( * read) (struct file * , char __user * , size_t, loff_t * );
ssize_t ( * aio_read) (struct kiocb * , char __user * , size_t, loff_t);
ssize_t ( * write) (struct file * , const char __user * , size_t, loff_t * );
ssize_t ( * aio_write) (struct kiocb * , const char __user * , 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);
long ( * unlocked_ioctl) (struct file * , unsigned int, unsigned long);
long ( * compat_ioctl) (struct file * , unsigned int, unsigned long);
int ( * mmap) (struct file * , struct vm_area_struct * );
int ( * open) (struct inode * , struct file * );
int ( * flush) (struct file * , fl_owner_t id);
int ( * release) (struct inode * , struct file * );
int ( * fsync) (struct file * , struct dentry * , int datasync);
int ( * aio_fsync) (struct kiocb * , 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 * );
ssize_t ( * sendfile) (struct file * , loff_t * , size_t, read_actor_t, void * );
ssize_t ( * sendpage) (struct file * , struct page * , int, size_t, loff_t * , int);
unsigned long ( * get_unmapped_area)(struct file * , unsigned long, unsigned long, unsigned long, unsigned long);
int ( * check_flags)(int);
int ( * dir_notify)(struct file * filp, unsigned long arg);
int ( * flock) (struct file * , int, struct file_lock * );
ssize_t ( * splice_write)(struct pipe_inode_info * , struct file * , loff_t * , size_t, unsigned int);
ssize_t ( * splice_read)(struct file * , loff_t * , struct pipe_inode_info * , size_t, unsigned int);
};
struct module * owner;
loff_t ( * llseek) (struct file * , loff_t, int);
ssize_t ( * read) (struct file * , char __user * , size_t, loff_t * );
ssize_t ( * aio_read) (struct kiocb * , char __user * , size_t, loff_t);
ssize_t ( * write) (struct file * , const char __user * , size_t, loff_t * );
ssize_t ( * aio_write) (struct kiocb * , const char __user * , 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);
long ( * unlocked_ioctl) (struct file * , unsigned int, unsigned long);
long ( * compat_ioctl) (struct file * , unsigned int, unsigned long);
int ( * mmap) (struct file * , struct vm_area_struct * );
int ( * open) (struct inode * , struct file * );
int ( * flush) (struct file * , fl_owner_t id);
int ( * release) (struct inode * , struct file * );
int ( * fsync) (struct file * , struct dentry * , int datasync);
int ( * aio_fsync) (struct kiocb * , 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 * );
ssize_t ( * sendfile) (struct file * , loff_t * , size_t, read_actor_t, void * );
ssize_t ( * sendpage) (struct file * , struct page * , int, size_t, loff_t * , int);
unsigned long ( * get_unmapped_area)(struct file * , unsigned long, unsigned long, unsigned long, unsigned long);
int ( * check_flags)(int);
int ( * dir_notify)(struct file * filp, unsigned long arg);
int ( * flock) (struct file * , int, struct file_lock * );
ssize_t ( * splice_write)(struct pipe_inode_info * , struct file * , loff_t * , size_t, unsigned int);
ssize_t ( * splice_read)(struct file * , loff_t * , struct pipe_inode_info * , size_t, unsigned int);
};
发帖后,得到以下回复:
回复一
read的原型如下:
ssize_t read(struct file *filp,char __user *buff,size_t count,loff_t *offp);
第二个参数是指向用户空间的缓冲区,是一个存放新读入数据的空缓冲区。
回复二
# define __user __attribute__((noderef, address_space(1)))
__user是用于check这个地址的合法性的,__user表示指向用户地址空间,小短线是使用习惯,没有特殊意义.
在内核中
address_space(0)是内核空间
address_space(1)是用户空间
address_space(2)是设备空间
看来学驱动还是得要去翻内核代码的啊~~~