file_operation结构题里面_user追踪

刚学习写驱动,以前有看过一些内核的东西,只记得些大概的工作机制,细节东西一点不记得了。

今天仔细了解了下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);

};

 

发帖后,得到以下回复:

回复一

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)是设备空间

 

看来学驱动还是得要去翻内核代码的啊~~~


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值