第四章 Linux驱动程序设计.ppt

合集下载

Linux字符设备驱动程序培训教材课件(PPT42页)

Linux字符设备驱动程序培训教材课件(PPT42页)

ruct list_head list; dev_t dev;
/*设备号*/
unsigned int count;
};
cdev的kobj、 list 、 count字段不用我们关系和维护(内核代 劳),我们只需将其ops字段指向为我们自己的file operations 结构。
Linux字符设备驱动程序培训教材(PPT 42页) 工作培 训教材 工作汇 报课件 管理培 训课件 安全培 训讲义P PT服务 技术
网络设备驱动:应用程序必须利用套接字(socket)接口访问 网络设备。
网络设备驱动程序
字符设备驱动程序基本结构
字符设备开发的基本步骤
确定主设备号和次设备号 实现字符驱动程序
实现file_operations结构体 构造字符设备结构体cdev 在模块加载函数中注册字符设备 在模块卸载函数中注销字符设备
Linux字符设备驱动程序培训教材(PPT 42页) 工作培 训教材 工作汇 报课件 管理培 训课件 安全培 训讲义P PT服务 技术
设备号的内部表达
设备编号的内部表达
dev_t类型(32位): 用来保存设备编号(包括主设备号(12位)和次设备 号(20位))
从dev_t获得主设备号和次设备号: MAJOR(dev_t); MINOR(dev_t);
Linux字符设备驱动程序
Linux驱动程序的分类
字符设备驱动:用于驱动能够像字节流(文件)一样被访问 的设备。应用程序通常可以利用open、close、read、write 等系统调用访问字符设备驱动。
块设备驱动:块设备和字符设备只在系统内核内部的管理上 有所区别。应用程序对于字符设备的每一个I/O操作都会被 内核直接传递给对应的驱动程序;而应用程序对于块设备的 操作要经过虚拟文件系统(VFS)和缓冲区管理系统间接地 传递给驱动程序处理。

最新Linux设备驱动开发ppt课件

最新Linux设备驱动开发ppt课件
结构体的每个域都对应着驱动模块用来处理某个被请求的事务的 函数的地址。
struct file_operations { struct module *owner; ssize_t(*read) (struct file *, char __user *, size_t, loff_t *); ssize_t(*write) (struct file *, const char __user *, size_t, loff_t *); 。。。
Linux设备驱动
Linux下设备的属性
设备的类型:字符设备、块设备、网络设备 主设备号:标识设备对应的驱动程序。一般“一个
主设备号对应一个驱动程序” 次设备号:每个驱动程序负责管理它所驱动的几个
硬件实例,这些硬件实例则由次设备号来表示。同 一驱动下的实例编号,用于确定设备文件所指的设 备。 可通过ls –l “设备文件名”命令查看设备的主次设 备号,以及设备的类型。
Gcc的语法扩展,使得可以定义该结构体: struct file_operations fops = {
read: device_read, write: device_write, open: device_open, release: device_release };
没有显示声明的结构体成员都被gcc初始化为NULL。
设备驱动概述
设备由两部分组成,一个是被称为控制器的电器部分, 另一个是机械部分。
一组寄存器组被赋予到各个控制器。I/O端口包含4组寄 存器,即状态寄存器,控制寄存器,数据输入寄存器, 数据输出寄存器。
状态寄存器拥有可以被CPU读取的(状态)位,用来 指示当前命 令是否执行完毕,或者字节是否可以被读出或写入,以及任何 错误提示。

LINUX设备驱动程序(4)

LINUX设备驱动程序(4)

协议简介
对于网络的正式介绍一般都采用 OSI (Open Systems Interconnection)模型, 但是Linux 中网络栈的介绍一般分为四层的 Internet 模型。
协议栈层次对比
OSI七层网络模型 应用层 表示层 会话层 传输层 网络层
数据链路层 物理层
Linux TCP/IP 四层概念模型
网络协议
网络协议层用于实现各种具体的网络协议, 如: TCP、UDP 等。
设备无关接口
设备无关接口将协议与各种网络设备驱动连接在一起。 这一层提供一组通用函数供底层网络设备驱动程序使用,让 它们可以对高层协议栈进行操作。
首先,设备驱动程序可能会通过调用 register_netdevice 或 unregister_netdevice 在内核中 进行注册或注销。调用者首先填写 net_device 结构,然后 传递这个结构进行注册。内核调用它的 init 函数(如果定义 了这种函数),然后执行一组健全性检查,并将新设备添加 到设备列表中(内核中的活动设备链表)。
驱动程序
网络栈底部是负责 管理物理网络设备 的设备驱动程序。
第二节 网卡驱动程序设计
设备注册
设备描述:
每个网络接口都由一个 net_device结构来描述
注册: 网络接口驱动的注册方式与字符驱动不同之处在于 它没有主次设备号,并使用如下函数注册。
int register_netdev(struct net_device *dev)
Linux网络子系统架构
Linux协议架构
Linux 网络子系统的顶部是系统调用接口。它为用 户空间的应用程序提供了一种访问内核网络子系统 的方法。位于其下面的是一个协议无关层,它提供 了一种通用方法来使用传输层协议。然后是具体协 议的实现,在 Linux 中包括内嵌的协议 TCP、 UDP,当然还有 IP。然后是设备无关层,它提供了 协议与设备驱动通信的通用接口,最下面是设备驱 动程序。

linux设备驱动程序开发课件(PPT 81页)

linux设备驱动程序开发课件(PPT 81页)

ARM及Thumb指令集
TM
19
19
驱动程序中涉及的几个概念
设备驱动程序的设备号和入口点
Linux 系统通过设备号来区分不同设备。设备号由两部分组 成:主设备号和次设备号。
主设备号标识设备对应的驱动程序。系统中不同的设备可以 有相同的主设备号,主设备号相同的设备使用相同的驱动程 序。
次设备号用来区分具体驱动程序的实例。一个主设备号可能 有多个设备与之对应,这多个设备正是在驱动程序内通过次 设备号来进一步区分的。次设备号只能由设备驱动程序使用 ,内核的其他部分仅将它作为参数传递给驱动程序。
两个数字对应 主设备号和次 设备号
TM
21
21
ARM及Thumb指令集
在/proc/devices 中列出了系统中处 于活动状态设备的 主设备号
TM
22
22
dev_t类型
dev_t类型
内核用dev_t类型来保存设备编号,dev_t是个32位的数,12位 表示主设备号,20为表示次设备号。在实际使用中,是通过中 定义的宏来转换格式。
在/proc/devices 中列出了系统中处于活动状态设备的主设备 号,所谓的活动状态是指与该设备对应的设备驱动已经被系 统内核装载。
ARM及Thumb指令集
TM
20
20
字符为c表示字 符设备,为b表 示块设备
ARM及Thumb指令集
/dev/
对于现有Linux 操作 系统,/dev 目录是必不 可少的,这个目录包含 了所有Linux 系统所知 道的字符设备,块设备 和网络设备
读取应用程序传送给设备文件的数据或者回送应用程序请求 的数据;
检测和处理设备出现的错误。
ARM及Thumb指令集

嵌入式Linux驱动程序开发PPT课件

嵌入式Linux驱动程序开发PPT课件

• 查询环节
– 寻址状态口 – 读取状态寄存器的标志位 – 若不就绪就继续查询,直至就绪
• 传送环节
– 寻址数据口 – 是输入,通过输入指令从数据口读入数据 – 是输出,通过输出指令向数据口输出数据
输入状态
N 就绪? Y 数据交换
第10页/共32页
8D
输入
锁存器
设备
+5V
D RQ
-STB
8位 三态 缓冲器
•服务结束后,又返回原 来的断点,继续执行原 来的程序
主程序
中断服务程序 入口
中断请求
程序 断点
提 供 服 务
为 外 设


执 返回断点

第13页/共32页
中断传送是一种效率更高的程序传送方式 进行传送的中断服务程序是预先设计好的 中断请求是外设随机向CPU提出的 CPU对请求的检测是有规律的:在每条指令 的最后一个时钟周期采样中断请求输入引脚
• I/O处理机——CPU委托专门的I/O处理机来管理 外设,完成传送和相应的数据处理
第1页/共32页
1、 无条件传送方式及其接口
• 在CPU与慢速变化的设备交换数据时,可以认为 它们总是处于“就绪”状态,随时可以进行数据 传送,这就是无条件传送,或称立即传送、同步 传送
• 适合于简单设备,如LED 数码管、按键/按纽等 • 无条件传送的接口和操作均十分简单 • 这种传送有前提:外设必须随时处于就绪状态
• CPU出让系统总线(输出高阻),由DMA控制器 (DMAC)接管系统总线
第17页/共32页
传送过程: ⑴ CPU对DMA控制器进行初始化设置 ⑵ 外设、DMAC、CPU, 3者通过应答信号建立联系:CPU将总线暂交

linux驱动21页PPT

linux驱动21页PPT
内核和网络驱动程序间的通讯完全不同于内核和字符设备以及 块设备驱动程序之间的通信,内核调用一套和数据包传输相关 的函数。
设备文件和设备驱动
设备文件和设备驱动
设备文件是文件系统上的一个 节点,是一种特殊的文件,叫 做设备文件。每个设备文件在 用户空间代表了一个设备。
设备文件一般存在/dev目录下, 用mknod命令创建。
/proc/ioports:查看设备的IO端口。 /proc/interrupts:查看正在使用的中断号。
构造和运行模块
Kernel Module的特点
模块只是预先注册自己以便服务于将来的某个请求,然后就立即 结束。
模块可以是实现驱动程序,文件系统,或者其他功能。 加载模块后,模块运行在内核空间,和内核链接为一体。
#include <linux/module.h>
int init_module(void) {
printk("<1>Hello, world\n"); return 0; } void cleanup_module(void) { printk("<1>Goodbye world\n"); }
简单的内核模块例子(2)
SUMMER TEMPLATE
linux驱动
Linux Kernel 系统架构图
设备驱动程序简介
驱动程序的特点
是应用和硬件设备之间的一个软件层 。
这个软件层一般在内核中实现
设备驱动程序的作用在于提供机制,而不是提供策略, 编写访问硬件的内核代码时不要给用户强加任何策略
○ 机制:驱动程序能实现什么功能。
1version>/modules.dep文件,其中<kernel version>

Linux设备驱动程序课件(PPT 62页).ppt

Linux设备驱动程序课件(PPT 62页).ppt

一些重要的数据结构
索引节点inode结构
Inode结构包含大量描述文件信息的成员变量。 但是对于描述设备文件的inode,跟设备驱动有关
的成员只有两个。 Dev_t i_rdev; 包含真正的设备编号。 Struct cdev *i_cdev; 指向cdev结构体的指针。
cdev是表示字符设备的内核数据结构。 从inode中获得主设备号和次设备号的宏:
一些重要的数据结构
file_operations重要的成员
驱动内核模块是不需要实现每个函数的。相对应的 file_operations的项就为 NULL。
Gcc的语法扩展,使得可以定义该结构体: struct file_operations fops = {
read: device_read, write: device_write, open: device_open, release: device_release };
设备文件: 任何设备都被当作路径/dev 的设备文件处理,并通 过这些设备文件提供访问硬件的方法。 每个设备文件除了设备名外,还有类型、主设备号、 次设备号这三个属性。 设备文件是通过mknod系统调用创建的。其原型为: mknod(const char * filename, int mode, dev_t dev) mknod /dev/led0 c 253 0
Linux设备驱动
广州嵌入式软件公共技术支持中心
2007年07月
设备驱动概述
操作系统是通过各种驱动程序来驾驭硬件设备,它为 用户屏蔽了各种各样的设备,硬件设备的抽象。
设备驱动程序:处理和管理硬件控制器的软件。 设备驱动程序是操作系统内核和机器硬件之间的接口。

Linux驱动课件

Linux驱动课件

• 写时拷贝 写时拷贝优化了进程的执行速度。
3.2.2 fork()
fork() vfork() _clone() clone() do_fork() copy_process()
• copy_process()的工作过程:
– 调用dup_task_struct()为新进程创建内核栈、thread_info和 task_struct,此时子进程和父进程的描述符相同; – 检测新进程是否超出资源分配的限制; – 进程描述符内的成员要被初始化,以区别父子进程; – 子进程的状态被设置为TASK_UNINTERRUPTIBLE; – copy_process()调用copy_flags()以更新task_struct()的flags成 员; – 拷贝资源; – 父子进程平分剩余时间片; – copy_process()返回指向子进程的指针。
第三章
进程管理
进程的定义
进程是处于执行期的程序以及它所包含的资源的总称。
3.1进程的描述符及任务结构 进程的描述符及任务结构
分配进程描述符 进程描述符的存放 进程状态 设置当前进程状态 进程上下文 进程家族树
• • • • • •
3.1.1分配进程描述符 分配进程描述符
• 内核把进程存放在叫做任务队列的双向循环链表中,链表 中的每一项都是类型task_struct——进程描述符的结构。 • Linux通过slab分配task_struct结构。 • thread_info有一个指向进程描述符的指针。 • 每个任务的thread_info结构在他的内核栈的尾部分配。
list_for_each(list,&current->children) { task=list_entry(list,struct task_struct,sibling); } 所有进程之间的关系可以表示为: struct task_struct *task; for(task = current; task !=&init_task; task = task->parent)

Linux驱动程序设计.ppt

Linux驱动程序设计.ppt
设备分类
块设备:一般块设备都有缓存支持,并且支持随机 存取
创建的块设备
硬盘 软盘 ramdisk
ChavezWang@
嵌入式系统研究室
5
设备驱动的基本原理-4
设备分类
网络设备:从BSD UNIX网络组件移植而来。网络 设备没有对应地映射到文件系统的设备节点。在 Linux中,网络设备的访问采用Socket机制实现
注册Linux设备号的方法
为避免不同的驱动程序具有相同的设备号,需要 提供一种分配设备号的机制
1. 每个驱动程序分配一个主设备号:不可行,Linux最多 支持255个主设备
2. 根据/proc/devices中的对应关系,用脚本动态的创建设 备文件:太麻烦,程序员不愿意
3. 设备文件系统自动管理
ChavezWang@
嵌入式系统研究室
6
设备驱动的基本原理-5
设备号:Linux采用主设备号和次设备号来标志 一个具体设备。
主设备号用来标志设备类型 次设备号用来区分不同的具体设备
系统创建一个设备驱动程序时,设备驱动需要 使用一个主设备号向内核注册此驱动。创建一 个设备节点的方法:
mknod 设备名 设备类型 主设备号 次设备号 例:mknod ttyS0 c 64 4
ChavezWang@
嵌入式系统研究室
7
设备驱动的基本原理-6-内核模块
内核模块的概念:内核模块是一些可以让操作 系统内核在需要时载入和执行的代码,不Байду номын сангаас要 时可以从操作系统中卸载
内核模块是Linux内核运行时动态扩展的一种 技术,可以在Linux内核运行期间向内核动态 添加代码,扩展内核的功能
加入新驱动到内核源码树时,需要修改相应目录的 kconfig,将新驱动加入内核的配置菜单,同时需要 修改makefile文件

第四章 LED驱动程序 Linux设备驱动程序 教学课件

第四章 LED驱动程序 Linux设备驱动程序 教学课件
另外,在驱动程序中还需调用devfs_register在 /dev目录下创建设备文件节点,作为应用程序 访问设备的入口。
目录
嵌入式Linux字符设备的驱动程序结构 设备驱动程序中的问题 GPIO原理介绍 LED的驱动程序实例及测试
I/O端口
驱动程序是介于操作系统和系统硬件之间 的负责通信的接口,它把软件和硬件分开, 其作用如图:
作。如清除缓冲区。如果设备是独占的,则open函 数必须将设备标记成忙状态。
Close入口点
Close函数负责关闭设备的操作。 当最后一次使用设备完成后,调用close函数,关闭
设备文件。独占设备必须标记为可再次使用。
字符设备驱动程序的入口
Read入口点
Read函数负责从设备上读数据和命令,有缓冲区的 I/O设备操作一般是从缓冲区里读数据。
loff_t * f_ops) {
return count; }
// ------------------- WRITE ----------------------ssize_t GPIO_LED_write (struct file * file ,const char * buf, size_t
这些通用的GPIO接口是可配置的。每个端口都可以通 过软件配置寄存器来满足不同系统和设计的需要。在运 行主程序之前,必须先对每一个用到的引脚的功能进行 设置。如果某些引脚的复用功能没有使用,那么可以先 将该引脚设置为I/O端口。
S3C2410X芯片与端口相关的寄存器
端口控制寄存器(GPACON—GPHCON)
Linux的设备文件是同硬件一一对应的,因而对设备的 操作可以通过对设备文件的操作来实现。而这些操作方 式其实就是一些标准的系统调用,如open()、read()、 write()、close()等。实际上,file_operations就是把系 统调用和驱动程序关联起来的关键数据结构。这个结构 的每个成员都对应着一个系统调用。

Linux程序设计PPT课件

Linux程序设计PPT课件

Linux各大发行版(续)
Slackware
Slackware由Patrick Volkerding创建于 1992年。算起来应当是历史最悠久的Linux 发行版。Slackware依然固执的追求最原始 的效率——所有的配置均还是要通过配置 文件来进行。 优点:非常稳定、安全,高度坚持UNIX的 规范 缺点:所有的配置均通过编辑文件来进行, 自动硬件检测能力较差
16
Linux发展历史(续)
2007年11月,Google宣布组建开放手机联盟(Open Handset Alliance)和发布Android,它被称为“第一个真正 开放的综合移动设备平台”。
2011年5月,Google I/O大会发布了Chrombook。这是一 款运行着所谓云操作系统Chrome OS的笔记本。Chome OS是基于Linux内核的。
优点:拥有数量庞大的用户,优秀的社区技 术支持,许多创新 缺点:免费版(Fedora Core)版本生命周期 太短,多媒体支持不佳
18
Linux各大发行版(续)
SUSE
SUSE是德国最著名的Linux发行版,在全 世界范围中也享有较高的声誉。SUSE自 主开发的软件包管理系统YaST也大受好评。 SUSE于2003年年末被Novell收购。 优点:专业,易用的YaST软件包管理系 统 缺点:FTP发布通常要比零售版晚1~3个 月
23
Linux各大发行版(续)
CentOS CentOS,也叫做社区企业操作系统,是企业Linux发 行版领头羊Red Hat Enterprise Linux的再编译版本。 RHEL是很多企业采用的Linux发行版本,但是如果 想得到RedHat的服务与技术支持,用户必须向Red Hat付费才可以。CentOS的开发者们使用Red Hat Linux的源代码创造了一个和RHEL近乎相同的Linux。 但是一切和RedHat有关的商标都被去除了。CentOS 是免费的,可以使用它像使用RHEL一样去构筑企业 级的Linux系统环境,但不需要向RedHat付任何的费 用。目前,CentOS的技术支持主要通过社区的官方 邮件列表、论坛和聊天室来提供。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
printk(KERN_ALERT " Hello world exit\n"); } module_init(hello_init); module_exit(hello_exit);
模块初始化 宏
模块卸载宏
2019年12月24日
21
打印调试printk
指示日志级别的宏 KERN_EMERG 用于紧急事件消息,一般是系统崩溃前提示<0>
块设备通过位于 /dev 目录的文件系统结点来存取
块设备和字符设备的区别仅仅在于内核内部管理数据的 方式
块设备有专门的接口,块设备的接口必须支持挂装 (mount)文件系统。
应用程序一般通过文件系统来访问块设备上的内容
2019年12月24日
17
4-2设备的分类和特点
网络设备特点
简单的内核模块编译(内核2.6)
如果是多个源文件编译出一个模块,假设模块名是test.ko, 那么源文件名不能有test.c
obj-m := test.o
test-objs := file1.o file2.o file3.o
KDIR := /home/at9200/kernel/linux-2.6.38/
(4)应用程序得到文件描述符后,使用库提供的write 或ioclt函数发出控制命令 (5)库根据write或ioclt函数传入的参数执行“swi”指令, 这条指令会引起CPU异常,再次进入内核 (6)内核的异常处理函数根据参数调用驱动程序的相关 函数,控制硬件
4-2设备的分类和特点
块设备特点
static int __init hello_init(void) {
printk(KERN_ALERT "Hello world\n");
用法类似于printf, 但它有优先级(比如
KERN_ALERT)
return 0; }
宏,告诉内核这两个函数只会 在加载和卸载模块时使用
static void __exit hello_exit(void) {
教学内容
第一章 嵌入式系统概述 第二章 学习板硬件及开发环境的建立 第三章 构建嵌入式Linux系统 第四章 嵌入式Linux设备驱动 第五章 嵌入式Linux串口和网络编程 第六章 嵌入式Linux图形编程
2019年12月24日
1
第四章 嵌入式Linux驱动程序
4.1 嵌入式Linux设备驱动简介 4.2 设备的分类及特点 4.3 构造和运行驱动程序模块
2019年12月24日
8
内核态和用户态
大多数OS(包括Linux)把内核和运行在其上的应用程 序分为两个层次管理,即用户态和内核态
内核态有较高的权限,可以控制处理器内存的映射和分 配方式等等————对应于ARM的svc模式
用户态:只能运行系统上的应用程序————对应于 ARM的usr模式
内核态与用户态切换:可通过软件中断实 现
2019年12月24日
3
本章目标
了解Linux设备驱动程序的基础知识 掌握Linux驱动模块的构造和装载方法
2019年12月24日
4
本章结构
Linux驱动程序概述
2019年12月24日
设备驱动程序简介
设备的分类和特点 构造和运行模块
字符设备 块设备
网络设备 设备驱动的Hello World模块 内核驱动模块和应用程序对比
module_exit()---模块卸载函数(必须) 当通过rmmod命令卸载某模块时,模块的卸载函数会 自动被内核执行,完成与模块装载函数相反的功能
2019年12月24日
28
4-3-1 设备驱动的Hello World模块
MODULE_LICENSE()---模块许可证声明(必须) 模块许可证(LICENSE)声明描述内核模块的许可权 限 如果不声明LICENSE,模块被加载时,将收到内核被 污染(kernel tainted)的警告 包括:“GPL”、 “GPL v2”、 “GPL and additional rights”、 “Dual BSD/GPL”、“Dual MPI/GPL”、 “Proprietary”
通过单独的网络接口来访问
任何一个网络事务都通过一个网络接口访问,即一个能 够和其他主机交换数据的设备。
网卡 软件设备:环回接口(loopback)
内核调用一套和数据包传输相关的函数
2019年12月24日
18
4-3 构造和运行模块
驱动程序加入内核的方法
把所有需要的功能都编译到内核中 生成的内核镜像(Image)文件会很大
insmod 将模块动态加载到正在运行内核 rmmod 程序移除模块
2019年12月24日
20
4.3.1 设备驱动的Hello World模块
#include <linux/init.h> #include <linux/module.h>
自由许可证
MODULE_LICENSE("Dual BSD/GPL");
make -C $(KDIR) M=$(PWD) clean
简单的内核模块编译(内核2.6)
obj-m := led_drv.o表示编译后生成 led_drv.ko模块
$(KDIR) 指定了target内核源码的路径, “M=”表示这是个外部模块,M=$(PWD) 指定了该模块文件所在的路径。
2019年12月24日
29
4-3-1 设备驱动的Hello World模块
模块加载函数
static int __init initialization_function(void)
{ /* 初始化代码 */
}
应当声明成静态的 (static), 因为它们不 会在特定文件之外可见
module_init(initialization_function);
如果我们要在现有的内核中新增或删除功 能,将不得不重新编译和装载内核。
2019年12月24日
19
4-3 驱动程序加入内核的方法
Linux提供了机制被称为模块(Module)的 机制
提供了对许多模块支持, 包括但不限于, 设备驱动
每个模块由目标代码组成( 没有连接成一个完整可执行程 序)
2019年12月24日
30
4-3-1 设备驱动的Hello World模块
模块卸载函数
static void __exit cleanup_function(void在释)模放块所被 有移所除占前用注的销系接统口资并源 {
/* 释放资源 */ } module_exit(cleanup_function);
KERN_ALERT 用于需要立即采取动作<1>
KERN_CRIT 临界状态,通常涉及到严重的硬件或软件操作失败<2>
KERN_ERR 用于报告错误状态,设备驱动程序会经常使用其来报告来自硬 件的问题<3>
KERN_WARNING 用于对可能出现的问题进行警告<4>
KERN_NOTICE 用于有必要进行提示的正常情况<5>
内核态和用户态
驱动程序作为系统内核的一部分,其工作在内核态,而 应用程序工作在用户态,即不能直接通过指针,把用户空 间的数据地址传递给内核(MMU映射地址不一样)。
需要经过转换,把用户态“看到的空间”转换成内核态 可访问的地址。Linux系统提供了一系列方便的函数实现 这种转换,如:__get_user、__put_user、 •__copy_from_user、__copy_to_user
高回报
2019年12月24日
7
4-1设备驱动程序简介
驱动程序的特点
操控硬件,是应用程序和硬件设备之间的一 个接口
隐藏硬件细节,提高应用软件的可移植性 提供安全性 开发模式
内核态驱动 用户态驱动
提供机制,而不是提供策略
机制:驱动程序能实现什么功能 策略:用户如何使用这些功能
表明该函数只是在初始化时使用。模块加载器在模块加 载后会丢掉这个初始化函数, 这样可将该函数占用的内存 释放出来,以作他用。
原型:#define __init __attribute__ ((__定se义cti会on在__(模“.i块nit目.te标xt”代)))码中增加一个特殊的 段, 用于说明内核模块初始化函数所在的位 置。没有这个定义, 初始化函数不会被调用。

称为系统调用,执行
其他库函数的实现
swi指令进入内核
内核
系统调用的异常处理
其他功能
驱动程序 open read write ioctl ቤተ መጻሕፍቲ ባይዱ…
物理设备控制器 物理设备
4层软件关系说明
(1)应用程序使用库函数提供的open函数打开设备文 件
(2)库根据open函数传入的参数执行“swi”指令,引起 CPU异常,进入内核 (3)内核的异常处理函数根据这些参数找到相应的驱动 程序,返回一个文件描述符给库,进而返回给应用程序
2019年12月24日
2
课程目标
掌握嵌入式Linux设备驱动程序的基本原 理、架构和设计方法
字符设备驱动 块设备驱动 网络设备驱动
掌握Linux设备驱动开发中常用的机制和 内核资源
中断顶/底半部处理 内核定时器和延时操作 并发控制在内核中的应用 内存管理和分配 阻塞型I/O和非阻塞型I/O
PWD := $(shell pwd)
all:

make -C $(KDIR) M=$(PWD) modules
clean:
相关文档
最新文档