第3部分嵌入式软件系统3_第1页
第3部分嵌入式软件系统3_第2页
第3部分嵌入式软件系统3_第3页
第3部分嵌入式软件系统3_第4页
第3部分嵌入式软件系统3_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、2022-5-21哈尔滨工业大学哈尔滨工业大学 电子与信息技术研究院电子与信息技术研究院哈尔滨工业大学哈尔滨工业大学( (威海威海) ) 通信工程系通信工程系第第3部分部分 嵌入式软件系统嵌入式软件系统2022-5-2哈尔滨工业大学哈尔滨工业大学 电子与信息技术电子与信息技术研究院研究院哈尔滨工业大学哈尔滨工业大学(威海威海) 通通信工程系信工程系2第六节第六节嵌入式嵌入式Linux设备驱动设备驱动2022-5-2哈尔滨工业大学哈尔滨工业大学 电子与信息技术电子与信息技术研究院研究院哈尔滨工业大学哈尔滨工业大学(威海威海) 通通信工程系信工程系3n6.1 Linux设备驱动程序概述设备驱动程序

2、概述n6.2 设备驱动程序的结构设备驱动程序的结构n6.3 Linux设备驱动程序的使用方法设备驱动程序的使用方法2022-5-2哈尔滨工业大学哈尔滨工业大学 电子与信息技术电子与信息技术研究院研究院哈尔滨工业大学哈尔滨工业大学(威海威海) 通通信工程系信工程系46.1 Linux设备驱动程序概述Linux设备驱动程序的作用:(1) 设备驱动程序屏蔽具体硬件设备的细节; 操作系统-机器硬件之间的接口(2) 驱动是展现硬件所具有的功能,只是个中间环节; 应用程序如何操作硬件?(3) 并发问题:驱动程序有时会被多个进程同时使用,需要调用一些内核的函数使用互斥量和锁等机制。2022-5-2哈尔滨工业

3、大学哈尔滨工业大学 电子与信息技术电子与信息技术研究院研究院哈尔滨工业大学哈尔滨工业大学(威海威海) 通通信工程系信工程系56.1 概述6.1.1 设备驱动原理 所有操作系统下设备驱动程序的共同目标是屏蔽具体物理设备的操作细节,实现设备无关性。 原理:在嵌入式操作系统中,设备驱动程序通常是内核的重要部分,运行在内核模式,即设备驱动程序为内核提供了一个I/O接口,用户使用这个接口实现对设备的操作。2022-5-2哈尔滨工业大学哈尔滨工业大学 电子与信息技术电子与信息技术研究院研究院哈尔滨工业大学哈尔滨工业大学(威海威海) 通通信工程系信工程系66.1.1 设备驱动原理 I/O系统层次结构和功能系

4、统层次结构和功能 2022-5-2哈尔滨工业大学哈尔滨工业大学 电子与信息技术电子与信息技术研究院研究院哈尔滨工业大学哈尔滨工业大学(威海威海) 通通信工程系信工程系7驱动程序与外界的接口:驱动程序与外界的接口:3个部分个部分n驱动程序与操作系统内核的接口:这是通过驱动程序与操作系统内核的接口:这是通过数据结构数据结构file_operations来完成的。来完成的。n驱动程序与系统引导的接口:这部分利用驱驱动程序与系统引导的接口:这部分利用驱动程序对设备进行初始化。动程序对设备进行初始化。n驱动程序与设备的接口:这部分描述了驱动驱动程序与设备的接口:这部分描述了驱动程序如何与设备进行交互,这

5、与具体设备密切程序如何与设备进行交互,这与具体设备密切相关。相关。2022-5-2哈尔滨工业大学哈尔滨工业大学 电子与信息技术电子与信息技术研究院研究院哈尔滨工业大学哈尔滨工业大学(威海威海) 通通信工程系信工程系86.1 概述 6.1.2 模块化编程 原因:由于历史原因及出于效率方面的考虑,Linux是一个宏内核。一旦需要在内核的基础上增加一项功能时,就必须重新编译整个内核,这无疑给内核功能的扩充带来了不便。 于是,Linux发展了可安装内核模块的机制“module”。 2022-5-2哈尔滨工业大学哈尔滨工业大学 电子与信息技术电子与信息技术研究院研究院哈尔滨工业大学哈尔滨工业大学(威海威

6、海) 通通信工程系信工程系96.1.2 模块化编程从代码特征上来看,模块就是可完成一项独立功能的一组函数的集合;从使用特征上来看,它在需要时可以随时被安装,而在不需要时又可以随时被卸载。准确地说,模块就是一个已编译但未连接的可执行文件。利用这种机制,我们可以根据需要,在不重新编译内核的情况下,将编译好的模块动态地插入运行中的内核,或者将内核中已经存在的某个模块移走。2022-5-2哈尔滨工业大学哈尔滨工业大学 电子与信息技术电子与信息技术研究院研究院哈尔滨工业大学哈尔滨工业大学(威海威海) 通通信工程系信工程系106.1.2 模块化编程n为了增强内核的灵活性和为了方便,设备驱动程度应被设计为可

7、动态安装的内核模块。一个典型的Linux设备驱动程序应包含以下几部分代码:驱动程序模块的注册与注销函数;驱动程序模块的注册与注销函数;设备的打开、关闭、读、写及需要的其他操作函数;设备的打开、关闭、读、写及需要的其他操作函数;设备的中断服务程序。设备的中断服务程序。2022-5-2哈尔滨工业大学哈尔滨工业大学 电子与信息技术电子与信息技术研究院研究院哈尔滨工业大学哈尔滨工业大学(威海威海) 通通信工程系信工程系116.1 概述6.1.3 设备类型 Linux中的设备可以分为三类:字符设备、块设备和网络设备。1.字符设备 字符设备是指数据处理以字节为单位按顺序进行的设备,它没有缓冲区,不支持随机

8、读写。 EgEg:如串口、触摸屏、并口、AD等。2022-5-2哈尔滨工业大学哈尔滨工业大学 电子与信息技术电子与信息技术研究院研究院哈尔滨工业大学哈尔滨工业大学(威海威海) 通通信工程系信工程系126.1.3 设备类型2.块设备块设备n块设备块设备是指那些在输入是指那些在输入/ /输出时数据处理输出时数据处理以以块块为单位的设备,它一般都为单位的设备,它一般都采用了缓存采用了缓存技术,技术,支持数据的随机读写支持数据的随机读写。EgEg: : 典型的块设备有磁盘、内存、典型的块设备有磁盘、内存、flashflash等。等。2022-5-2哈尔滨工业大学哈尔滨工业大学 电子与信息技术电子与信息

9、技术研究院研究院哈尔滨工业大学哈尔滨工业大学(威海威海) 通通信工程系信工程系136.1.3 设备类型3. .网络设备网络设备 通过通过BSDBSD套接口套接口访问的设备访问的设备( (存取数据存取数据) )。对。对数据包大小无限制。数据包大小无限制。 如网卡等。如网卡等。 2022-5-2哈尔滨工业大学哈尔滨工业大学 电子与信息技术电子与信息技术研究院研究院哈尔滨工业大学哈尔滨工业大学(威海威海) 通通信工程系信工程系146.1.4 设备文件 nLinux中硬件设备被抽象出来,中硬件设备被抽象出来,所有设备所有设备都可看成文件都可看成文件(置于(置于/dev目录)目录)UNIX法則法則: “

10、Everything is file”n可以使用和操作文件相同的、标准的系统调用接口来完成打开、关闭、读写和I/O控制操作 n对用户来说,设备文件与普通文件并无区别。 对用户来说对用户来说,块、字符等设备的访问接口都是一样的,块、字符等设备的访问接口都是一样的,都是一组都是一组基于文件的系统调用基于文件的系统调用,如,如read,write等,它等,它们在实现上细节的区别仅在内核和驱动程序的软件接们在实现上细节的区别仅在内核和驱动程序的软件接口上。口上。2022-5-2哈尔滨工业大学哈尔滨工业大学 电子与信息技术电子与信息技术研究院研究院哈尔滨工业大学哈尔滨工业大学(威海威海) 通通信工程系信

11、工程系156.1 概述n6.1.5 设备号n主设备号:标识该设备的种类,也标识了该设备所使用的驱动程序;n次设备号:标识使用同一设备驱动程序的不同硬件设备; 通过主、次设备号能唯一地标识出设备。n所有已经注册(即已经加载了驱动程序)的硬件设备的主设备号可以从 /proc/dev文件中得到 2022-5-2哈尔滨工业大学哈尔滨工业大学 电子与信息技术电子与信息技术研究院研究院哈尔滨工业大学哈尔滨工业大学(威海威海) 通通信工程系信工程系16ls -l /devcrw-rw-rw- 1 root root 1, 3 Jan 1 00:00 nullbrw-r- 1 root root 8, 0 J

12、an 1 00:00 sdabrw-r- 1 root root 8, 1 Jan 1 00:00 sda1brw-r- 1 root root 8, 2 Jan 1 00:00 sda2brw-r- 1 root root 8, 3 Jan 1 00:00 sda3crw-r-r- 1 root root 1, 9 Jan 1 00:00 urandomcrw-rw-rw- 1 root root 5, 0 Jan 1 00:00 ttycrw- 1 root root 5, 1 Jan 1 00:00 consolecrw-rw-rw- 1 root root 5, 2 Jan 1 00:

13、00 ptmxcrw- 1 root root 4, 64 Jan 1 00:15 ttyS0crw- 1 root root 4, 65 Jan 1 00:00 ttyS1crw- 1 root root 4, 66 Jan 1 00:00 ttyS2crw- 1 root root 4, 67 Jan 1 00:00 ttyS3crw- 1 root root 4, 68 Jan 1 00:00 ttyS4c:字符设备字符设备b:块设备块设备主设备号主设备号次设备号次设备号2022-5-2哈尔滨工业大学哈尔滨工业大学 电子与信息技术电子与信息技术研究院研究院哈尔滨工业大学哈尔滨工业大学(威

14、海威海) 通通信工程系信工程系176.1.6 Linux设备驱动的特点设备驱动的特点综上所述,综上所述,Linux中的设备驱动程序有如下特点。中的设备驱动程序有如下特点。n(1)内核代码:设备驱动程序是内核的一部)内核代码:设备驱动程序是内核的一部分,如果驱动程序出错,则可能分,如果驱动程序出错,则可能导致系统崩溃导致系统崩溃。n(2)内核接口:设备驱动程序必须)内核接口:设备驱动程序必须为内核或为内核或者其子系统提供一个标准接口者其子系统提供一个标准接口。比如,一个终。比如,一个终端驱动程序必须为内核提供一个文件端驱动程序必须为内核提供一个文件I/O 接口;接口;一个一个SCSI设备驱动程序

15、应该为设备驱动程序应该为SCSI子系统提子系统提供一个供一个SCSI设备接口,同时设备接口,同时SCSI子系统也必子系统也必须为内核提供文件的须为内核提供文件的I/O 接口及缓冲区。接口及缓冲区。n(3)内核机制和服务:设备驱动程序使用一)内核机制和服务:设备驱动程序使用一些些标准的内核服务标准的内核服务,如内存分配等。,如内存分配等。2022-5-2哈尔滨工业大学哈尔滨工业大学 电子与信息技术电子与信息技术研究院研究院哈尔滨工业大学哈尔滨工业大学(威海威海) 通通信工程系信工程系18n(4)可装载:大多数的)可装载:大多数的Linux 操作系统设备驱动操作系统设备驱动程序都可以程序都可以在需

16、要时装载进内核在需要时装载进内核,在不需要时从,在不需要时从内核中内核中卸载卸载。n(5)可设置:)可设置:Linux 操作系统设备驱动程序操作系统设备驱动程序可以可以集成为内核的一部分集成为内核的一部分,并可以根据需要把其中的,并可以根据需要把其中的某一部分集成到内核中,这只需要在某一部分集成到内核中,这只需要在系统编译时系统编译时进行相应的设置即可进行相应的设置即可。n(6)动态性:在系统启动且各个设备驱动程序初)动态性:在系统启动且各个设备驱动程序初始化后,驱动程序将维护其控制的设备。始化后,驱动程序将维护其控制的设备。如果该如果该设备驱动程序控制的设备不存在也不影响系统的设备驱动程序控

17、制的设备不存在也不影响系统的运行运行,那么此时的设备驱动程序只是多占用了一,那么此时的设备驱动程序只是多占用了一点系统内存罢了。点系统内存罢了。6.1.6 Linux设备驱动的特点设备驱动的特点2022-5-2哈尔滨工业大学哈尔滨工业大学 电子与信息技术电子与信息技术研究院研究院哈尔滨工业大学哈尔滨工业大学(威海威海) 通通信工程系信工程系19n6.1 Linux设备驱动程序概述设备驱动程序概述n6.2 设备驱动程序的结构设备驱动程序的结构n6.3 Linux设备驱动程序的使用方法设备驱动程序的使用方法2022-5-2哈尔滨工业大学哈尔滨工业大学 电子与信息技术电子与信息技术研究院研究院哈尔滨

18、工业大学哈尔滨工业大学(威海威海) 通通信工程系信工程系20设备驱动程序源代码的基本结构/* * 驱动程序简单驱动程序简单说明:说明: * 驱动程序的作用:驱动程序的作用:这是一个字符设备驱动程序的基本框架结构这是一个字符设备驱动程序的基本框架结构 * 被驱动设备的简单描述:被驱动设备的简单描述: * 一些特殊的考虑等:一些特殊的考虑等: * 版本,创建日期,作者等:版本,创建日期,作者等:1.0版,版,2006年年1月月6日日*/#ifndef _KERNEL_#define _KERNEL_#endif#ifndef MODULE#define MODULE#endif#include #

19、include .#include 表明这个模块将用于内核表明这个模块将用于内核,也可以在编译时通,也可以在编译时通过过 D选项指定,如选项指定,如gcc D _KERNEL_。参见参见Makefile。内核头文件,需要根据具体内核头文件,需要根据具体驱动程序和用到的内核模块驱动程序和用到的内核模块确定。确定。表明这个驱动程序将以模块的方式编译和使用,表明这个驱动程序将以模块的方式编译和使用,也可以在编译时通过也可以在编译时通过 D选项指定,如选项指定,如gcc D MODULE。参见。参见Makefile。gcc D预定义功能预定义功能gcc D namegcc D _KERNEL_ D M

20、ODULE 。2022-5-2哈尔滨工业大学哈尔滨工业大学 电子与信息技术电子与信息技术研究院研究院哈尔滨工业大学哈尔滨工业大学(威海威海) 通通信工程系信工程系21/* * 驱动程序中使用的各种函数的原型声明。标准的作法驱动程序中使用的各种函数的原型声明。标准的作法是将函数原型声明是将函数原型声明 * 放在一个头文件中放在一个头文件中,然后在该文件开始处使用,然后在该文件开始处使用#include引用,引用,并在该并在该 * 文件中定义。文件中定义。 * * 这里我们将函数的声明和定义放在一起。所以下面的代码既是函数的声明,这里我们将函数的声明和定义放在一起。所以下面的代码既是函数的声明,

21、* 也是函数的定义。也是函数的定义。 */static ssize_t spioc_read(struct file *filp, char *buffsize_t cnt, loof_t *off)/* 这里是这里是read函数的代码函数的代码 */return ret;static ssize_t spioc_write(struct file *filp, char *buffsize_t cnt, loff_t *off)/* 这里是这里是write函数的代码函数的代码 */return ret;212022-5-2哈尔滨工业大学哈尔滨工业大学 电子与信息技术电子与信息技术研究院研究院

22、哈尔滨工业大学哈尔滨工业大学(威海威海) 通通信工程系信工程系22static int spioc_ioctl(struct inode *inode, struct file *filpunsigned int cmd, unsigned long arg)/* 这里是这里是ioctl函数的代码,它的一般格式为一个函数的代码,它的一般格式为一个switch分支语句分支语句 *switch(cmd) *case CMD1: *. *break; *. *case CMDn: *. *break *default: *. *break; * */return ret;ioctl()函数用于控制驱

23、动程序本身的一些特性和参数,如设定驱动函数用于控制驱动程序本身的一些特性和参数,如设定驱动程序使用的缓冲区的大小,设定串行通讯的速率等。程序使用的缓冲区的大小,设定串行通讯的速率等。222022-5-2哈尔滨工业大学哈尔滨工业大学 电子与信息技术电子与信息技术研究院研究院哈尔滨工业大学哈尔滨工业大学(威海威海) 通通信工程系信工程系23static int spioc_open(struct inode *inode, struct file *filp)/* 这里是这里是open函数的代码函数的代码 */return ret;static int spioc_close(struct ino

24、de *inode, struct file *filp)/* 这里是这里是close函数的代码函数的代码 */return ret;上述上述5个函数,即个函数,即read(), write(), ioctl(), open(), close(),是一个字符,是一个字符设备驱动程序设备驱动程序最基本的最基本的需要由驱动程序的作者完成的函数。需要由驱动程序的作者完成的函数。这这5个函数将对应于相应的个函数将对应于相应的5个系统调用:个系统调用:read() - spioc_read()write() - spioc_write()ioctl() - spioc_ioctl()open() - s

25、pioc_open()close() - spioc_close()系统调用系统调用驱动程序函数驱动程序函数232022-5-2哈尔滨工业大学哈尔滨工业大学 电子与信息技术电子与信息技术研究院研究院哈尔滨工业大学哈尔滨工业大学(威海威海) 通通信工程系信工程系24static struct file_operations spioc_fops = read:spioc_read,write:spioc_write,ioctl:spioc_ioctl,open:spioc_open,release:spioc_close,;file_operations是一个是一个结构体类型结构体类型,定义在,

26、定义在include/linux/fs.h中。中。上述代码定义了一个上述代码定义了一个file_operations类型的类型的结构体结构体spioc_fops,并将,并将其中的一些成员其中的一些成员赋了初值赋了初值。结构体结构体spioc_fops将作为一个参数在注册一个设备驱动程序时传递给内核。将作为一个参数在注册一个设备驱动程序时传递给内核。内核使用内核使用设备链表设备链表维护各种注册的设备。不同类型的设备使用不同的链表。维护各种注册的设备。不同类型的设备使用不同的链表。2022-5-2哈尔滨工业大学哈尔滨工业大学 电子与信息技术电子与信息技术研究院研究院哈尔滨工业大学哈尔滨工业大学(威

27、海威海) 通通信工程系信工程系25struct 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 (*

28、poll) (struct file *, struct poll_table_struct *); int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long); int (*mmap) (struct file *, struct vm_area_struct *); int (*open) (struct inode *, struct file *); int (*flush) (struct file *); int (*release) (struct inode *, struct file *

29、); int (*fsync) (struct file *, struct dentry *, int datasync); int (*fasync) (int, struct file *, int); int (*lock) (struct file *, int, struct file_lock *); ssize_t (*readv) (struct file *, const struct iovec *, unsigned long, loff_t *); ssize_t (*writev) (struct file *, const struct iovec *, unsi

30、gned long, loff_t *); ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int); unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);struct file_operationsinclude/linux/fs.h252022-5-2哈尔滨工业大学哈尔滨工业大学 电子与信息技术电子与信息技术研究院研究院哈尔滨

31、工业大学哈尔滨工业大学(威海威海) 通通信工程系信工程系26static int _init spioc_init(void)/* 设备初始化代码等设备初始化代码等 */if(register_chrdev(SPIOC_MAJOR, “spioc”, &spioc_fops) printk(KERN_ERR “spioc.c: unable to register ”“the device with major %d.n”, SPIOC_MAJOR);return EIO;/* 其他初始化代码其他初始化代码 */return ret;static void _exit spioc_exit(v

32、oid)/* 设备设备注销注销代码代码 */if(unregister_chrdev(SPIOC_MAJOR, “spioc”) printk(KERN_ERR “spioc.c: unable to remove the ”“device with major %d.n”, SPIOC_MAJOR);return;/* 其它设备撤消代码其它设备撤消代码 */return;262022-5-2哈尔滨工业大学哈尔滨工业大学 电子与信息技术电子与信息技术研究院研究院哈尔滨工业大学哈尔滨工业大学(威海威海) 通通信工程系信工程系27module_init(spioc_init);module_exi

33、t(spioc_exit);这两个函数,这两个函数,module_init()和和module_exit(),用于告诉内核,用于告诉内核,当一个驱动程序当一个驱动程序加载和退出加载和退出(或撤消)时,需要执行的操作。(或撤消)时,需要执行的操作。不同驱动程序在加载和退出时,除了基本的向内核不同驱动程序在加载和退出时,除了基本的向内核注册注册设备设备驱动程序外,还有各自的驱动程序外,还有各自的针对具体设备的操作针对具体设备的操作。2022-5-2哈尔滨工业大学哈尔滨工业大学 电子与信息技术电子与信息技术研究院研究院哈尔滨工业大学哈尔滨工业大学(威海威海) 通通信工程系信工程系28要点总结要点总结

34、:宏:宏:_KERNEL_, MODULE_KERNEL_:表明这将是用于内核的代码表明这将是用于内核的代码,否则很多内核过程将无法使用。,否则很多内核过程将无法使用。MODULE:如果是以模块方式编译如果是以模块方式编译,需要定义这个宏;如果是静态连接则不用。,需要定义这个宏;如果是静态连接则不用。module_init()/module_exit(): spioc_init()/spioc_exit()每个驱动程序都要有这两个函数,它们分别用于设备驱动程序的加载和撤消每个驱动程序都要有这两个函数,它们分别用于设备驱动程序的加载和撤消。static struct file_operation

35、s spioc_fops:每个驱动程序都要有这样的结构体每个驱动程序都要有这样的结构体,可能不止一个。用,可能不止一个。用register_chrdev()()注册驱动程序时注册驱动程序时这个结构体的起始地址这个结构体的起始地址被传送到内核的设备表中。被传送到内核的设备表中。SPIOC_MAJOR:每个设备驱动程序有一个主设备号每个设备驱动程序有一个主设备号(major number)。不同设备驱动程序不能。不同设备驱动程序不能使用相同的主设备号。一个设备驱动程序可以管理不同的使用相同的主设备号。一个设备驱动程序可以管理不同的(但一般是同一类的但一般是同一类的)设备,设备,通过次设备号通过次设

36、备号(minor number)区分区分。spioc_ open()/close(),read()/write(), ioctl():根据具体驱动程序定义和使用。根据具体驱动程序定义和使用。一般一般open()/close()总是需要的,而且总是需要的,而且open()和和close()一定要成对出现。一定要成对出现。282022-5-2哈尔滨工业大学哈尔滨工业大学 电子与信息技术电子与信息技术研究院研究院哈尔滨工业大学哈尔滨工业大学(威海威海) 通通信工程系信工程系29n6.1 Linux设备驱动程序概述设备驱动程序概述n6.2 设备驱动程序的结构设备驱动程序的结构n6.3 Linux设备驱

37、动程序的使用方法设备驱动程序的使用方法2022-5-2哈尔滨工业大学哈尔滨工业大学 电子与信息技术电子与信息技术研究院研究院哈尔滨工业大学哈尔滨工业大学(威海威海) 通通信工程系信工程系30机制与策略n机制机制(mechanism)n设备驱动程序所具备的设备驱动程序所具备的能力能力n例如:串行设备驱动程序具有设置波特率的能例如:串行设备驱动程序具有设置波特率的能力。力。n策略策略(policy)n这些能力这些能力如何如何被使用被使用n例如:根据需要将串口波特率设置成例如:根据需要将串口波特率设置成9.6kbps。设备驱动程序应该是设备驱动程序应该是“策略无关策略无关”的,即的,即policy

38、free。2022-5-2哈尔滨工业大学哈尔滨工业大学 电子与信息技术电子与信息技术研究院研究院哈尔滨工业大学哈尔滨工业大学(威海威海) 通通信工程系信工程系31设备驱动程序的使用n(1) 驱动程序模块的动态链接和静态链接驱动程序模块的动态链接和静态链接n(2) 创建设备文件创建设备文件n(3) 使用设备使用设备2022-5-2哈尔滨工业大学哈尔滨工业大学 电子与信息技术电子与信息技术研究院研究院哈尔滨工业大学哈尔滨工业大学(威海威海) 通通信工程系信工程系32设备驱动程序被静态编译到内核中的情况设备驱动程序被静态编译到内核中的情况:module_init()指示内核在启动过程中运行设备的初始

39、化函数,指示内核在启动过程中运行设备的初始化函数,如如spioc_init()函数。驱动程序的加载随内核的启动一起完成。函数。驱动程序的加载随内核的启动一起完成。静态编译的内核模块不能被动态卸载,静态编译的内核模块不能被动态卸载,只有到系统关闭时由内只有到系统关闭时由内核执行相应的卸载函数核执行相应的卸载函数,如,如spioc_exit()。(1) 驱动程序模块的加载驱动程序模块的加载设备驱动程序被动态加载到内核中的情况设备驱动程序被动态加载到内核中的情况:首先,驱动程序需要被编译成目标文件,如首先,驱动程序需要被编译成目标文件,如spioc.o。在操作系统运行之后,在操作系统运行之后,使用使

40、用insmod命令将驱动程序模块动态加命令将驱动程序模块动态加载到内核中载到内核中$ insmod spioc.o使用使用insmod命令动态加载的内核模块命令动态加载的内核模块可以使用可以使用rmmod命令动态命令动态地从内核中卸载地从内核中卸载$ rmmod spioc.o2022-5-2哈尔滨工业大学哈尔滨工业大学 电子与信息技术电子与信息技术研究院研究院哈尔滨工业大学哈尔滨工业大学(威海威海) 通通信工程系信工程系33n常用的与模块相关的命令:常用的与模块相关的命令:nlsmod 列出当前系统中加载的模块列出当前系统中加载的模块nrmmod 是用于将当前模块卸载是用于将当前模块卸载ni

41、nsmod 是用于加载当前模块是用于加载当前模块nmknod是用于创建模块节点是用于创建模块节点ls -l /devcrw-rw-rw- 1 root root 1, 3 Jan 1 00:00 nullbrw-r- 1 root root 8, 0 Jan 1 00:00 sdabrw-r- 1 root root 8, 1 Jan 1 00:00 sda1brw-r- 1 root root 8, 2 Jan 1 00:00 sda2brw-r- 1 root root 8, 3 Jan 1 00:00 sda3crw-r-r- 1 root root 1, 9 Jan 1 00:00 u

42、randomcrw-rw-rw- 1 root root 5, 0 Jan 1 00:00 ttycrw- 1 root root 5, 1 Jan 1 00:00 consolecrw-rw-rw- 1 root root 5, 2 Jan 1 00:00 ptmxcrw- 1 root root 4, 64 Jan 1 00:15 ttyS0crw- 1 root root 4, 65 Jan 1 00:00 ttyS1crw- 1 root root 4, 66 Jan 1 00:00 ttyS2crw- 1 root root 4, 67 Jan 1 00:00 ttyS3crw- 1

43、 root root 4, 68 Jan 1 00:00 ttyS42022-5-2哈尔滨工业大学哈尔滨工业大学 电子与信息技术电子与信息技术研究院研究院哈尔滨工业大学哈尔滨工业大学(威海威海) 通通信工程系信工程系34module_init()module_exit()模块在调用模块在调用insmod命令时被加载,此时的入命令时被加载,此时的入口点是口点是module_init函数,通常在该函数中完函数,通常在该函数中完成设备的注册。成设备的注册。 在设备完成注册加载之后,用户的应用程在设备完成注册加载之后,用户的应用程序就可以对该设备进行一定的操作,如序就可以对该设备进行一定的操作,如re

44、ad、write等,而驱动程序就是用于实现这些操作。等,而驱动程序就是用于实现这些操作。同样,模块在调用同样,模块在调用rmmod函数时被卸载,此函数时被卸载,此时的入口点是时的入口点是module_exit函数,在该函数中完函数,在该函数中完成设备的卸载。成设备的卸载。insmod spioc.omodule_init(spioc_init)module_exit(spioc_exit);2022-5-2哈尔滨工业大学哈尔滨工业大学 电子与信息技术电子与信息技术研究院研究院哈尔滨工业大学哈尔滨工业大学(威海威海) 通通信工程系信工程系35如何向内核注册如何向内核注册n驱动程序有一个入口函数,

45、会将驱动程驱动程序有一个入口函数,会将驱动程序的序的file_operations结构,连同其主设结构,连同其主设备号向内核进行注册。备号向内核进行注册。n注册后,用户程序操作设备文件时,注册后,用户程序操作设备文件时,Linux系统就会根据设备文件的类型系统就会根据设备文件的类型(是是字符还是块设备字符还是块设备)、主设备号找到在内核主设备号找到在内核中注册的中注册的file_operations结构结构,次设备次设备号用来辨别是同类设备的第几个号用来辨别是同类设备的第几个。2022-5-2哈尔滨工业大学哈尔滨工业大学 电子与信息技术电子与信息技术研究院研究院哈尔滨工业大学哈尔滨工业大学(威海威海) 通通信工程系信工程系36注册和卸载注册和卸载2022-5-2哈尔滨工业大学哈尔滨工业大学 电子与信息技术电子与信息技术研究院研究院哈尔滨工业大学哈尔滨工业大学(威海威海) 通通信工程系信工程系37(2) 创建设备文件创建设备文件Linux操作系统将字符设备和块设备作

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论