Linux驱动程序设计.ppt
《Linux驱动程序设计.ppt》由会员分享,可在线阅读,更多相关《Linux驱动程序设计.ppt(48页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、教学内容第一章 嵌入式系统概述第二章 学习板硬件及开发环境的建立第三章 构建嵌入式Linux系统第四章 嵌入式嵌入式Linux设备驱动设备驱动第五章 嵌入式Linux串口和网络编程第六章 嵌入式Linux图形编程Saturday,January 28,2023第四章 嵌入式Linux驱动程序4.1 嵌入式Linux设备驱动简介4.2 设备的分类及特点4.3 构造和运行驱动程序模块Saturday,January 28,2023课程目标掌握嵌入式Linux设备驱动程序的基本原理、架构和设计方法字符设备驱动块设备驱动网络设备驱动掌握Linux设备驱动开发中常用的机制和内核资源中断顶/底半部处理内核
2、定时器和延时操作并发控制在内核中的应用内存管理和分配阻塞型I/O和非阻塞型I/OSaturday,January 28,2023本章目标了解Linux设备驱动程序的基础知识 掌握Linux驱动模块的构造和装载方法 Saturday,January 28,2023本章结构设备驱动程序简介设备驱动程序简介 LinuxLinux驱动程序概述驱动程序概述 设备驱动的设备驱动的Hello WorldHello World模块模块内核驱动模块和应用程序对比内核驱动模块和应用程序对比 编译和装载驱动模块编译和装载驱动模块 构造和运行模块构造和运行模块 设备的分类和特点设备的分类和特点 字符设备字符设备网络设
3、备网络设备块设备块设备Saturday,January 28,2023驱动程序的作用应用程序驱动程序操作系统硬件设备writeioctlreadioctl为什么要学嵌入式Linux驱动程序开发?高需求内核代码的大部分新芯片、新设备高门槛需要具有硬件知识需要了解内核基础知识需要了解内核中的并发控制和同步复杂的软件结构框架高回报Saturday,January 28,20234-1设备驱动程序简介驱动程序的特点驱动程序的特点操控硬件,是应用程序和硬件设备之间的一个接口隐藏硬件细节,提高应用软件的可移植性提供安全性开发模式内核态驱动用户态驱动提供机制,而不是提供策略机制:驱动程序能实现什么功能策略:
4、用户如何使用这些功能Saturday,January 28,2023内核态和用户态大多数OS(包括Linux)把内核和运行在其上的应用程序分为两个层次管理,即用户态和内核态内核态有较高的权限,可以控制处理器内存的映射和分配方式等等对应于ARM的svc模式 用户态:只能运行系统上的应用程序对应于ARM的usr模式内核态与用户态切换:可通过软件中断实现内核态和用户态驱动程序作为系统内核的一部分,其工作在内核态,而应用程序工作在用户态,即不能直接通过指针,把用户空间的数据地址传递给内核(MMU映射地址不一样)。需要经过转换,把用户态“看到的空间”转换成内核态可访问的地址。Linux系统提供了一系列方
5、便的函数实现这种转换,如:_get_user、_put_user、_copy_from_user、_copy_to_user4-2设备的分类和特点设备分类设备分类字符设备字符设备(char device)(char device)块设备块设备(block device)(block device)网络设备网络设备(network device)(network device)Saturday,January 28,20234-2设备的分类和特点字符设备特点字符设备特点像字节流一样来存取的设备(如同文件)通过/dev下的文件系统结点来访问。通常至少需要实现 open,close,read,和 w
6、rite 等系统调用只能顺序访问数据通道,不能前后移动访问指针。特例:比如framebuffer设备就是这样的设备,应用程序可以使用mmap或lseek访问图像的各个区域Saturday,January 28,2023Linux内核结构Linux内核结构应用程序、库、内核、驱动程序的关系open read write ioctl 调用其他库函数称为系统调用,执行swi指令进入内核系统调用的异常处理 其他功能物理设备控制器物理设备应用程序 库其他库函数的实现 内核open read write ioctl 驱动程序4层软件关系说明(1)应用程序使用库函数提供的open函数打开设备文件(2)库根据
7、open函数传入的参数执行“swi”指令,引起CPU异常,进入内核(3)内核的异常处理函数根据这些参数找到相应的驱动程序,返回一个文件描述符给库,进而返回给应用程序(4)应用程序得到文件描述符后,使用库提供的write或ioclt函数发出控制命令(5)库根据write或ioclt函数传入的参数执行“swi”指令,这条指令会引起CPU异常,再次进入内核(6)内核的异常处理函数根据参数调用驱动程序的相关函数,控制硬件4-2设备的分类和特点块设备特点块设备特点块设备通过位于/dev 目录的文件系统结点来存取块设备和字符设备的区别仅仅在于内核内部管理数据的方式块设备有专门的接口,块设备的接口必须支持挂
8、装(mount)文件系统。应用程序一般通过文件系统来访问块设备上的内容Saturday,January 28,20234-2设备的分类和特点网络设备特点网络设备特点通过单独的网络接口来访问任何一个网络事务都通过一个网络接口访问,即一个能够和其他主机交换数据的设备。网卡软件设备:环回接口(loopback)内核调用一套和数据包传输相关的函数Saturday,January 28,20234-3 构造和运行模块驱动程序加入内核的方法驱动程序加入内核的方法把所有需要的功能都编译到内核中把所有需要的功能都编译到内核中生成的内核镜像(Image)文件会很大 如果我们要在现有的内核中新增或删除功能,将不得
9、不重新编译和装载内核。Saturday,January 28,20234-3 驱动程序加入内核的方法 Linux提供了机制被称为模块(Module)的机制 提供了对许多模块支持,包括但不限于,设备驱动每个模块由目标代码组成(没有连接成一个完整可执行程序)insmod 将模块动态加载到正在运行内核rmmod 程序移除模块Saturday,January 28,20234.3.1 设备驱动的Hello World模块#include#include MODULE_LICENSE(Dual BSD/GPL);static int _init hello_init(void)printk(KERN_A
10、LERT Hello worldn);return 0;static void _exit hello_exit(void)printk(KERN_ALERT Hello world exitn);module_init(hello_init);module_exit(hello_exit);自由许可证自由许可证模块卸载宏模块卸载宏用法类似于用法类似于printfprintf,但,但它有优先级它有优先级(比如比如KERN_ALERT)KERN_ALERT)模块初始化模块初始化宏宏宏,告诉内核这两个函数只会宏,告诉内核这两个函数只会在加载和卸载模块时使用在加载和卸载模块时使用Saturday,J
11、anuary 28,2023打印调试printk指示日志级别的宏 KERN_EMERG 用于紧急事件消息,一般是系统崩溃前提示 KERN_ALERT 用于需要立即采取动作 KERN_CRIT 临界状态,通常涉及到严重的硬件或软件操作失败 KERN_ERR 用于报告错误状态,设备驱动程序会经常使用其来报告来自硬件的问题 KERN_WARNING 用于对可能出现的问题进行警告 KERN_NOTICE 用于有必要进行提示的正常情况 KERN_INFO 提示性信息 KERN_DEBUG 用于调试信息打印调试printk每个宏表示一个中的整数(07),数值越小,优先级越高未指定优先级在内核2.6版本中就
12、是KENR_WARNING简单的内核模块编译(内核2.4)编译内核模块#gcc O-DMODULE-D_KERNEL_ -c hello.c-I/usr/src/linux/include (x86 or ARM?)(x86 or ARM?)生成hello.o加载内核模块:insmod#insmod hello.o#dmesg Hello,world查看内核中使用的模块#lsmod|grep hello卸载内核模块:rmmod#rmmod hello.o#dmesg Goodbye world简单的内核模块编译(内核2.6)obj-m:=led_drv.oPWD:=$(shell pwd)al
13、l:make-C$(KDIR)M=$(PWD)modulesclean:make-C$(KDIR)M=$(PWD)cleanMakefileMakefile文件内容文件内容简单的内核模块编译(内核2.6)obj-m:=led_drv.o表示编译后生成led_drv.ko模块$(KDIR)指定了targettarget内核源码内核源码的路径,“M=”表示这是个外部模块,M=$(PWD)指定了该模块文件所在的路径。简单的内核模块编译(内核2.6)如果是多个源文件编译出一个模块,假设模块名是test.ko,那么源文件名不能有test.cobj-m:=test.otest-objs:=file1.o
14、file2.o file3.oPWD:=$(shell pwd)all:make-C$(KDIR)M=$(PWD)modulesclean:make-C$(KDIR)M=$(PWD)clean4.3.1 设备驱动的Hello World模块LinuxLinux内核模块的程序结构内核模块的程序结构module_init()-module_init()-模块加载函数(必须)模块加载函数(必须)通过insmod或modprobe命令加载内核模块时,模块的加载函数会自动被内核执行,完成模块的相关初始化工作module_exit()-module_exit()-模块卸载函数(必须)模块卸载函数(必须)当
15、通过rmmod命令卸载某模块时,模块的卸载函数会自动被内核执行,完成与模块装载函数相反的功能Saturday,January 28,20234-3-1 设备驱动的Hello World模块MODULE_LICENSE()-MODULE_LICENSE()-模块许可证声明(必须)模块许可证声明(必须)模块许可证(LICENSE)声明描述内核模块的许可权限如果不声明LICENSE,模块被加载时,将收到内核被污染(kernel tainted)的警告包括:“GPL”、“GPL v2”、“GPL and additional rights”、“Dual BSD/GPL”、“Dual MPI/GPL”、
16、“Proprietary”Saturday,January 28,20234-3-1 设备驱动的Hello World模块模块加载函数模块加载函数static int _init initialization_function(void)/*初始化代码*/module_init(initialization_function);应当声明成静态的应当声明成静态的(staticstatic),因为它们不因为它们不会在特定文件之外可见会在特定文件之外可见表明该函数只是在初始化时使用。模块加载器在模块加载表明该函数只是在初始化时使用。模块加载器在模块加载后会丢掉这个初始化函数后会丢掉这个初始化函数,这
17、样可将该函数占用的内存释这样可将该函数占用的内存释放出来,以作他用。放出来,以作他用。原型:原型:#define _init _attribute_#define _init _attribute_(_section_(“.init.text”)(_section_(“.init.text”)定义会在模块目标代码中增加一个特殊的定义会在模块目标代码中增加一个特殊的段段,用于说明内核模块初始化函数所在的位用于说明内核模块初始化函数所在的位置。没有这个定义置。没有这个定义,初始化函数不会被调用。初始化函数不会被调用。Saturday,January 28,20234-3-1 设备驱动的Hello
18、World模块模块卸载函数模块卸载函数 static void _exit cleanup_function(void)/*释放资源*/module_exit(cleanup_function);在模块被移除前注销接口并在模块被移除前注销接口并释放所有所占用的系统资源释放所有所占用的系统资源标识这个代码是只用于模块卸载标识这个代码是只用于模块卸载(通过使编译器把它放在通过使编译器把它放在特殊的特殊的 ELF ELF 段段)原型:原型:#define _exit _attribute_#define _exit _attribute_(_section_(“.exit.text”)(_secti
19、on_(“.exit.text”)Saturday,January 28,20234.3.1 设备驱动的Hello World模块#include#include MODULE_LICENSE(Dual BSD/GPL);static int _init hello_init(void)printk(KERN_ALERT Hello worldn);return 0;static void _exit hello_exit(void)printk(KERN_ALERT Hello world exitn);module_init(hello_init);module_exit(hello_ex
20、it);Saturday,January 28,20234-3-1 设备驱动的Hello World模块module_param()-module_param()-模块参数(可选)模块参数(可选)模块参数是模块被加载的时候可以被传递给它的值,它本身对应模块内部的全局变量。Saturday,January 28,20234-3-1 设备驱动的Hello World模块EXPORT_SYMBOL()-EXPORT_SYMBOL()-模块导出符号(可选)模块导出符号(可选)内核模块可以导出符号(symbol,对应于函数或变量)到内核其他模块可以使用本模块中的变量或函数其他一些声明其他一些声明MODU
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux 驱动程序 设计
限制150内