Linux字符设备驱动程序培训教材课件(PPT42页)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Linux字符设备驱动程序
Linux驱动程序的分类
字符设备驱动:用于驱动能够像字节流(文件)一样被访问 的设备。应用程序通常可以利用open、close、read、write 等系统调用访问字符设备驱动。
块设备驱动:块设备和字符设备只在系统内核内部的管理上 有所区别。应用程序对于字符设备的每一个I/O操作都会被 内核直接传递给对应的驱动程序;而应用程序对于块设备的 操作要经过虚拟文件系统(VFS)和缓冲区管理系统间接地 传递给驱动程序处理。
Linux字符设备驱动程序培训教材(PPT 42页) 工作培 训教材 工作汇 报课件 管理培 训课件 安全培 训讲义P PT服务 技术
Linux字符设备驱动程序培训教材(PPT 42页) 工作培 训教材 工作汇 报课件 管理培 训课件 安全培 训讲义P PT服务 技术
主设备号与次设备号
释放设备号
void unregister_chrdev_region(dev_t first, unsigned int count);
struct list_head list; dev_t dev;
/*设备号*/
unsigned int count;
};
cdev的kobj、 list 、 count字段不用我们关系和维护(内核代 劳),我们只需将其ops字段指向为我们自己的file operations 结构。
Linux字符设备驱动程序培训教材(PPT 42页) 工作培 训教材 工作汇 报课件 管理培 训课件 安全培 训讲义P PT服务 技术
网络设备驱动:应用程序必须利用套接字(socket)接口访问 网络设备。
网络设备驱动程序
字符设备驱动程序基本结构
字符设备开发的基本步骤
确定主设备号和次设备号 实现字符驱动程序
实现file_operations结构体 构造字符设备结构体cdev 在模块加载函数中注册字符设备 在模块卸载函数中注销字符设备
所请求的连续设 备编号的个数
和该编号范围关 联的设备名称
Linux字符设备驱动程序培训教材(PPT 42页) 工作培 训教材 工作汇 报课件 管理培 训课件 安全培 训讲义P PT服务 技术
Linux字符设备驱动程序培训教材(PPT 42页) 工作培 训教材 工作汇 报课件 管理培 训课件 安全培 训讲义P PT服务 技术
通常在模块的清 除函数中调用。
Linux字符设备驱动程序培训教材(PPT 42页) 工作培 训教材 工作汇 报课件 管理培 训课件 安全培 训讲义P PT服务 技术
Linux字符设备驱动程序培训教材(PPT 42页) 工作培 训教材 工作汇 报课件 管理培 训课件 安全培 训讲义P PT服务 技术
将主设备号和次设备号转换成dev_t类型: MKDEV(int major,int minor);
Linux字符设备驱动程序培训教材(PPT 42页) 工作培 训教材 工作汇 报课件 管理培 训课件 安全培 训讲义P PT服务 技术
Linux字符设备驱动程序培训教材(PPT 42页) 工作培 训教材 工作汇 报课件 管理培 训课件 安全培 训讲义P PT服务 技术
应用程序如何访问设备
fd1 = open(“/dev/ttyS1”, O_RDWR); // 阻塞 fd2 = open(“/dev/ttyS1”, O_RDWR | O_NONBLOCK); // 非阻塞 int read(int fd, const void *buf, size_t length); int write(int fd, const void *buf, size_t length); int lseek(int fd, offset_t offset, int whence); int ioctl( int fd, int cmd, void *arg); int close(int fd);
记录字符设备的结构体cdev
实现字符驱动程序
cdev 结构体
struct cdev
{
struct kobject kobj;
/* 内嵌的kobject 对象 */
struct module *owner; /*所属模块*/
struct file_operations *ops; /*文件操作结构体*/
主设备号与次设备号
Байду номын сангаас
分配主设备号
手工分配主设备号:找一个内核没有使用的主设备号来使用。
#include <linux/fs.h> int register_chrdev_region( dev_t first, unsigned int count, char *name );
要分配的设备编 号范围的起始值, 次设备号经常为0
Linux字符设备驱动程序培训教材(PPT 42页) 工作培 训教材 工作汇 报课件 管理培 训课件 安全培 训讲义P PT服务 技术
设备号的内部表达
设备编号的内部表达
dev_t类型(32位): 用来保存设备编号(包括主设备号(12位)和次设备 号(20位))
从dev_t获得主设备号和次设备号: MAJOR(dev_t); MINOR(dev_t);
主设备号与次设备号
动态分配主设备号:
输出的设备号 #include <linux/fs.h> int alloc_chrdev_resion(dev_t *dev,unsigned int firstminor,
unsigned int count,char *name); 要使用的被请求的 第一个次设备号
创建设备文件节点
设备文件与设备号
为了体现“一切都是文件”的设计思想,linux将每个已安装 的设备都表示为一个设备文件。
设备文件通常位于/dev子目录。 对于字符设备,应用程序可以利用open、close、read、
write等系统调用访问其设备文件,这些I/O操作都被直接传递 给该设备文件所对应的设备。 每个设备文件中都存储了该设备的“主设备号”和“次设备 号”。 一般由同一个内核模块管理的多个设备占用同一个主设备号, 具体设备用次设备号标识。 用mknod filename c major minor命令创建设备文件 用rm filename命令删除设备文件。注意删除设备文件并不会 影响驱动模块。
Linux驱动程序的分类
字符设备驱动:用于驱动能够像字节流(文件)一样被访问 的设备。应用程序通常可以利用open、close、read、write 等系统调用访问字符设备驱动。
块设备驱动:块设备和字符设备只在系统内核内部的管理上 有所区别。应用程序对于字符设备的每一个I/O操作都会被 内核直接传递给对应的驱动程序;而应用程序对于块设备的 操作要经过虚拟文件系统(VFS)和缓冲区管理系统间接地 传递给驱动程序处理。
Linux字符设备驱动程序培训教材(PPT 42页) 工作培 训教材 工作汇 报课件 管理培 训课件 安全培 训讲义P PT服务 技术
Linux字符设备驱动程序培训教材(PPT 42页) 工作培 训教材 工作汇 报课件 管理培 训课件 安全培 训讲义P PT服务 技术
主设备号与次设备号
释放设备号
void unregister_chrdev_region(dev_t first, unsigned int count);
struct list_head list; dev_t dev;
/*设备号*/
unsigned int count;
};
cdev的kobj、 list 、 count字段不用我们关系和维护(内核代 劳),我们只需将其ops字段指向为我们自己的file operations 结构。
Linux字符设备驱动程序培训教材(PPT 42页) 工作培 训教材 工作汇 报课件 管理培 训课件 安全培 训讲义P PT服务 技术
网络设备驱动:应用程序必须利用套接字(socket)接口访问 网络设备。
网络设备驱动程序
字符设备驱动程序基本结构
字符设备开发的基本步骤
确定主设备号和次设备号 实现字符驱动程序
实现file_operations结构体 构造字符设备结构体cdev 在模块加载函数中注册字符设备 在模块卸载函数中注销字符设备
所请求的连续设 备编号的个数
和该编号范围关 联的设备名称
Linux字符设备驱动程序培训教材(PPT 42页) 工作培 训教材 工作汇 报课件 管理培 训课件 安全培 训讲义P PT服务 技术
Linux字符设备驱动程序培训教材(PPT 42页) 工作培 训教材 工作汇 报课件 管理培 训课件 安全培 训讲义P PT服务 技术
通常在模块的清 除函数中调用。
Linux字符设备驱动程序培训教材(PPT 42页) 工作培 训教材 工作汇 报课件 管理培 训课件 安全培 训讲义P PT服务 技术
Linux字符设备驱动程序培训教材(PPT 42页) 工作培 训教材 工作汇 报课件 管理培 训课件 安全培 训讲义P PT服务 技术
将主设备号和次设备号转换成dev_t类型: MKDEV(int major,int minor);
Linux字符设备驱动程序培训教材(PPT 42页) 工作培 训教材 工作汇 报课件 管理培 训课件 安全培 训讲义P PT服务 技术
Linux字符设备驱动程序培训教材(PPT 42页) 工作培 训教材 工作汇 报课件 管理培 训课件 安全培 训讲义P PT服务 技术
应用程序如何访问设备
fd1 = open(“/dev/ttyS1”, O_RDWR); // 阻塞 fd2 = open(“/dev/ttyS1”, O_RDWR | O_NONBLOCK); // 非阻塞 int read(int fd, const void *buf, size_t length); int write(int fd, const void *buf, size_t length); int lseek(int fd, offset_t offset, int whence); int ioctl( int fd, int cmd, void *arg); int close(int fd);
记录字符设备的结构体cdev
实现字符驱动程序
cdev 结构体
struct cdev
{
struct kobject kobj;
/* 内嵌的kobject 对象 */
struct module *owner; /*所属模块*/
struct file_operations *ops; /*文件操作结构体*/
主设备号与次设备号
Байду номын сангаас
分配主设备号
手工分配主设备号:找一个内核没有使用的主设备号来使用。
#include <linux/fs.h> int register_chrdev_region( dev_t first, unsigned int count, char *name );
要分配的设备编 号范围的起始值, 次设备号经常为0
Linux字符设备驱动程序培训教材(PPT 42页) 工作培 训教材 工作汇 报课件 管理培 训课件 安全培 训讲义P PT服务 技术
设备号的内部表达
设备编号的内部表达
dev_t类型(32位): 用来保存设备编号(包括主设备号(12位)和次设备 号(20位))
从dev_t获得主设备号和次设备号: MAJOR(dev_t); MINOR(dev_t);
主设备号与次设备号
动态分配主设备号:
输出的设备号 #include <linux/fs.h> int alloc_chrdev_resion(dev_t *dev,unsigned int firstminor,
unsigned int count,char *name); 要使用的被请求的 第一个次设备号
创建设备文件节点
设备文件与设备号
为了体现“一切都是文件”的设计思想,linux将每个已安装 的设备都表示为一个设备文件。
设备文件通常位于/dev子目录。 对于字符设备,应用程序可以利用open、close、read、
write等系统调用访问其设备文件,这些I/O操作都被直接传递 给该设备文件所对应的设备。 每个设备文件中都存储了该设备的“主设备号”和“次设备 号”。 一般由同一个内核模块管理的多个设备占用同一个主设备号, 具体设备用次设备号标识。 用mknod filename c major minor命令创建设备文件 用rm filename命令删除设备文件。注意删除设备文件并不会 影响驱动模块。