设备驱动程序简介

更多内容请参考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.设备驱动程序简介的更多相关文章

  1. Linux设备驱动程序学习 高级字符驱动程序操作[阻塞型I/O和非阻塞I/O]【转】

    转自:http://blog.csdn.net/jacobywu/article/details/7475432 阻塞型I/O和非阻塞I/O 阻塞:休眠 非阻塞:异步通知 一 休眠 安全地进入休眠的两 ...

  2. Linux C编程学习之C语言简介---预处理、宏、文件包含……

    C的简介 C语言的结构极其紧凑,C语言是一种模块化的编程语言,整个程序可以分割为几个相对独立的功能模块,模块之间的相互调用和数据传递是非常方便的 C语言的表达能力十分强大.C语言兼顾了高级语言和汇编语 ...

  3. Linux设备驱动程序学习----目录

    目录 设备驱动程序简介 1.设备驱动程序简介 构造和运行模块 2.内核模块和应用程序的对比 3.模块编译和装载 4.模块的内核符号表  5.模块初始化和关闭  6.模块参数  7.用户空间编写驱动程序 ...

  4. Linux设备驱动程序学习之分配内存

    内核为设备驱动提供了一个统一的内存管理接口,所以模块无需涉及分段和分页等问题. 我已经在第一个scull模块中使用了 kmalloc 和 kfree 来分配和释放内存空间. kmalloc 函数内幕 ...

  5. Linux设备驱动程序学习----2.内核模块与应用程序的对比

    内核模块与应用程序的对比 更多内容请参考Linux设备驱动程序学习----目录 1. 内核模块与应用程序的对比 内核模块和应用程序之间的不同之处: 大多数中小规模的应用程序是从头到尾执行单个任务,而模 ...

  6. Linux设备驱动程序学习----3.模块的编译和装载

    模块的编译和装载 更多内容请参考Linux设备驱动程序学习----目录 1. 设置测试系统 第1步,要先从kernel.org的镜像网站上获取一个主线内核,并安装到自己的系统中,因为学习驱动程序的编写 ...

  7. Linux内核入门到放弃-设备驱动程序-《深入Linux内核架构》笔记

    I/O体系结构 总线系统 PCI(Peripheral Component Interconnect) ISA(Industrial Standard Architecture) SBus IEEE1 ...

  8. USB设备驱动程序学习笔记(一)

    现象:把USB设备接到PC1. 右下角弹出"发现android phone"2. 跳出一个对话框,提示你安装驱动程序 问1. 既然还没有"驱动程序",为何能知道 ...

  9. Linux设备驱动程序 之 主次设备号

    主设备号和次设备号 对字符设备的访问是通过文件系统内的设备名称进行的,这些名称被称为特殊文件.设备文件.或者简单称之为文件系统树的节点,它们通常位于/dev目录.字符设备驱动程序的设备文件可以通过ls ...

随机推荐

  1. 转载几篇文章URL

    读了百伯在线Jobbole的几篇文章,转给需要的朋友.如下: 产品小设计大体验:http://blog.jobbole.com/39593/ 苹果是一家有工程师的设计公司:Google是一家有设计师的 ...

  2. .NET程序员如何快入门Spring Boot

    本篇文章将教你作为一个.NET程序员如何快入门Spring Boot.你不需要用Eclipse,也不需要用IDEA.已经习惯了VS,其他的IDE-- 但不得不说VS Code很厉害,一用就喜欢.微软给 ...

  3. mpvue 小程序加载不了图片 Error: Failed to load local image resource /images/xx.png the server responded with a status of 404 (HTTP/1.1 404 Not Found)

    mpvue开发小程序时候,要添加静态本地图片 <img src="../../images/bg.png" alt=""> 会报错: VM14878 ...

  4. 简单学习js

    由于是个前端小白,通过这一两天的学习html,css,js和jquery等,基本上前端会用了,而且熟悉我博客的人来说,没错,我把自己的博客给优化了一下(一些大佬都是禁用模板的所有样式,然后自己设计页面 ...

  5. 系统学习 Java IO (三)----文件类 File

    目录:系统学习 Java IO---- 目录,概览 Java IO API 中的 File 类可以访问基础文件系统. 使用 File 类,可以: 检查文件或目录是否存在. 如果目录不存在,创建一个目录 ...

  6. mysql索引结构

    mysql中索引的数据结构: 1.基本上所有的索引都是B-Tree结构,一部分还有HASH索引. 2.索引分类(功能) 主键索引:一张表中最多有一个主键索引,而且该字段值不能为NULL,不能重复. 唯 ...

  7. RT-thread线程创建:动态线程与静态线程

    本文介绍了如何创建一个动态线程和一个静态线程 RT-thread版本:RT-thread system 3.1.0 开发环境:MDK5 为了编程方便,创建了sample1.c文件,然后添加到工程中 话 ...

  8. springboot集成mockito与powermock

      mockito大家都比较熟悉了,存在或者不存在,都不要紧,mockito让你有一种只要一出手,就知道有没有的感觉.但是它也不是万能的,比如静态方法.私有方法,它就无能为力了.这是为什么呢?当然不是 ...

  9. 微服务-springboot热部署

    spring为开发者提供了一个名为spring-boot-devtools的模块来使Spring Boot应用支持热部署,提高开发者的开发效率,无需手动重启Spring Boot应用. IDEA进行热 ...

  10. 基于C#的机器学习--我应该接受这份工作吗-使用决策树

    决策树 要使决策树完整而有效,它必须包含所有的可能性.事件序列也必须提供,并且是互斥的,这意味着如果一个事件发生,另一个就不能发生. 决策树是监督机器学习的一种形式,因为我们必须解释输入和输出应该是什 ...