2.字符设备框架

一、字符设备基础

字符设备:是指只能一个字节一个字节进行读写操作的设备,不能随机读取设备中的某一数据、读取数据要按照先后数据。字符设备是面向流的设备,常见的字符设备有鼠标、键盘、串口、控制台和LED等。

一般每个字符设备或者块设备都会在/dev目录(可以是任意目录,这样是为了统一)下对应一个设备文件。linux用户层程序通过设备文件来使用驱动程序操作字符设备或块设备。

二、字符设备驱动与用户空间访问该设备的程序三者之间的关系

字符设备是3大类设备(字符设备、块设备、网络设备)中较简单的一类设备、其驱动程序中完成的主要工作是初始化、添加和删除 struct cdev 结构体,申请和释放设备号,以及填充 struct file_operations 结构体中断的操作函数,实现 structfile_operations 结构体中的read()、write()和ioctl()等函数是驱动设计的主体工作。

如图,在Linux内核代码中:

  • 使用struct cdev结构体来抽象一个字符设备;

  • 通过一个dev_t类型的设备号(分为主(major)、次设备号(minor))一确定字符设备唯一性;

  • 通过struct file_operations类型的操作方法集来定义字符设备提供个VFS的接口

  • 2、字符设备、字符设备驱动与用户空间访问该设备的程序三者之间的关系

  •   如图,在Linux内核中:

  • a -- 使用cdev结构体来描述字符设备;

  • b -- 通过其成员dev_t来定义设备号(分为主、次设备号)以确定字符设备的唯一性;

  • c -- 通过其成员file_operations来定义字符设备驱动提供给VFS的接口函数,如常见的open()、read()、write()等;

  •      在Linux字符设备驱动中:

  • a -- 模块加载函数通过 register_chrdev_region( ) 或 alloc_chrdev_region( )来静态或者动态获取设备号;

  • b -- 通过 cdev_init( ) 建立cdev与 file_operations之间的连接,通过 cdev_add( ) 向系统添加一个cdev以完成注册;

  • c -- 模块卸载函数通过cdev_del( )来注销cdev,通过 unregister_chrdev_region( )来释放设备号;

  •      用户空间访问该设备的程序:

  • a -- 通过Linux系统调用,如open( )、read( )、write( ),来“调用”file_operations来定义字符设备驱动提供给VFS

  • 原文:https://blog.csdn.net/zqixiao_09/article/details/50839042

三、字符设备模型

四、程序设计框架和字符设备的几种方式

孩子在房间里面睡觉,妈妈在外面工作

1.妈妈时不时要开门看看是否孩子醒了,-----查询方式---太繁琐累

2.孩子睡觉,什么时候孩子会起床呢,妈妈去叫醒他,唤醒他,-------休眠唤醒

3.给定时间,妈妈每隔10分钟去看看孩子醒了没有------poll机制

4.儿子醒了,哭闹,相当于给妈妈发醒了的信号---------异步通知

5.第一到第四点写的代码都是自己或者公司内部才能看得懂的,为了让其他人也能看得懂,就必须融入到别人的代码,引入输入子系统,框架如下

猜你喜欢

转载自blog.csdn.net/weixin_40535588/article/details/89350675
今日推荐