zoukankan      html  css  js  c++  java
  • 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)是设备空间

     

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


    ——————
    无论在哪里做什么,只要坚持服务、创新、创造价值,其他的东西自然都会来的。
  • 相关阅读:
    使用matplotlib绘制常用图表(3)其他图表绘制
    python简单爬虫
    使用matplotlib绘制常用图表(2)常用图标设置
    一个GISer的使命
    SQL2008″Unable to read the list of previously registered servers on this system”
    Eclipse语言包安装
    eclipse查看JDK源码
    Eclipse中设置javadoc中文帮助文档
    GDI+处理图像时出现内存不足的问题
    利用github搭建私人maven仓库
  • 原文地址:https://www.cnblogs.com/pied/p/1782339.html
Copyright © 2011-2022 走看看