LINUX-内核驱动设计入门.ppt
《LINUX-内核驱动设计入门.ppt》由会员分享,可在线阅读,更多相关《LINUX-内核驱动设计入门.ppt(37页珍藏版)》请在三一办公上搜索。
1、第 十 章 内核驱动设计入门,嵌入式系统及其软件工具,本章提要,10.1 驱动程序概述,设备驱动程序是操作系统内核和机器硬件之间的接口。所有对设备的操作都必须由被控设备相关的代码驱动程序来完成。设备驱动隐藏了设备的具体细节,为不同设备提供了统一的访问接口。用户或者应用程序可以像操作普通文件一样对硬件设备进行操作,设备驱动是内核的一部分。,10.1.1 设备驱动功能,设备的初始化和释放 负责内核与外设之间的数据交换 提供各类设备服务 检测和处理设备工作过程中出现的错误,驱动程序在嵌入式Linux中的作用:,在嵌入式系统中,要访问某个特定的硬件,实际上就是访问物理的地址空间(处理器内的寄存器、外设
2、的地址映像)。然而,由于MMU的内存映射以及对操作系统的保护,运行在用户态的应用程序一般不能够直接访问硬件地址,因此需要驱动程序作为应用程序和访问硬件之间的媒介。某些驱动程序并不能直接给应用程序调用,而是给Linux内核调用。例如:串口作为console的物理载体;或者驱动程序由操作系统调用,应用程序可以间接的使用驱动程序,如framebuffer,网络设备驱动等。(要去哦球驱动程序必须按照某个框架编写,供上层模块使用),10.1.2 驱动程序开发注意,开发驱动程序和开发应用程序不同;驱动程序应提供尽量多的选项给用户,不应该强加约束;尽量提高驱动程序的速度、效率,尽量简化,便于维护。,10.2
3、 Linux设备与设备驱动,Linux把设备分成3类,每类设备有自己的接口和常用框架,他们也有很多共性。,字符设备:采用字符流方式访问的设备,每次只传输一个字符。特点:顺序访问。鼠标、键盘、串口等。块设备:采用随机访问的方式访问,数据具有固定大小的块的设备;(Linux中块设备与字符设备使用基本一致)特点:缓冲存储,随机访问。硬盘、光盘等。网络设备:采用数据包传输方式访问的设备。特点:与字符设备和块设备不同,没有设备文件。通过socket进行使用。,设备,设备的分类,10.2.1 Linux设备和设备驱动,设备驱动的共性:设备驱动工作在内核态,误操作后果很严重;设备驱动必须提供一个标准的内核接
4、口,字符和块设备采用文件接口,网络设备采用套接字;驱动可以采用标准的内核服务,如:“内存分配”、等待队列、中断机制等;驱动可以动态的连接到内核中,不用时可以卸载。也可将驱动编译到内核中。,10.2.1 Linux设备和设备驱动,10.2.2 Linux设备文件,bash#ls-l/dev 查看相关设备信息crw-1 root root 14,3Jan30 2003 dspcrw-rw-1 root floppy 2,0Jan30 2003 fd0,系统启动时会把设备文件系统挂载在/dev目录下,linux的设备文件的创建、删除和目录层次等都由各设备驱动程序管理。/dev中每个文件都动态的对应了
5、一个系统上存在的设备驱动程序。,10.2.3 Linux对设备文件的操作,open()int open(const*pathname,int flag);open函数用于通过文件路径打开一个文件,返回一个整数类型的文件描述符。,close()int close(int fd);close函数用于关闭文件,close会让数据写回磁盘,并释放文件所占用的资源。,10.2.3 Linux对设备文件的操作,read()ssize_t read(int fd,void*buf,size_t count);read函数从fd指向的文件传送count个字节到buf指针指向的内存中文件读写指针的位置会随着读取
6、到的字节移动。当读取成功时,最好将返回值和count值进行比较若返回的值比count少,则可能读到了文件尾,或者read操作被中断了等。,10.2.4 设备驱动程序接口,write()ssize_t write(int fd,void*buf,size_t count);write函数把参数buf指向的内存写入count个字节到fd指向的文件内。文件的读写位置也会随之变化;,10.2.3 Linux对设备文件的操作,lseek()loff_t lseek(int fd,loff_t offset,int whence);lseek函数用来控制文件的读写位置。,ioctl()int ioctl(
7、int fd,unsigned int cmd,);ioctl是Linux中对设备文件操作的特殊函数。可以对应到驱动程序的相应函数中。,文件操作示例:,#include#include#include#include int main()int fd,size;char s=”File Operationn”;char buffer80;fd=open(“/tmp/tempfile”,O_WRONLY|O_CREAT);write(fd,s,sizeof(s);close(fd);fd=open(“/tmp/tempfile”,O_RDONLY);size=read(fd,buffer,siz
8、eof(buffer);close(fd);printf(“Display:%s”,buffer);return 0;,以上的程序首先打开文件,接下来向文件中写入内容,然后从文件中读取内容,最后关闭文件。其运行结果为:Display:File operation,10.2.4 Linux对设备文件的操作,设备驱动程序是操作系统内核和机器硬件之间的接口。所有对设备的操作都必须由被控设备相关的代码驱动程序来完成。设备驱动隐藏了设备的具体细节,为不同设备提供了统一的访问接口。,应用程序与驱动程序之间的调用关系,10.2.4 Linux对设备文件的操作,Linux应用程序中,通过对文件操作的函数对驱动
9、程序的设备文件进行调用。,10.2.4 Linux对设备文件的操作,struct file_operations/文件操作struct module*owner;loff_t(*llseek)(struct file*,loff_t,int);ssize_t(*read)(struct file*,char*,size_t,loff_t*);ssize_t(*write)(struct file*,const char*,size_t,loff_t*);int(*readdir)(struct file*,void*,filldir_t);unsigned int(*poll)(struct
10、file*,struct poll_table_struct*);int(*ioctl)(struct inode*,struct file*,unsigned int,long);int(*mmap)(struct file*,struct vm_area_struct*);int(*open)(struct inode*,struct file*);int(*release)(struct inode*,struct file*);,字符设备操作,10.2.4 Linux对设备文件的操作,struct block_device_operations/块设备操作int(*open)(stru
11、ct inode*,struct file*);int(*release)(struct inode*,struct file*);int(*ioctl)(struct inode*,struct file*,unsigned int,long);int(*check_media_change)(kdev_t);int(*revalidate_disk)(kdev_t);struct module*owner;,Linux2.4定义的块设备操作,10.2.4 Linux对设备文件的操作,struct block_device_operations int(*open)(struct inode
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- LINUX 内核 驱动 设计 入门
链接地址:https://www.31ppt.com/p-5575616.html