Linux设备驱动程序学习----1.设备驱动程序简介
设备驱动程序简介
更多内容请参考Linux设备驱动程序学习----目录
1. 简介
Linux系统的优点是,系统内部实现细节对所有人都是公开的。Linux内核由大量复杂的代码组成,设备驱动程序可以作为进入Linux内核世界大门的切入口。
设备驱动程序在Linux内核中,是一个个独立的黑盒子,在调用内部接口时某个特定硬件做出响应,这些接口隐藏了设备的工作细节。用户的操作通过独立于特定驱动程序的一组标准化调用执行,将这些调用映射到作用于实际硬件的设备特有操作上,是设备驱动程序的任务。
模块化的特点使得Linux驱动程序的编写非常方便简单。
2. 设备驱动程序的作用
设备驱动程序的作用在于提供机制,而不是提供策略。
区分机制和策略是Unix设计背后隐含的最好思想之一。大部分编程问题都可以分成两部分:
机制:需要提供什么功能
策略:如何使用这些功能
我们应当尽可能做到让驱动程序不带策略。
编写驱动程序时,特别注意:编写访问硬件的内核代码时,不要给用户强加任何特定策略。因为不同的用户有不同的需求,驱动程序应该处理如何使硬件可用的问题,而将怎样使用硬件的问题留给应用程序。
驱动程序可以看作是应用程序和实际设备之间的一个软件层。
驱动程序设计要综合考虑下面三个问题的因素:提供给用户尽量多的选项、编写驱动程序要占用的时间、尽量保持程序简单。
3. 内核功能划分
根据内核完成任务的不同,内核功能分为如下几个部分:
进程管理
负责创建和销毁进程,并处理它们和外部世界之间的连接。如进程之间的通信,控制进程如何共享CPU的调度器等。
内存管理
内存是计算机的主要资源之一,用来管理内存的策略是决定系统性能的一个关键因素。内核在有限的可用资源上为每个进程创建一个虚拟地址空间。
文件系统
Unix中的每个对象几乎都可以当作文件来看待。内核可以在没有结构的硬件上构造结构化的文件系统。
设备控制
几乎每一个系统操作最终都会映射到物理设备上。几乎所有设备操作都由驱动程序来完成。内核必须为系统中的每个外设嵌入相应的驱动程序。
网络功能
大部分网络操作和具体进程无关,网络功能必须由操作系统管理。系统负责在应用程序和网络接口之间传递数据包,并根据网络活动控制程序的执行。所有的路由和地址解析都由内核处理。
可装载模块
Linux有个很好的特性,内核提供的特性可在运行时扩展,即系统启动并运行时,可以以模块的形式,向内核添加、移出功能。
4. 设备和模块分类
Linux系统将设备分为三种基本类型,字符设备模块、块设备模块、网络设备模块。
字符设备
字符设备是个能像字节流一样被访问的设备,类似文件。比如:字符终端(/dev/console)和串口(/dev/ttys0)
设备文件和普通文件的唯一差别是,对普通文件的访问可以前后移动访问位置,而大多数字符设备是一个个只能顺序访问的数据通道。除个别例外。
块设备
块设备是按照块进行读写的设备,一次只能传输一个或多个完整的块,一个块一般是512字节,或2的更高次幂字节的数据。
块设备上能够容纳文件系统。
网络设备
网络设备是一个能够和其他主机交换数据的设备,通常,接口是个硬件设备,也可能是个纯软件设备,比如回环接口(loopback)。
网络设备由内核中的网络子系统驱动,负责发送和接收数据包。
除了设备驱动程序外,内核中其他一些功能,不管是硬件还是软件功能,都模块化了。如常见的文件系统。。。
5. 安全问题
系统中的所有安全检查都是由内核代码进行的,如果内核有安全漏洞,则整个系统就有安全漏洞。
驱动程序编写者应当尽量避免在代码中实现安全策略。
驱动程序编写者应当避免由于自身原因引入安全方面的缺陷。
任何从用户进程得到的输入只有经过内核严格验证后才能使用。必须小心对待未初始化的内存,任何从内核中得到的内存,都必须在提供给用户进程或者设备之前清零或者以其他方式初始化,否则可能发生信息泄露。
Linux内核也可编译为不支持模块方式,从而可以关闭任何模块相关的安全漏洞。此时,所有需要的驱动程序必须直接编译到内核中。
6. 版本编号
对内核来讲,偶数编号的内核版本(如2.6.x)是用于正式发行的稳定版本,而奇数编号的版本(如2.7.x)则是开发过程中的一个快照。
更多内容请参考Linux设备驱动程序学习----目录
Linux设备驱动程序学习----1.设备驱动程序简介的更多相关文章
- Linux设备驱动程序学习 高级字符驱动程序操作[阻塞型I/O和非阻塞I/O]【转】
转自:http://blog.csdn.net/jacobywu/article/details/7475432 阻塞型I/O和非阻塞I/O 阻塞:休眠 非阻塞:异步通知 一 休眠 安全地进入休眠的两 ...
- Linux C编程学习之C语言简介---预处理、宏、文件包含……
C的简介 C语言的结构极其紧凑,C语言是一种模块化的编程语言,整个程序可以分割为几个相对独立的功能模块,模块之间的相互调用和数据传递是非常方便的 C语言的表达能力十分强大.C语言兼顾了高级语言和汇编语 ...
- Linux设备驱动程序学习----目录
目录 设备驱动程序简介 1.设备驱动程序简介 构造和运行模块 2.内核模块和应用程序的对比 3.模块编译和装载 4.模块的内核符号表 5.模块初始化和关闭 6.模块参数 7.用户空间编写驱动程序 ...
- Linux设备驱动程序学习之分配内存
内核为设备驱动提供了一个统一的内存管理接口,所以模块无需涉及分段和分页等问题. 我已经在第一个scull模块中使用了 kmalloc 和 kfree 来分配和释放内存空间. kmalloc 函数内幕 ...
- Linux设备驱动程序学习----2.内核模块与应用程序的对比
内核模块与应用程序的对比 更多内容请参考Linux设备驱动程序学习----目录 1. 内核模块与应用程序的对比 内核模块和应用程序之间的不同之处: 大多数中小规模的应用程序是从头到尾执行单个任务,而模 ...
- Linux设备驱动程序学习----3.模块的编译和装载
模块的编译和装载 更多内容请参考Linux设备驱动程序学习----目录 1. 设置测试系统 第1步,要先从kernel.org的镜像网站上获取一个主线内核,并安装到自己的系统中,因为学习驱动程序的编写 ...
- Linux内核入门到放弃-设备驱动程序-《深入Linux内核架构》笔记
I/O体系结构 总线系统 PCI(Peripheral Component Interconnect) ISA(Industrial Standard Architecture) SBus IEEE1 ...
- USB设备驱动程序学习笔记(一)
现象:把USB设备接到PC1. 右下角弹出"发现android phone"2. 跳出一个对话框,提示你安装驱动程序 问1. 既然还没有"驱动程序",为何能知道 ...
- Linux设备驱动程序 之 主次设备号
主设备号和次设备号 对字符设备的访问是通过文件系统内的设备名称进行的,这些名称被称为特殊文件.设备文件.或者简单称之为文件系统树的节点,它们通常位于/dev目录.字符设备驱动程序的设备文件可以通过ls ...
随机推荐
- 浅析C#代理
delegate 是委托声明的基础,是.net 的委托的声明的关键字action 是基于delegate实现的代理 有多个参数(无限制个数)无返回值的代理 func 是基于delegate实现的代理 ...
- MongoDB自学日记3——架构及HA
在对mongoDB的操作有了一定基础后,终于可以扯扯HA和架构这两个高大上的概念了.在这之前当然还得弄清楚mongoDB的Key feature:Sharding. 1. Sharding Shard ...
- HTML连载11-HTML中被废弃的标签&字符实体
一.为什么会有被废弃的标签 答:HTML中以前存在一部分不是用来添加语义的标签,而与我们HTML标签是用来添加语义的,这与我们的定义不相符. 例如: 1.标签<br>:换行 2.标签&l ...
- comboBox控件动态绑定数据
/// <summary> /// load加载数据 /// </summary> /// <param name=" ...
- Linux上vim的使用
.........以下是我在使用vim时的操作经验........... (首先要了解vim主要是命令模式,输入模式,可视化模式,主要区别就是在不同模式下可以完成不同的操作,只是个编辑器,没有必要太纠 ...
- sqlserver/mysql按天,按小时,按分钟统计连续时间段数据
文 | 子龙 有技术,有干货,有故事的斜杠青年 一,写在前面的话 最近公司需要按天,按小时查看数据,可以直观的看到时间段的数据峰值.接到需求,就开始疯狂百度搜索,但是搜索到的资料有很多都不清楚,需要自 ...
- Android前沿技术
一.热升级Tinker源码解析与手写二.热修复阿里百川Sophix内核原理三.App Instantgoogle8.0 类似热更新技术原理与实战四.强制更新1.银行应用非对称加密对称加密五.组件化框架 ...
- 系统学习 Java IO (六)----管道流 PipedInputStream/PipedOutputStream
目录:系统学习 Java IO---- 目录,概览 PipedInputStream 类使得可以作为字节流读取管道的内容. 管道是同一 JVM 内的线程之间的通信通道. 使用两个已连接的管道流时,要为 ...
- tar 命令参数解释
tar 命令 tar [-cxtzjvfpPN]文件与目录参数说明:-c :建立一个打包文件:-x :解开一个打包文件:-t :查看 tar包里面的文件:(特别注意,在选择参数时,c/x/t仅能存在一 ...
- 01-Javascript基础
一. JS介绍 JavaScript是前台语言 JavaScript是前台语言,而不是后台语言. JavaScript运行在用户的终端网页上,而不是服务器上,所以我们称为“前台语言”. JavaScr ...