一、结构体

1. cdev 结构体

 struct cdev {
   struct kobject kobj; /* 内嵌的 kobject 对象 */
   struct module *owner; /*所属模块*/
   struct file_operations *ops; /*文件操作结构体*/
   struct list_head list;
   dev_t dev; /*设备号*/
   unsigned int count;
 8 };

2. file_operations 结构体

 struct file_operations {
   struct module *owner;
   /* 拥有该结构的模块的指针,一般为 THIS_MODULES */
   loff_t(*llseek)(struct file *, loff_t, int);
   /* 用来修改文件当前的读写位置 */
   ssize_t(*read)(struct file *, char _ _user *, size_t, loff_t*);
   /* 从设备中同步读取数据 */
   ssize_t(*write)(struct file *, const char _ _user *, size_t, loff_t*);
   /* 向设备发送数据*/
   ssize_t(*aio_read)(struct kiocb *, 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);
   /* 仅用于读取目录,对于设备文件,该字段为 NULL */
   unsigned int(*poll)(struct file *, struct poll_table_struct*);
   /* 轮询函数,判断目前是否可以进行非阻塞的读取或写入*/
   int(*ioctl)(struct inode *, struct file *, unsigned int, unsigned long);
   /* 执行设备 I/O 控制命令*/
   long(*unlocked_ioctl)(struct file *, unsigned int, unsigned long);
   /* 不使用 BLK 的文件系统,将使用此种函数指针代替 ioctl */
   long(*compat_ioctl)(struct file *, unsigned int, unsigned long);
   /* 在 64 位系统上,32 位的 ioctl 调用,将使用此函数指针代替*/
   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(*aio_fsync)(struct kiocb *, int datasync);
   /* 异步 fsync */
   int(*fasync)(int, struct file *, int);
   /* 通知设备 FASYNC 标志发生变化*/
   int(*lock)(struct file *, int, struct file_lock*);
   ssize_t(*sendpage)(struct file *, struct page *, int, size_t, loff_t *, int);
   /* 通常为 NULL */
   unsigned long(*get_unmapped_area)(struct file *,unsigned long, unsigned long, unsigned long, unsigned long);
   /* 在当前进程地址空间找到一个未映射的内存段 */
   int(*check_flags)(int);
   /* 允许模块检查传递给 fcntl(F_SETEL...)调用的标志 */
   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);
   /* 由 VFS 调用,将管道数据粘接到文件 */
   ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int);
   /* 由 VFS 调用,将文件数据粘接到管道 */
   int (*setlease)(struct file *, long, struct file_lock **);
 };

04 Linux字符设备驱动的更多相关文章

  1. 深入理解Linux字符设备驱动

    文章从上层应用访问字符设备驱动开始,一步步地深入分析Linux字符设备的软件层次.组成框架和交互.如何编写驱动.设备文件的创建和mdev原理,对Linux字符设备驱动有全面的讲解.本文整合之前发表的& ...

  2. Linux字符设备驱动结构(一)--cdev结构体、设备号相关知识机械【转】

    本文转载自:http://blog.csdn.net/zqixiao_09/article/details/50839042 一.字符设备基础知识 1.设备驱动分类 linux系统将设备分为3类:字符 ...

  3. Smart210学习记录----beep linux字符设备驱动

    今天搞定了beep linux字符设备驱动,心里还是很开心的,哈哈...但在完成的过程中却遇到了一个非常棘手的问题,花费了我大量的时间,,,, 还是把问题描述一下吧,好像这个问题很普遍的,网上许多解决 ...

  4. Linux字符设备驱动实现

    Linux字符设备驱动实现 要求 编写一个字符设备驱动,并利用对字符设备的同步操作,设计实现一个聊天程序.可以有一个读,一个写进程共享该字符设备,进行聊天:也可以由多个读和多个写进程共享该字符设备,进 ...

  5. Linux字符设备驱动基本结构

    1.Linux字符设备驱动的基本结构 Linux系统下具有三种设备,分别是字符设备.块设备和网络设备,Linux下的字符设备是指只能一个字节一个字节读写的设备,不能随机读取设备内存中某一数据,读取数据 ...

  6. (57)Linux驱动开发之三Linux字符设备驱动

    1.一般情况下,对每一种设备驱动都会定义一个软件模块,这个工程模块包含.h和.c文件,前者定义该设备驱动的数据结构并声明外部函数,后者进行设备驱动的具体实现. 2.典型的无操作系统下的逻辑开发程序是: ...

  7. Linux字符设备驱动框架

    字符设备是Linux三大设备之一(另外两种是块设备,网络设备),字符设备就是字节流形式通讯的I/O设备,绝大部分设备都是字符设备,常见的字符设备包括鼠标.键盘.显示器.串口等等,当我们执行ls -l ...

  8. Linux 字符设备驱动模型

    一.使用字符设备驱动程序 1. 编译/安装驱动 在Linux系统中,驱动程序通常采用内核模块的程序结构来进行编码.因此,编译/安装一个驱动程序,其实质就是编译/安装一个内核模块 2. 创建设备文件 通 ...

  9. linux字符设备驱动学习笔记(一):简单的字符设备驱动

    最近在鼓捣lnux字符设备驱动,在网上搜集的各种关于linux设备驱动的代码和注释,要么是针对2.4的,要么是错误百出,根本就不能运行成功,真希望大家在发博客的时候能认真核对下代码的正确性,特别是要把 ...

随机推荐

  1. NPOI 格式设置2—时间,千分位,繁体,小数位

    在Excel中我们经常要设置格式,比如说日期格式(yyyymmdd).小数点格式(1.20).货币格式($2000).百分比格式(99.99%)等等,这些东西在过去我们恐怕只能在服务器端生成好,不但增 ...

  2. 麦克斯韦方程组 (Maxwell's equation)的简单解释

    [转载请注明出处]http://www.cnblogs.com/mashiqi 2016/12/12 以下会用高中的物理知识和大学微积分的数学知识对麦克斯韦方程组进行一个简单的解释.希望大家都能看得懂 ...

  3. BP神经网络

    秋招刚结束,这俩月没事就学习下斯坦福大学公开课,想学习一下深度学习(这年头不会DL,都不敢说自己懂机器学习),目前学到了神经网络部分,学习起来有点吃力,把之前学的BP(back-progagation ...

  4. Matlab 2013b 在El Capitan 中无法使用问题解决

    更新了mac的操作系统到El capitan, 结果发现Matlab打不开了,每次都弹出一个Java error的窗口.现实如下内容 java.lang.NullPointerException at ...

  5. 连接linux数据库Oracle时报错ORA-12541: TNS: 无监听程序

    远程服务器的数据库服务未开启,以及监听未打开 连接oracle 启动服务,startup 切换到oracle /bin 目录,cd $ORACLE_HOME/bin 启动监听, lsnrctl sta ...

  6. 【WEB前端】使用百度ECharts,绘制项目质量报表

    一.下载ECharts的js库 下载地址:http://echarts.baidu.com/download.html 由于我们对体积无要求,所以我们采用了完整版本,功能齐全,在项目中,我们只需要像普 ...

  7. xloader

    [1],先看一下整个系统的结构(软件是灵魂,硬件是驱体,再强大的灵魂力若没有躯体终将是游魂野鬼,再强壮的驱体若没有灵魂终将是植物人) 结构 作用 备注 硬件 一切软件的载体   xloader 引导u ...

  8. 酷炫ILOVEU

    assume cs:code code segment main: ;显示背景22*80 ;dh中放行号 ;dl中放列号 bibi: push cx ;显示光标 ;第0页 int 10h ;在光标处显 ...

  9. it市场

    SAP收购Sybase意欲何为 http://tech.diannaodian.com/dw/data/sybase/2012/0925/199681.html 德国行业管理软件解决方案提供商SAP宣 ...

  10. Javascript定义类(class)的三种方法

    将近20年前,Javascript诞生的时候,只是一种简单的网页脚本语言.如果你忘了填写用户名,它就跳出一个警告. 如今,它变得几乎无所不能,从前端到后端,有着各种匪夷所思的用途.程序员用它完成越来越 ...