Linux设备驱动基础知识

2023-05-16

一、认识驱动

1、什么是驱动

不知道的情况下,我们一般会去问度娘,但是度娘的这个回答比较专业化,对小白来说并不容易理解,依旧不明白驱动到底是个啥。 ​ 度娘:驱动,计算机软件术语,是指驱动计算机里软件的程序。驱动程序全称设备驱动程序,是添加到操作系统中的特殊程序,其中包含有关硬件设备的信息。此信息能够使计算机与相应的设备进行通信。驱动程序是硬件厂商根据操作系统编写的配置文件,可以说没有驱动程序,计算机中的硬件就无法工作。

俺的理解:驱动,字面意思:想要某种东西动起来、运作起来,就得给它施加外力。比如风车能动起来,受到了风力,洗衣机要运作,得给它供电(电力),因此我们的硬件要运作起来就需要用代码去操纵、驱动它,而这段代码就叫硬件的驱动程序。因此狭义上,驱动程序专指操作系统中的用来操控硬件系统的代码。

2、驱动的作用

驱动的主要作用是计算机系统与硬件设备之间完成数据传送的功能,只有借助驱动程序,两者才能通信并完成特定的功能。如果一个硬件设备没有驱动程序,只有操作系统是不能发挥特有功效的,也就是说驱动程序是介于操作系统与硬件之间的媒介,实现双向的传达,即将硬件设备本身具有的功能传达给操作系统,同时也将操作系统的标准指令传达给硬件设备,从而实现两者的无缝连接。

3、驱动的分层思想

驱动的上层是API(即应用程序调用API,API调用驱动),驱动的下层是硬件(硬件抽象为寄存器)。

二、Linux设备驱动分类

根据设备读写操作特征差异的原则,分为以下三类:

(1)字符设备驱动

字符设备,准确的说应该叫“字节设备”,软件操作设备时是以字节为单位进行的。典型的如LCD、串口(一个一个字节的去读或者去发送)、LED(读写寄存器也是以字节为单位操作的)、蜂鸣器、触摸屏等等。

(2)块设备驱动

块设备,块设备是相对于字符设备定义的,块设备被软件操作时是以块(多个字节构成的一个单位)为单位的。设备的块大小是设备本身设计时定义好的,软件是不能去更改的,不同设备的块大小可以不一样。常见的块设备都是存储类设备,如:硬盘、NandFlash、iNand、SD等,想将某个字节的a改成b,必须将整个块读取到内存中,找到这个字节,将这个字节修改(在内存中可以以字节为单位访问),然后将整个块的内容再写入到块设备中。

(3)网络设备驱动

网络设备,网络设备是专为网卡设计的驱动模型,linux中网络设备驱动主要目的是为了支持API中socket相关的函数工作。

其中字符设备驱动最重要,因为常见大量设备都属于字符设备。

三、驱动与内核的关系

1、驱动是内核最庞大的组成部分,内核会直接以函数调用的方式调用驱动代码,驱动的动态安装和卸载都会“更改”内核。

2、驱动程序崩溃甚至会导致内核崩溃,驱动的效率会影响内核的整体效率(以字节为单位读写还是以块为单位读写),驱动的漏洞会造成内核安全漏洞。

四、常见驱动安全性问题

(1)未初始化指针,非法访问;

(2)恶意用户程序;

(3)缓冲区溢出,应用传给驱动的参数过多,覆盖掉有用的数 据; (4)竞争状态(自旋锁,互斥锁)。

五、mmap技术

1、拷贝读写文件

传统的修改文件一般要经过:把文件内容读入内存中;修改内存中的内容;把内存中的数据写入到文件中。这时读写文件的中间层叫页缓存,内核使用页缓存将文件的数据块关联起来,应用程序读写文件时,实际操作的是页缓存。那么如何才能免去将页缓存的数据复制到用户空间缓冲区的过程,直接在用户空间读写页缓存呢?

答案就是mmap技术!

2、认识mmap

mmap:零拷贝技术的一种体现,简单来说就是mmap是直接将进程的虚拟地址和内核空间的page cache进行映射从而省去了从内核空间向用户空间的copy。

(1)使用 mmap系统调用可以将用户空间的虚拟内存地址与文件进行映射(绑定),对映射后的虚拟内存地址进行读写操作就如同对文件进行读写操作一样。

(2)mmap映射的是文件的页缓存,而非磁盘中的文件本身。

(3)使用 mmap 对文件进行读写操作时可以减少内存拷贝的次数,并且可以减少系统调用的次数,从而提高对读写文件操作的效率。

(4)Linux 内核并不会主动把 mmap 映射的页缓存同步到磁盘,而是需要用户主动触发。同步 mmap 映射的内存到磁盘有 4 个时机:

调用 msyns函数主动进行数据同步(主动);

调用 munmap函数对文件进行解除映射关系时(主动);

进程退出时(被动);

系统关机时(被动)。

由于内核不会主动同步 mmap所映射的内存区中的数据,所以在某些特殊的场景下可能会出现数据丢失的情况(如断电)。为了避免数据丢失,在使用 mmap的时候可以在适当时主动调用 msync函数来同步映射内存区的数据。

3、mmap函数


函数原型:
        void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
各参数的作用:
        addr:指定映射的虚拟内存地址,可以设置为 NULL,让 Linux 内核自动选择合适的虚拟内存地址。
        length:映射的长度。
        prot:映射内存的保护模式,可选值如下:
        PROT_EXEC:可以被执行。
        PROT_READ:可以被读取。
        PROT_WRITE:可以被写入。
        PROT_NONE:不可访问。
        flags:指定映射的类型,常用的可选值如下:
        MAP_FIXED:使用指定的起始虚拟内存地址进行映射。
        MAP_SHARED:与其它所有映射到这个文件的进程共享映射空间(可实现共享内存)。
        MAP_PRIVATE:建立一个写时复制(Copy on Write)的私有映射空间。
        MAP_LOCKED:锁定映射区的页面,从而防止页面被交换出内存。
        ...
        fd:进行映射的文件句柄。
        offset:文件偏移量(从文件的何处开始映射)。  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux设备驱动基础知识 的相关文章

随机推荐

  • 零插件sketchup草图大师su逆向建模“世纪钟”雕塑

    找到一张适合透视的图片 检索相关参数 根据地图测量数据 xff0c 画出花坛和台阶 点击相机 匹配新照片 选择正视图照片 调整手柄使其贴合 xff08 未完待续 xff09
  • 英伟达Jatson nano无线网卡 摄像头安装及使用

    连接ufl连接器 拆卸散热器所在版两侧螺丝 按下模块儿两侧夹子 拧下中央螺丝 警告 xff01 xff01 xff01 xff01 x1f53a 这颗螺丝 xff0c 打了螺丝胶 xff0c 千万不要用电动螺丝刀 要找准合适的工具 轻轻取下
  • 3D打印机加装灯带。以创想三维ender系列某一型号为例。

    警告 3D打印机加装灯带必须确保该款的打印机支持加装 而且必须在客服官方售后允许范围内进行改装 必须熟练掌握电工知识 否则引起短路损坏无法保修 该文只是一个加装成功的案例 xff0c 不得以此作为任何参考 首先根据电压直流或交流选择完全匹配
  • USB转串口芯片CH340系列及CH340模块使用方法(CH340驱动,接线,串口下载详细介绍)

    USB 转串口芯片 CH340 我们为什么要用到CH340驱动呢 xff1f CH340驱动就是USB转串口的驱动的一种 xff0c 因为我们现在的电脑上 xff0c 已经不存在串口 xff0c 所以我们一般使用USB转串口芯片 xff0c
  • prusa2.6.0 树形支撑(有机支撑)Organic体验测试 3d打印及下载失败解决

    目前官网没有这个2 6版本 xff0c 只有2 5 2下载 xff0c 是没有树形支撑的 如果试用2 6版本 xff0c 需要从GitHub下载 地址为 xff1a https github com prusa3d PrusaSlicer
  • 无人机在户外无GPS环境下用什么导航方法问答

    无人机在户外无GPS环境下用什么导航方法 xff1f 无人机在户外无GPS环境下可以使用多种导航方法 xff0c 包括 xff1a 1 视觉导航 xff1a 利用摄像头检测地面特征实现导航 2 磁场感应导航 xff1a 利用永磁体和地球磁场
  • 网络中的图片传输

    前言 一张图片经过网络从主机 A 传输到主机 B xff0c 主机 B 在收到这张图片后将其保存在本地 xff0c 对应步骤为 xff1a 读 xff1a 主机 A 读取待传输的图片数据传 xff1a 主机 A 通过 Socket 将图片传
  • 一道有趣的C语言题:int *p=(int *)((int)a+1);

    偶然间看到这样一个c语言题目 xff1a 小端模式 int main void int a 5 61 1 2 3 4 5 int p 61 int int a 43 1 xff1b printf 34 X r n 34 p return 0
  • 一、FREERTOS学习之 freertos移植流程步骤

    目录 一 FREERTOS资源包下载 二 移植 1 资源包整理 三 工程添加 1 添加 2 编译路径添加 3 修改FreeRTOSConfig h 4 修改stm32f10x it c 5 注意 一 FREERTOS资源包下载 官网 xff
  • 三、FreeRTOS学习之 freertos的任务创建

    目录 一 任务创建 xff1a 1 静态创建 xff1a 2 动态创建 xff1a 3 任务句柄 4 例 xff1a 一 任务创建 xff1a 在freertos中 xff0c 提供了两种创建任务的方式 xff1a 静态创建 xff0c 动
  • 七、FreeRTOS学习之 软件定时器

    一 基本概念 在freertos中 xff0c 软件定时器的功能跟单片机中使用的定时器差不多 xff0c 通过设置一段时间 xff0c 等到时间到达 xff0c 定时器进入中断 xff0c 执行相应的功能函数 xff0c 被调用的函数叫做定
  • 软件iic 的编写与调试

    一 了解 1 硬件iic 其对应的芯片上有iic外设 xff0c iic的引脚是固定的 xff0c 硬件iic是直接配置内部的寄存器 xff0c 只要配置好寄存器 xff0c 外设就会产生标准的协议时序 xff0c 只需要直接调用控制函数
  • 运算符重载(),[]

    include lt iostream gt include lt cstring gt using namespace std class yunsuan private int a b c int len num char name 3
  • vector

    include lt iostream gt include lt vector gt include lt algorithm gt using namespace std 容器 xff1a vector 相当于一个数组 迭代器 xff1
  • STM32外设之TIM定时器使用及输出比较模式PWM生成,PWM频率和占空比计算,文末有固件库TIM驱动文件的函数讲解

    TIM 定时器是stm32单片机中的一个外设 xff0c STM32有8个定时器 xff0c 分别是2个高级定时器TIM1TIM8 xff0c 4个通用定时器TIM2 5 2个基本定时器TIM67 根据不同型号的单片机 xff0c 挂载的定
  • Java多线程之~~~~使用wait和notify实现生产者消费者模型

    在多线程开发中 xff0c 最经典的一个模型就是生产者消费者模型 xff0c 他们有一个缓冲区 xff0c 缓冲区有最大限制 xff0c 当缓冲区满 的时候 xff0c 生产者是不能将产品放入到缓冲区里面的 xff0c 当然 xff0c 当
  • 拷贝、移动构造

    include lt iostream gt using namespace std class temp private char a public temp char c char b a 61 new char 2 a 0 61 c
  • Dockerfile

    Dockerfile Dockerfile简介1 Dockerfile基本介绍2 Dockerfile构建过程3 Dockerfile指令用法 Dockerfile构建镜像1 Dockerfile使用CentOS构建apache镜像1 1相
  • MySQL数据库备份与恢复

    在项目的开发过程中数据库的备份是非常重要的 xff0c 为了防止数据库受到破坏 xff0c 造成不可估量的损失 xff0c 所以一定要进行数据库的备份 xff0c 并且需要掌握数据库恢复方法 xff0c 在发生数据库损坏的时候 xff0c
  • Linux设备驱动基础知识

    一 认识驱动 1 什么是驱动 不知道的情况下 xff0c 我们一般会去问度娘 xff0c 但是度娘的这个回答比较专业化 xff0c 对小白来说并不容易理解 xff0c 依旧不明白驱动到底是个啥 度娘 xff1a 驱动 xff0c 计算机软件