Linux驱动程序设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
вторник, 19 мая 2020 г.
4-3 驱动程序加入内核的方法
Linux提供了机制被称为模块(Module)的 机制
提供了对许多模块支持, 包括但不限于, 设备驱动
每个模块由目标代码组成( 没有连接成一个完整可执行程 序)
insmod 将模块动态加载到正在运行内核 rmmod 程序移除模块
вторник, 19 мая 2020 г.
本章目标
了解Linux设备驱动程序的基础知识 掌握Linux驱动模块的构造和装载方法
вторник, 19 мая 2020 г.
本章结构
Linux驱动程序概述
设备驱动程序简介
设备的分类和特点 构造和运行模块
字符设备 块设备
网络设备 设备驱动的Hello World模块 内核驱动模块和应用程序对比
编译和装载驱动模块
вторник, 19 мая 2020 г.
驱动程序的作用
操作系统

write

ioctl


read
驱 动 程 序
硬 件 设 备
ioctl
为什么要学嵌入式Linux驱动程序开发?
高需求
内核代码的大部分 新芯片、新设备
高门槛
需要具有硬件知识 需要了解内核基础知识 需要了解内核中的并发控制和同步 复杂的软件结构框架
统调用 只能顺序访问数据通道,不能前后移动访问指针。
特例:比如framebuffer设备就是这样的设备,应 用程序可以使用mmap或lseek访问图像的各个区 域
вторник, 19 мая 2020 г.
Linux内核结构
Linux内核结构
应用程序、库、内核、驱动程序的关系
应用程序
open read write ioctl ……调用其他库函数
教学内容
第一章 嵌入式系统概述 第二章 学习板硬件及开发环境的建立 第三章 构建嵌入式Linux系统 第四章 嵌入式Linux设备驱动 第五章 嵌入式Linux串口和网络编程 第六章 嵌入式Linux图形编程
вторник, 19 мая 2020 г.
第四章 嵌入式Linux驱动程序
4.1 嵌入式Linux设备驱动简介 4.2 设备的分类及特点 4.3 构造和运行驱动程序模块
网卡 软件设备:环回接口(loopback)
内核调用一套和数据包传输相关的函数
вторник, 19 мая 2020 г.
wenku.baidu.com
4-3 构造和运行模块
驱动程序加入内核的方法
把所有需要的功能都编译到内核中 生成的内核镜像(Image)文件会很大 如果我们要在现有的内核中新增或删除功 能,将不得不重新编译和装载内核。
高回报
вторник, 19 мая 2020 г.
4-1设备驱动程序简介
驱动程序的特点 操控硬件,是应用程序和硬件设备之间的一
个接口
隐藏硬件细节,提高应用软件的可移植性 提供安全性 开发模式
内核态驱动 用户态驱动
提供机制,而不是提供策略
机制:驱动程序能实现什么功能 策略:用户如何使用这些功能
вторник, 19 мая 2020 г.
课程目标
掌握嵌入式Linux设备驱动程序的基本原 理、架构和设计方法
字符设备驱动 块设备驱动 网络设备驱动
掌握Linux设备驱动开发中常用的机制和 内核资源
中断顶/底半部处理 内核定时器和延时操作 并发控制在内核中的应用 内存管理和分配 阻塞型I/O和非阻塞型I/O
4-2设备的分类和特点
设备分类
字符设备(char device) 块设备(block device) 网络设备(network device)
вторник, 19 мая 2020 г.
4-2设备的分类和特点
字符设备特点
像字节流一样来存取的设备( 如同文件 ) 通过/dev下的文件系统结点来访问。 通常至少需要实现 open, close, read, 和 write 等系

称为系统调用,执行
其他库函数的实现
swi指令进入内核
内核
系统调用的异常处理
其他功能
驱动程序 open read write ioctl ……
物理设备控制器 物理设备
4层软件关系说明
(1)应用程序使用库函数提供的open函数打开设备文 件
(2)库根据open函数传入的参数执行“swi”指令,引起 CPU异常,进入内核 (3)内核的异常处理函数根据这些参数找到相应的驱动 程序,返回一个文件描述符给库,进而返回给应用程序
内核态与用户态切换:可通过软件中断实 现
内核态和用户态
驱动程序作为系统内核的一部分,其工作在内核态,而 应用程序工作在用户态,即不能直接通过指针,把用户空 间的数据地址传递给内核(MMU映射地址不一样)。
需要经过转换,把用户态“看到的空间”转换成内核态 可访问的地址。Linux系统提供了一系列方便的函数实现这 种转换,如:__get_user、__put_user、 •__copy_from_user、__copy_to_user
вторник, 19 мая 2020 г.
内核态和用户态
大多数OS(包括Linux)把内核和运行在其上的应用程序 分为两个层次管理,即用户态和内核态
内核态有较高的权限,可以控制处理器内存的映射和分 配方式等等————对应于ARM的svc模式
用户态:只能运行系统上的应用程序————对应于 ARM的usr模式
(4)应用程序得到文件描述符后,使用库提供的write 或ioclt函数发出控制命令 (5)库根据write或ioclt函数传入的参数执行“swi”指令, 这条指令会引起CPU异常,再次进入内核 (6)内核的异常处理函数根据参数调用驱动程序的相关 函数,控制硬件
4-2设备的分类和特点
块设备特点
块设备通过位于 /dev 目录的文件系统结点来存取
块设备和字符设备的区别仅仅在于内核内部管理数据的 方式
块设备有专门的接口,块设备的接口必须支持挂装 (mount)文件系统。
应用程序一般通过文件系统来访问块设备上的内容
вторник, 19 мая 2020 г.
4-2设备的分类和特点
网络设备特点
通过单独的网络接口来访问
任何一个网络事务都通过一个网络接口访问,即一个能 够和其他主机交换数据的设备。
相关文档
最新文档