Linux设备驱动程序PPT文件格式下载.ppt
- 文档编号:14314617
- 上传时间:2022-10-22
- 格式:PPT
- 页数:57
- 大小:184.50KB
Linux设备驱动程序PPT文件格式下载.ppt
《Linux设备驱动程序PPT文件格式下载.ppt》由会员分享,可在线阅读,更多相关《Linux设备驱动程序PPT文件格式下载.ppt(57页珍藏版)》请在冰豆网上搜索。
,网络设备,与块设备和字符设备不同,网络设备面向的上一层是网络协议层。
设备文件是一个唯一的名字(如eth0),在文件系统中不存在对应的节点项。
内核和网络驱动程序之间的通信使用的是一套和数据包传输相关的函数,而不是read,write等。
设备号,每一个设备都有一对主设备号、次设备号的参数作为唯一的标识。
主设备号标识设备对应的驱动程序;
次设备号用来区分具体驱动程序的实例。
主设备号的获取可以通过动态分配或指定的方式。
在嵌入式系统中外设较少,一般采用指定的方式。
与设备号相关的宏,#includekdev_tdev;
unsignedintma,mi;
MAJOR(dev)获取设备dev的主设备号MINOR(dev)获取设备dev的次设备号MKDEV(ma,mi)根据主设备号ma和次设备号mi得到相应的设备dev,添加和注销设备,以字符型设备为例添加设备externintregister_chrdev(unsignedintmajor,constchar*name,structfile_operations*fops);
添加和注销设备,注销设备externintunregister_chrdev(unsignedintmajor,constchar*name);
返回,设备文件接口,在Linux系统中,对用户程序而言,设备驱动程序隐藏了设备的具体细节,对不同的设备提供一致的接口;
一般就是把设备映射成一个特殊的设备文件,用户程序像对普通文件一样对设备文件进行操作;
在系统内部,设备的存取通过一组固定的入口点来进行,这组入口点由每个设备的设备驱动程序提供。
用户访问接口,字符设备驱动程序能够提供的入口点主要有:
openintopen(char*filename,intaccess);
closeintclose(inthandle);
readintread(inthandle,void*buf,intcount);
writeintwrite(inthandle,void*buf,intcount);
ioctlintioctl(intfd,intcmd,);
file结构,structfile是一个内核结构,不会出现在用户程序中。
它代表一个打开的文件,由内核在open时创建,并传递给在该文件上进行操作的所有函数,直至最后的close函数。
Structfile中重要的字段罗列如下:
Mode_tf_modet文件模式通过FMODE_READ和FMODE_WRITE位来标识文件是否可读或可写。
Loff_tf_ops当前读/写位置。
该位只读,不能直接进行操作。
Unsignedshortf_flags文件标志,如O_RDONLY、O_NONBLOCK和O_SYNC。
structinode*f_inode打开文件所对应的I节点structfile_operations*f_op与文件对应的操作void*private_data系统调用open函数前可将这个指针置为NULL。
驱动程序可以将这个字段用于任何目的或者简单忽略这个字段。
file_operations结构,设备驱动程序通过structfile_operations结构向系统说明自身提供的入口点。
structfile_operations是一组具体操作的集合,包括打开设备、读取设备等。
file_operations结构原型,structfile_operationsloff_t(*llseek)(structfile*,loff_t,int);
ssize_t(*read)(structfile*,char*,size_t,loff_t*);
ssize_t(*write)(structfile*,constchar*,size_t,loff_t*);
int(*readdir)(structfile*,void*,filldir_t);
unsignedint(*poll)(structfile*,structpoll_table_struct*);
int(*ioctl)(structinode*,structfile*,unsignedint,unsignedlong);
int(*mmap)(structfile*,structvm_area_struct*);
int(*open)(structinode*,structfile*);
int(*flush)(structfile*);
int(*release)(structinode*,structfile*);
int(*fsync)(structinode*,structdentry*,int);
int(*fasync)(int,structfile*,int);
int(*lock)(structfile*,int,structfile_lock*);
ssize_t(*readv)(structfile*,conststructiovec*,unsignedlong,loff_t*);
ssize_t(*writev)(structfile*,conststructiovec*,unsignedlong,loff_t*);
structmodule*owner;
打开与释放设备,int(*open)(structinode*,structfile*)如果不声明这个操作,系统默认打开永远成功,但不会通知驱动程序。
int(*release)(structinode*,structfile*)file结构被释放时会执行这个操作。
注意,并不是进程每次调用close都会执行release,只要file结构被共享,release就会等到所有的副本都关闭之后才会得到调用。
读写设备,ssize_t(*read)(structfile*,char*,size_t,loff_t*);
返回值非负代表成功读取或写入的字节数返回值负值代表着发生了错误。
具体数值指明了发生何种错误,并在中定义其类型,ioctl,int(*ioctl)(structinode*,structfile*,unsignedint,unsignedlong)系统调用ioctl提供一种调用设备特殊命令的操作,它允许应用程序对被驱动硬件的特殊功能进行操作配置设备以及进入或退出操作模式。
而这些控制操作,一般情况下无法通过read/write调用来实现。
poll,unsignedint(*poll)(structfile*,poll_table*);
非阻塞型I/O的系统调用poll和select的后端实现。
这两个系统调用可用来查询设备是否可读或可写,或是否处于某种特殊状态。
如果驱动程序没有定义poll方法,它所驱动的设备就被默认为既可读又可写,且不处于其他的特殊状态。
返回值是一个描述设备状态的位掩码。
owner,structmodule*owner指向“拥有”该结构的模块的指针,内核使用该指针维护模块的使用计数。
常见的初始化owner成员(2.4内核以上有效)owner:
THIS_MODULE使用宏的初始化方法SET_MODULE_OWNER(,其他操作,llseek修改文件的当前读写位置mmap将设备内存映射到进程地址空间flush在进程关闭设备文件描述符副本的时候,执行设备上尚未完成的操作lock实现文件锁定fsyncfsync系统调用的后台实现,用户调用它来刷新待处理的数据fasync通知设备,它的FASYNC标志发生变化,file_operations结构初始化,file_operations结构初始化方法2.2内核中staticstructfile_operationsts_fops=NULL,/*lseek*/ts_read,/*read*/NULL,/*write*/NULL,/*readdir*/ts_select,/*select*/ts_open,/*open*/ts_release,/*release(close)*/NULL,/*fsync*/ts_fasync/*asyncnotification*/;
2.4内核提供了一种标记化的结构初始化方法staticstructfile_operationsts_fops=owner:
THIS_MODULE,read:
ts_read,poll:
ts_poll,ioctl:
ts_ioctl,open:
ts_open,release:
ts_release,fasync:
ts_fasync,;
优点:
使驱动程序在结构的定义发生变化时更具有可移植性,并且使得代码更加紧凑。
它允许对结构成员进行重新排列,在某些场合下,将频繁被访问的成员放在相同的硬件缓存行上,将大大提高性能。
I/O操作,阻塞性操作:
如果进程调用read,但还没有数据,进程必须阻塞。
当数据到达时,进程被唤醒,并将数据返回给调用者。
如果进程调用write,缓冲区又没有空区,进程也必须阻塞。
当数据写出设备后,输出缓冲区中空出部分空间,唤醒进程,write调用即成功完成。
非阻塞性操作:
立即返回。
如果进程在没有数据就绪时调用了read,或者在缓冲区没有空间时调用了write,系统简单返回-EAGAIN。
阻塞型I/O,等待队列:
wait_queue_head_t进入睡眠状态:
interruptible_sleep_on(wait_queue_head_t*queue);
sleep_on(wait_queue_head_t*queue);
唤醒进程:
wake_up_interruptible(wait_queue_head_t*queue);
wake_up(wait_queue_head_t*queue);
两种方式的区别:
sleep_on不能被信号取消,适用于不可中断进程interruptible_sleep_on适用于可中断进程(在驱动程序中使用),非阻塞性I/O,poll和select允许进程决定是否可以对一个或多个打开的文件作非阻塞读或写。
select由BSDUNIX实现,poll由SystemV实现poll提供比select更精确的控制,异步触发,打开异步触发的两个步骤:
使用fcntl系统调用执行F_SETOWN命令,修改file-f_owner为进程ID,让内核知道该通知谁。
使用fcntl系统调用执行F_SETFL命令,设置FASYNC标志,驱动程序的fasync方法被调用。
当数据到达时,发送一个SIGIO信号给所有注册为异
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux 设备 驱动程序