LINUX内核和设备驱动编程.doc
上传人:qw****27 上传时间:2024-09-12 格式:DOC 页数:11 大小:162KB 金币:15 举报 版权申诉
预览加载中,请您耐心等待几秒...

LINUX内核和设备驱动编程.doc

LINUX内核和设备驱动编程.doc

预览

免费试读已结束,剩余 1 页请下载文档后查看

15 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

实验三内核和设备驱动编程一、实验目的1、学习Linux操作系统下内核程序的编写和应用2、学习可编程接口芯片的编程控制方法3、了解驱动程序的结构4、了解驱动程序常用结构体5、了解驱动程序常用函数二、实验原理1关于设备驱动驱动程序是一组代码,这部分代码负责将应用程序的一些需求,如读、写等操作,正确无误的传递给相关的硬件,并使硬件能够做出正确反应的代码。驱动程序像是一个黑盒子,它隐藏了硬件的工作细节,应用程序只需要通过一组标准化的接口,就可以实现对硬件的操作。设备驱动程序的作用在于提供机制,即解决提供什么功能的问题,而如何使用这些功能则交给用户程序处理。设备驱动程序是操作系统内核和机器硬件之间的接口,它为应用程序屏蔽硬件的细节,一般来说,Linux的设备驱动程序需要完成如下功能:(1)初始化设备;(2)提供各类设备服务;(3)负责内核和设备之间的数据交换;(4)检测和处理设备工作过程中出现的错误。更为方便的是,Linux下的设备驱动程序被组织为一组完成不同任务的函数的集合,通过这些函数使得Linux下的设备操作犹如文件一般。在应用程序看来,硬件设备只是一个设备文件,应用程序可以象操作普通文件一样对硬件设备进行操作。这些函数就是open()、close()、read()、write()等。Linux主要将设备分为二类:字符设备和块设备(当然网络设备及USB等其它设备的驱动编写方法又稍有不同)。这两类设备的不同点在于:在对字符设备发出读/写请求时,实际的硬件I/O一般就紧接着发生了,而块设备则不然,它利用一块系统内存作缓冲区,当用户进程对设备请求能满足用户的要求,就返回请求的数据,如果不能,就调用请求函数来进行实际的I/O操作。块设备主要针对磁盘等慢速设备。本实验做的是字符设备的驱动编写。2、Linux设备驱动程序分类Linux设备驱动程序在Linux的内核源代码中占有很大的比例,源代码的长度日益增加,主要是驱动程序的增加。虽然Linux内核的不断升级,但驱动程序的结构还是相对稳定。驱动程序基本框架如下(1)初始化设备模块(2)设备打开模块(3)数据读写和控制模块(4)中断处理模块(有的驱动程序没有)(5)设备释放,卸载模块以上的各个模块基本上都有各自专门的函数,后面会具体介绍3、内核模块Linux以模块的形式加载设备类型,通常来说一个模块对应一个设备驱动,这样便于多个设备的协调工作也利于应用程序的开发和扩展。设备驱动在准备好以后可以编译到内核中,在系统启动时和内核一起启动,这种方法在嵌入式Linux系统中经常被采用。但是通常情况下设备驱动的动态加载更为普遍,这使得开发人员不必在调试过程中频繁启动机器就能完成设备驱动的开发工作,本实验就是动态加载模块。设备驱动在加载时首先调用入口函数init_module(),该函数完成设备驱动的初始化工作,比如寄存器置位、结构体赋值等一系列工作,其中最重要的一个工作就是向内核注册该设备,对于字符设备调用register_chrdev()完成注册,对于块设备需要调用register_blkdev()完成注册。注册成功后,该设备获得了系统分配的主设备号、自定义的次设备号,并建立起于文件系统的关联。设备在卸载时需要回收相应的资源,令设备的响应寄存器复位并从系统中注销该设备,字符设备调用unregister_chrdev()、块设备调用unregister_blkdev()。系统调用部分则是对设备的操作过程,比如open、read、write、ioctl等。图3-1为一个设备驱动模块动态挂载、卸载和系统调用的全过程。图3—1内核模块使用过程简图4、编程中用到的函数(1)intinit_module()和voidcleanup_module(void)一个模块至少要包含这两个函数,装载模块时首先调用init_module(),在这里完成设备驱动的初始化工作,比如寄存器置位、结构体赋值等一系列动作,当然内核设备的注册也在这里完成。卸载模块时会调用cleanup_module(void),如果没有它,加载的模块就没法卸载了,这样累积下来会使得内核变得臃肿。(2)register_chrdev()和unregister_chrdev()对于字符设备,注册该设备用到的函数就是register_chrdev(),例如ret=register_chrdev(MAJOR,NAME,&fops);其中,参数MAJOR为主设备号,NAME为设备名,fops为包含基本函数入口点的结构体,类型为file_operations。同样的,当注销该设备时,程序会调用unregister_chrdev(),例如unregister_chrdev(MAJOR,NAME