LINUX设备驱动开发及内核原理

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
可能发生在进程中的系统调用时或者硬件中断 系统调用虽然在内核中执行,但是依然是在进程的上下文中进 行的,所以可以访问到进程中的数据。 中断处理和进程是异步的了,而且不和任何进程有关系
模块跨越两个空间,有两个触发入口
一些函数作为系统调用的一部分执行 一些函数负责中断处理
内核中的并发
Linux中字符设备与块设备的区别
内核内部对数据的组织和管理不同, 对驱动开发者来说透明 接口不同: 使用两套不同的interface
网络设备
网络接口: 能与其他主机通信的设备
它可以是硬件设备, 也可以是软件设备, 比如lo. (参考 TCP/IP详解p26) 网络接口只管收发数据包, 而不管这些数据包被什么协议 所使用 不同于字符设备和块设备, 网络接口没有对应的文件系统 节点. 虽然可以通过类似eth0这样的"文件名"来访问网络 接口, 但文件系统节点中却没有针对网络接口的节点 内核与网络接口之间的通信也不同于内核与字符/块设备 之间的通信(read, write), 它们之间使用特定的传输数据包 的函数调用
其他设备
也有一些module不能严格地划分类型.
USB module: 它工作在内核的USB子系统之上 实际的USB设备可以是字符设备, 块设备, 也可以 是网络接口
在设备驱动之外, 别的功能, 不论硬件和软 件, 在内核中都是模块化的
例如文件系统
日程安排
设备驱动简介 建立和运行模块
模块代码
static void __exit cleanup_function(void) { /* Cleanup code here*/ } module_exit(cleanup_function);
如何处理加载中的失败
int __init my_init_function(void) { int err; /* registration takes a pointer and a name */ err = register_this(ptr1, "skull"); if (err) goto fail_this; err = register_that(ptr2, "skull"); if (err) goto fail_that; err = register_those(ptr3, "skull"); if (err) goto fail_those; return 0; /* success */ fail_those: unregister_that(ptr2, "skull"); fail_that: unregister_this(ptr1, "skull"); fail_this: return err; /* propagate the error */ }
进程管理: 进程调度, 资源分配, 进程间通信. 内存管理: 其实也算是资源分配的一部分 文件系统: 管理, 组织物理媒介上数据的方法 设备控制: 设备驱动(ldd3所关注的) 网络: 实质上是进程间通信. 但它不局限于一个特 定的进程. 它关注收/发packets, 路由, 地址解析...
日程安排
设备驱动简介 建立和运行模块 字符驱动 调试技术 并发和竞争 高级字符驱动操作 时间,延时和延后工作 分配内存 与硬件通讯 中断处理 块设备驱动
日程安排
设备驱动简介
设备驱动简介
驱动是什么
Driver is a software layer that lies between the applications and the actual device
可以在一般文件中前后移动(lseek), 但只能顺序访问字符设备. 当然, 也有特例: frame grabbers.
块设备: 能支持文件系统的设备
传统的UNIX: 只能以block(512B)为单位访问块设备 Linux: 能以访问字符设备的方式访问块设备, 即以字节文单位访问 块设备.
建立和运行模块
建立开发环境
ldd3例子开发环境linux2.6.10 2.6驱动开发需要预先安装内核源码 源码需要从官方下载kernel.org 或者其他发行版的官方下载 直接解压到/usr/src目录下
版本影响
内核官方版本注意kernel.org 注意发行版的内部版本 最新内核版本linux2.6.20/21工作队列接口变化 小版本变动不会对驱动的架构造成太大影响 对于不同发行版,不同内核版本要做少量移植和测试
Kernel的结构
模块
可加载模块(lodable modules)
module: 可实时加载到内核中的代码, 它可动态 连接到内核(insmod, rmmod) 设备驱动就是module的代表, 但module还包括文 件系统等等.
设备和模块的分类
模块分为这些类型,每种类型的模块驱动 对应类型的设备
驱动程序的角色
提供机制, 而不是策略
隐藏在UNIX中的哲学
mechanism: What capabilities are provided. policy: How these capabilities can be used.
Kernel的作用
Kernel可划分为下列功能单元
应用程序很多时候是按照顺序来执行的 内核处于并发的执行环境当中
内核当中有并发的进程 中断需要响应和处理 内核中的服务也在运行 对称多处理器导致并行
百度文库
模块的加载卸载和查看
加载使用insmod 卸载使用rmmod 查看使用lsmod
模块代码
static int __init initialization_function(void) { /*initialization code here*/ } module_init(initialization_function);
内核模块VS应用程序
执行机制不同
模块初始化 模块退出 类似事件编程
使用库不一样
无法使用标准库 只能调用内核提供的函数
用户空间VS内核空间
用户空间VS内核空间
应用程序运行在用户空间 设备模块运行在内核空间 运行模式不一样 内存地址映射也不一样
用户空间和内核空间的转换
character module, block module, network interface other module
字符设备和块设备
字符设备: 以字节流的形式被访问的设备。e.g: /dev/console : 文本控制台. /dev/ttyS0 : 串口 它通过文件系统节点被访问. e.g: /dev/tty1, /dev/lp0 字符设备与一般文件(regular file)的区别
相关文档
最新文档