第8章 Linux驱动程序概述.ppt

第8章 Linux驱动程序概述.ppt

ID:61906625

大小:1.23 MB

页数:30页

时间:2020-02-07

第8章 Linux驱动程序概述.ppt_第1页
第8章 Linux驱动程序概述.ppt_第2页
第8章 Linux驱动程序概述.ppt_第3页
第8章 Linux驱动程序概述.ppt_第4页
第8章 Linux驱动程序概述.ppt_第5页
资源描述:

《第8章 Linux驱动程序概述.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、Linux驱动程序概述第8章本章目标了解Linux设备驱动程序的基础知识掌握Linux驱动模块的构造和装载方法本章结构设备驱动程序简介Linux驱动程序概述设备驱动的HelloWorld模块内核驱动模块和应用程序对比编译和装载驱动模块构造和运行模块设备的分类和特点字符设备网络设备块设备为什么要学习嵌入式Linux驱动程序开发?高需求内核代码的大部分新芯片、新设备高门槛需要具有硬件知识需要了解内核基础知识需要了解内核中的并发控制和同步复杂的软件结构框架高回报8-1设备驱动程序简介驱动程序的特点操控硬件,是应用程序和硬件设备之间的一个接口隐藏硬

2、件细节,提高应用软件的可移植性提供安全性开发模式内核态驱动用户态驱动提供机制,而不是提供策略机制:驱动程序能实现什么功能策略:用户如何使用这些功能8-2设备的分类和特点设备分类字符设备(chardevice)块设备(blockdevice)网络设备(networkdevice)8-2设备的分类和特点字符设备特点像字节流一样来存取的设备(如同文件)通过/dev下的文件系统结点来访问。通常至少需要实现open,close,read,和write等系统调用只能顺序访问的数据通道,不能前后移动访问指针。特例:比如framebuffer设备就是这样的

3、设备,应用程序可以使用mmap或lseek访问图像的各个区域8-2设备的分类和特点块设备特点块设备通过位于/dev目录的文件系统结点来存取块设备和字符设备的区别仅仅在于内核内部管理数据的方式块设备有专门的接口,块设备的接口必须支持挂装(mount)文件系统。应用程序一般通过文件系统来访问块设备上的内容8-2设备的分类和特点网络设备特点通过单独的网络接口来访问任何一个网络事务都通过一个网络接口,即一个能够和其他主机交换数据的设备。网卡软件设备:环回接口(loopback)内核调用一套和数据包传输相关的函数8-3构造和运行模块驱动程序加入内核的

4、方法把所有需要的功能都编译到内核中生成的内核镜像(Image)文件会很大如果我们要在现有的内核中新增或删除功能,将不得不重新编译和装载内核。?8-3驱动程序加入内核的方法Linux提供了机制被称为模块(Module)的机制提供了对许多模块支持,包括但不限于,设备驱动每个模块由目标代码组成(没有连接成一个完整可执行程序)insmod将模块动态加载到正在运行内核rmmod程序移除模块8.3.1设备驱动的HelloWorld模块(hello.c)#include#includeMODUL

5、E_LICENSE("DualBSD/GPL");staticint__inithello_init(void){printk(KERN_ALERT"Helloworld");return0;}staticvoid__exithello_exit(void){printk(KERN_ALERT"Helloworldexit");}module_init(hello_init);module_exit(hello_exit);自由许可证模块卸载宏用法类似于printf,但它有优先级(比如KERN_ALERT)模块初始化宏宏,告诉内核这

6、两个函数只会在加载和卸载模块时使用8-3-1设备驱动的HelloWorld模块(hello.c)编译内核模块#gcc–C~/kernel-2.6M=`pwd`modules加载内核模块:#insmod./hello.ko查看内核中已装载的模块#lsmod

7、grephello卸载内核模块:#rmmodhello8.3.1设备驱动的HelloWorld模块Linux内核模块的程序结构module_init()---模块加载函数(必须)通过insmod或modprobe命令加载内核模块时,模块的加载函数会自动被内核执行,完成模块的相关初始化工作m

8、odule_exit()---模块卸载函数(必须)当通过rmmod命令卸载某模块时,模块的卸载函数会自动被内核执行,完成与模块装载函数相反的功能8-3-1设备驱动的HelloWorld模块(hello.c)MODULE_LICENSE()---模块许可证声明(必须)模块许可证(LICENSE)声明描述内核模块的许可权限如果不声明LICENSE,模块被加载时,将收到内核被污染(kerneltainted)的警告module_param()---模块参数(可选)模块参数是模块被加载的时候可以被传递给它的值,它本身对应模块内部的全局变量。8-3-

9、1设备驱动的HelloWorld模块(hello.c)EXPORT_SYMBOL()---模块导出符号(可选)内核模块可以导出符号(symbol,对应于函数或变量)到内核其他模块

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。