04 Linux字符设备驱动
一、结构体
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字符设备驱动的更多相关文章
- 深入理解Linux字符设备驱动
文章从上层应用访问字符设备驱动开始,一步步地深入分析Linux字符设备的软件层次.组成框架和交互.如何编写驱动.设备文件的创建和mdev原理,对Linux字符设备驱动有全面的讲解.本文整合之前发表的& ...
- Linux字符设备驱动结构(一)--cdev结构体、设备号相关知识机械【转】
本文转载自:http://blog.csdn.net/zqixiao_09/article/details/50839042 一.字符设备基础知识 1.设备驱动分类 linux系统将设备分为3类:字符 ...
- Smart210学习记录----beep linux字符设备驱动
今天搞定了beep linux字符设备驱动,心里还是很开心的,哈哈...但在完成的过程中却遇到了一个非常棘手的问题,花费了我大量的时间,,,, 还是把问题描述一下吧,好像这个问题很普遍的,网上许多解决 ...
- Linux字符设备驱动实现
Linux字符设备驱动实现 要求 编写一个字符设备驱动,并利用对字符设备的同步操作,设计实现一个聊天程序.可以有一个读,一个写进程共享该字符设备,进行聊天:也可以由多个读和多个写进程共享该字符设备,进 ...
- Linux字符设备驱动基本结构
1.Linux字符设备驱动的基本结构 Linux系统下具有三种设备,分别是字符设备.块设备和网络设备,Linux下的字符设备是指只能一个字节一个字节读写的设备,不能随机读取设备内存中某一数据,读取数据 ...
- (57)Linux驱动开发之三Linux字符设备驱动
1.一般情况下,对每一种设备驱动都会定义一个软件模块,这个工程模块包含.h和.c文件,前者定义该设备驱动的数据结构并声明外部函数,后者进行设备驱动的具体实现. 2.典型的无操作系统下的逻辑开发程序是: ...
- Linux字符设备驱动框架
字符设备是Linux三大设备之一(另外两种是块设备,网络设备),字符设备就是字节流形式通讯的I/O设备,绝大部分设备都是字符设备,常见的字符设备包括鼠标.键盘.显示器.串口等等,当我们执行ls -l ...
- Linux 字符设备驱动模型
一.使用字符设备驱动程序 1. 编译/安装驱动 在Linux系统中,驱动程序通常采用内核模块的程序结构来进行编码.因此,编译/安装一个驱动程序,其实质就是编译/安装一个内核模块 2. 创建设备文件 通 ...
- linux字符设备驱动学习笔记(一):简单的字符设备驱动
最近在鼓捣lnux字符设备驱动,在网上搜集的各种关于linux设备驱动的代码和注释,要么是针对2.4的,要么是错误百出,根本就不能运行成功,真希望大家在发博客的时候能认真核对下代码的正确性,特别是要把 ...
随机推荐
- 第三个Sprint冲刺github 与最终 github
链接:https://github.com/22shaojiawen/the-third-sprint-project
- Linux的课程总结
Linux的课程总结 20125133 马国祥 通过16周的学习明白学好linux不是一件一蹴而就的事,一定要能坚持使用它,特别是在使用初期,由于在linux中,用户权限很大,做任何事情都很自由,所以 ...
- S2SH+mysql-软件开发实际部署问题-8个小时后提示MYSQL数据库无法连接
type Exception report message description The server encountered an internal error () that prevented ...
- 让dedecms autoindex,itemindex 从0到1开始的办法! 多重样式输出(借鉴)
原网址:http://my.oschina.net/lyx2012/blog/55888 [field:global name=autoindex runphp="yes"]@me ...
- 【海洋女神原创】知识普及:IS版本命名规则和高低关系
经常有朋友对IS的版本命名不甚了解,有时候在交流的时候就会造成误会,在这里做一下普及. IS最早出名的版本是IS6.22,这是个非常古老的版本的,但是在IS历史上有不可磨灭的贡献. 之后很长一段时间内 ...
- 2016年中国大学生程序设计竞赛(合肥)-重现赛1001 HDU 5961
传递 Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submiss ...
- Git分布式版本管理工具基本使用方法
一.Git简介 早先linux内核代码托管在BitKeeper,这个是商业的,但是免费给linux社区使用: linux社区有个人试图破解BitKeeper,被BitKeeper发现后不再免费提供使用 ...
- 关于a和b不用第三变量交换值的问题
今天在如鹏网(不是发广告)上看到一道题,题目很难就不说了,但是老师给的提示的题目却让我感兴趣,就是标题的内容. 题目是把a与b做异或比较从而实现不通过第三变量来交换a和b的数值答案是这样的: a=a^ ...
- Fiddler (HTTP抓包)简介
1.什么是Fiddler? Fiddler是位于客户端和服务器端的HTTP代理,也是目前最常用的http抓包工具之一.它能够记录客户端和服务器之间的所有HTTP请求,可以针对特定的HTTP请求,分析请 ...
- 【OpenGL】 第一篇 OpenGL概览
---------------------------------------------------------------------------------------------------- ...