版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、LINUX系统驱动概述设备驱动程序基本 概念 LINUX系统驱动概述 LINUX系统驱动概述设备驱动程序基本 概念 设备驱动程序基本概念-软件系统流程 LINUX系统驱动概述设备驱动程序基本 概念 设备驱动程序基本概念-驱动程序作用 o设备驱动程序将复杂的硬件抽象成一个结构 良好的设备,并通过提供统一的程序接口为 系统的其它部分提供使用设备的能力和方法。 o设备驱动程序(应该只是)为系统的其它部分 提供各种使用设备的能力,使用设备的方法 应该由应用程序决定。 LINUX系统驱动概述设备驱动程序基本 概念 oLinux下对外设的访问只能通过驱动程序 oLinux对于驱动程序有统一的接口,以文件的
2、形式定义系统的 驱动程序: Open、Release、read、write、ioctl o驱动程序是内核的一部分,可以使用中断、DMA等操作 o驱动程序需要在用户态和内核态之间传递数据 设备驱动程序基本概念 LINUX系统驱动概述设备驱动程序基本 概念 设备驱动程序基本概念 o驱动程序与应用程序的区别 1、应用程序以main函数开始,驱动程序则没用main函数。它以特殊的 模块初始化函数为入口。 2、应用程序从头至尾执行一个任务,驱动程序在完成初始化后,等待系 统调用。 3、应用程序可以使用GLIBC等标准C函数库,驱动程序不能使用标准C函 数库。 LINUX系统驱动概述设备驱动程序基本 概念
3、 简单实例 o#include o#include oMODULE_LICENSE(Dual BSD/GPL); ostatic int hello_init(void) o oprintk(KERN_ALERT Hello, worldn); oreturn 0; o ostatic void hello_exit(void) o oprintk(KERN_ALERT Goodbye, worldn); o omodule_init(hello_init); omodule_exit(hello_exit); LINUX系统驱动概述设备驱动程序基本 概念 设备驱动程序的分类 o字符设备驱动程
4、序 n各种串行接口,并行接口等。 o块设备驱动程序 n磁盘设备等 o网络设备驱动程序 n网卡等。 o杂项设备驱动程序 n不属于上述三种设备之外的一些设备,如SCSI,时钟等。 LINUX系统驱动概述设备驱动程序基本 概念 驱动程序在操作系统中的位置 o设备驱动程序是内核代码的一部分。 o驱动程序的地址空间是内核的地址空间。 o驱动程序的代码直接对设备硬件(实际是设备的各种寄存器)进 行控制(实际就是读写操作)。 o应用程序通过操作系统的系统调用执行相应的驱动程序函数。 中断则直接执行相应的中断程序代码。 o设备驱动程序的结构体的地址被注册到内核中的设备链表中。 o块设备和字符设备以设备文件的方
5、式建立在文件系统中的/dev 目录下,而且每个设备都有一个主设备号和一个次设备号。 LINUX系统驱动概述设备驱动程序基本 概念 驱动程序在操作系统中的位置 LINUX系统驱动概述设备驱动程序基本 概念 主设备号和次设备号 o主设备号标识设备对应的驱动程序 o一个驱动程序可以控制若干个设备,次设备号提供 了一种区分它们的方法 o系统增加一个驱动程序就要赋予它一个主设备号。 这一赋值过程在驱动程序的初始化过程中 int register_chrdev(unsigned int major, const char*name,struct *fops); LINUX系统驱动概述设备驱动程序基本 概念
6、 创建设备节点 o设备已经注册到内核表中,对于设备的访问通过设备文件(设备文 件与设备驱动程序的主设备号匹配),内核会调用驱动程序中的正 确函数 o给程序一个它们可以请求设备驱动程序的名字。这个名字必须插入 到/dev目录中,并与驱动程序的主设备号和次设备号相连 o使用mknod在文件系统上创建一个设备节点 LINUX系统驱动概述设备驱动程序基本 概念 主设备号和次设备号 在在/dev目录下使用目录下使用ll命令(命令(ls -l)可以查看各个设备的设备类型、主从设备号等)可以查看各个设备的设备类型、主从设备号等 LINUX系统驱动概述设备驱动程序基本 概念 创建设备节点 LINUX系统驱动概
7、述设备驱动程序基本 概念 动态分配设备号 o在Documentation/device.txt文件中可以找到已经静态分配给大部 分设备的列表 o由于许多数字已经分配了,为新设备选择一个唯一的号码是很困难的 o如果调用register_chrdev时的major为零,函数就会选择一个空闲 号码并做为返回值返回 LINUX系统驱动概述设备驱动程序基本 概念 动态分配的问题 动态分配的主设备号不能保证总是一样的,无法事先创建设备节点 o可以从/proc/devices读取 cat /proc/devices o利用脚本动态创建设备文件节点 LINUX系统驱动概述设备驱动程序基本 概念 设备管理的问题
8、 如今,Linux 支持很多不同种类的硬件。这意味着/dev中都有数百 个特殊文件来表示所有这些设备。而且,这些特殊文件中大多数甚至不 会映射到系统中存在的设备上 LINUX系统驱动概述设备驱动程序基本 概念 使用devfs o在Linux 2.4的内核里引入了devfs来解决 linux下设备文件管理的问题 o在驱动程序中通过devfs_register()函数创建设备文件系统的节点 o系统启动的时候mount设备文件系统 o所有需要的设备节点都由内核自动管理。 /dev目录下只有挂载的设备 LINUX系统驱动概述设备驱动程序基本 概念 Linux 2.6内核与udev oLinux 2.6
9、内核引入了sysfs文件系统为每个系统的硬件树进行分级处理 oDevfs在Linux 2.6中被标记为舍弃的特性(在Linux 2.6.15及以后的版本则取消了对 它的支持 ),而使用udev。 n维护动态设备 n从sysfs获得的信息,可以提供对特定设备的固定设备名。对于热插拔的设备, 这尤其重要 nudev 是在用户空间的脚本文件,这很容易被编辑和修改 n可以和hotplug脚本配合使用 o为了保证旧应用程序的兼容性,在嵌入式系统中,是用devfs还是一个好方法。即使在 Linux 2.6.15内核以后,也可以通过ndevfs(nano devfs)补丁提供对devfs特性的 兼容。 LI
10、NUX系统驱动概述设备驱动程序基本 概念 在Linux 2.6内核中使用udev o建议,在2.6.15以后的版本中使用udev o使用ramfs作为udev的载体 nmount t ramfs none /dev oudev使用的规则集位于/etc/udev/* oudev的官方地址: o参考文章:Writing udev rules LINUX系统驱动概述设备驱动程序基本 概念 设备驱动程序的接口 通常所说的设备驱动程序接口是指结构,它定义在include/linux/fs.h中。 struct struct module *owner; loff_t (*llseek) (struct
11、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 file *, struct poll_table_struct *); int (*ioctl) (struct inode *, struct
12、 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 *); int (*fsync) (struct file *, struct dentry *, int datasync); int (*fasync) (int, str
13、uct file *, int); int (*lock) (struct file *, int, struct *); ssize_t (*readv) (struct file *, const struct iovec *, unsigned long, loff_t *); ssize_t (*writev) (struct file *, const struct iovec *, unsigned long, loff_t *); ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, i
14、nt); unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long); ; LINUX系统驱动概述设备驱动程序基本 概念 结构体 struct demo_fops = 完成了将驱动函数映射为标准接口。 例如: static struct demo_fops = owner:THIS_MODULE, write:demo_write, read:demo_read, ioctl:demo_ioctl, open:demo_open, re
15、lease:demo_release, ; o上面的这种特殊表示方法不是标准C的语法,这是GNU编译器的一种特殊扩展, 它使用名字对进行结构字段的初始化,它的好处体现在结构清晰,易于理解, 并且避免了结构发生变化带来的许多问题。 LINUX系统驱动概述设备驱动程序基本 概念 结构体 o主要包括:open,close(或者release),read,write, ioctl,poll,mmap等 o结构体demo_fops将作为一个参数在注册一个设备驱动程序时 传递给内核。 o内核使用设备链表维护各种注册的设备。不同类型的设备使用 不同的链表。 LINUX系统驱动概述设备驱动程序基本 概念 设备
16、驱动程序的接口 Open接口:接口: Open接口提供给驱动程序初始化设备的能力,从而为以后的设备操接口提供给驱动程序初始化设备的能力,从而为以后的设备操 作做好准备,此外作做好准备,此外open操作一般还会递增使用计数,用以防止文件操作一般还会递增使用计数,用以防止文件 关闭前模块被卸载出内核。在大多数驱动程序中关闭前模块被卸载出内核。在大多数驱动程序中Open方法应完成如方法应完成如 下工作:下工作: o递增使用计数递增使用计数 o检查特定设备错误。检查特定设备错误。 o如果设备是首次打开,则对其进行初始化。如果设备是首次打开,则对其进行初始化。 o识别次设备号,如有必要修改识别次设备号,
17、如有必要修改f_op指针。指针。 o分配并填写分配并填写filp-private_data中的数据。中的数据。 LINUX系统驱动概述设备驱动程序基本 概念 设备驱动程序的接口 Release接口接口 : o与与open方法相反,方法相反,release 方法应完成如下功能:方法应完成如下功能: o释放由释放由open分配的分配的filp-private_data中的所有内容中的所有内容 o在最后一次关闭操作时关闭设备在最后一次关闭操作时关闭设备 o使用计数减一使用计数减一 LINUX系统驱动概述设备驱动程序基本 概念 设备驱动程序的接口 Read和和Write接口:接口: read 方法完成
18、将数据从内核拷贝到应用程序空间,方法完成将数据从内核拷贝到应用程序空间,write方法相反,方法相反, 将数据从应用程序空间拷贝到内核。由于用户空间和内核空间的内将数据从应用程序空间拷贝到内核。由于用户空间和内核空间的内 存映射方式完全不同,所以不能使用象存映射方式完全不同,所以不能使用象memcpy之类的函数,必须之类的函数,必须 使用如下函数使用如下函数 : ounsigned long copy_to_user (void *to,const void *from,unsigned long count); ounsigned long copy_from_user(void *to,c
19、onst void *from,unsigned long count); LINUX系统驱动概述设备驱动程序基本 概念 设备驱动程序的接口 ioctl接口:接口: ioctl方法主要用于对设备进行读写之外的其他控制,比如配置设备、方法主要用于对设备进行读写之外的其他控制,比如配置设备、 进入或退出某种操作模式,这些操作一般都无法通过进入或退出某种操作模式,这些操作一般都无法通过read/write 文件操作来完成文件操作来完成 oint (*ioctl) (struct inode *inode, struct file * int cmd, unsigned long arg) LINUX
20、系统驱动概述设备驱动程序基本 概念 注册中断函数 int request_irq(unsigned int irq, irqreturn_t (*handler)(int, void *, struct pt_regs *), unsigned long irq_flags, const char * devname, void *dev_id) oirq,中断向量号 ohandler,中断处理函数 oirq_flags,中断标志:SA_SHIRQ、SA_INTERRUPT、 SA_SAMPLE_RANDOM odevname,设备名 odev_id,设备id,可以为NULL。共享中断必须区分
21、。 LINUX系统驱动概述设备驱动程序基本 概念 注册的中断处理函数handler o系统所注册的中断处理子程序,中断产生时由系统来调用。原型为: irqreturn_t (*handler)(int irq, void *dev_id, struct pt_regs * regs) nirq,中断号 ndev_id,申请时告诉系统的设备标识 nregs,中断发生时寄存器内容 n返回值在include/linux/interrupts中定义为typedef int irqreturn_t。非零表示中断有效 LINUX系统驱动概述设备驱动程序基本 概念 释放中断 o卸载驱动程序时,需要注销相应的
22、中断处理程序,并释 放中断。 void free_irq(unsigned int irq, void *dev_id) LINUX系统驱动概述设备驱动程序基本 概念 linux驱动调试 oPrintk函数 printk函数中可以使用附加不同的日志级别或消息优先级 o运行时打印级别 cat /proc/sys/kernel/printk 上面显示的4个数据分别对应控制台日志级别、默认的消息日志级别、最低的控制台日 志级别和默认的控制台日志级别。 LINUX系统驱动概述设备驱动程序基本 概念 编译设备驱动程序 o使用静态内核模块 n在内核源代码目录的相应子目录下建立设备驱动程序目 录。 n在设备
23、驱动程序目录下建立Makefile文件。 n修改上一级目录的Makefile文件。 o使用动态内核模块 n内核模块需要使用内核的头文件,因此需要安装内核源 代码。 n编写Makefile。 LINUX系统驱动概述设备驱动程序基本 概念 版本依赖 驱动模块是紧密结合到一个特殊内核版本的数据结构和函数原 型上的 。 如果改变当前驱动模块针对的内核版本,需要重新编译驱动模 块。 驱动模块建立过程的其中一步是对当前内核树中的文件(称为 vermagic.o)连接进行检测; 其中的内容含有相当多的有关要 为其建立模块的内核的信息, 包括目标内核版本, 编译器版本, 以及许多重要配置变量的设置。 LINU
24、X系统驱动概述设备驱动程序基本 概念 设备驱动模块的加载 o设备驱动程序被静态编译到内核中的情况: module_init()宏是内核在启动过程中运行设备的初始化函数,驱动程序的加载随内核的启动一起完成。 静态编译的内核模块不能被动态卸载,只有到系统关闭时由内核执行相应的卸载函数,如 module_exit()。 o设备驱动程序被动态加载到内核中的情况: 首先,驱动程序需要被编译成目标文件,如demo.o或demo.ko。 在操作系统运行之后,使用insmod命令将驱动程序模块动态加载到内核中 $ insmod demo.ko 使用insmod命令动态加载的内核模块可以使用rmmod命令动态地
25、从内核中卸载 $ rmmod demo.ko 使用内核的动态模块加载/卸载功能需要内核支持kmod功能。 LINUX系统驱动概述设备驱动程序基本 概念 设备驱动程序的使用方法 o应用层使用open、close、read、write系统调用需要编写应用 程序 o使用系统命令可以进行最基本的测试: ncat /dev/urandom necho /dev/urandom /dev/fb0 ndd if=/dev/touchscreen of=/var/tmp/test bs=16 count=100 LINUX系统驱动概述设备驱动程序基本 概念 设备驱动程序的使用方法 LINUX系统驱动概述设备驱动程序基本 概念 Linux内核硬件驱动标准模板 #include #include #include stat
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 康复医联体分级诊疗中的患者依从性提升策略
- 辽宁省鞍山市2025-2026学年八年级上学期1月期末历史试卷
- 序贯治疗策略的精准优化方案
- 平衡训练对职业性腰背痛的康复价值
- 寻物启事课件介绍
- 寺庙知识分享
- 寺前镇消防安全培训课件
- 巨噬细胞极化失衡与COPD干细胞治疗的个体化策略
- 医用机器人辅助手术
- 屈光手术治疗儿童屈光参差性弱视的术后并发症预防策略
- GB/T 4706.27-2024家用和类似用途电器的安全第27部分:风扇的特殊要求
- DL-T-5728-2016水电水利工程控制性灌浆施工规范
- 体育教师招聘考试真题汇编(5套附答案)
- MH-T 5002-2020运输机场总体规划规范
- 审计署研究型审计案例
- 名著《红楼梦》知识考试题及答案
- 大气道狭窄护理课件
- 水电厂电气自动化监控系统功能分析
- DB11T 381-2023 既有居住建筑节能改造技术规程
- 计算机应用数学基础 教学 作者 王学军 计算机应用数学课件 第10章 图论
- DF6205电能量采集装置用户手册-2
评论
0/150
提交评论