• 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设备驱动程序学习----目录

  • 相关阅读:
    [CQOI2011]放棋子
    [CF1192B]动态直径
    [CERC2016]凸轮廓线
    19_08_14-19_08_21校内训练 补题
    [模板]线性递推+BM
    19_08_10[校内训练]割图
    [模板]多项式封装(无讲解)
    19_07_11校内训练[字串染色]
    CF990G
    19_07_09校内训练[分组]
  • 原文地址:https://www.cnblogs.com/microxiami/p/11254081.html
Copyright © 2020-2023  润新知