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

 

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


——————
无论在哪里做什么,只要坚持服务、创新、创造价值,其他的东西自然都会来的。
原文地址:https://www.cnblogs.com/pied/p/1782339.html