定义
Linux
设备驱动会以内核模块的形式出现
实现驱动模块的目的
实现驱动模块的主要目的是使操作系统能够与硬件设备进行交互。
- 硬件抽象:驱动模块提供了硬件设备的抽象层,使得操作系统和应用程序无需直接管理硬件细节。
- 设备管理:驱动程序负责管理硬件设备的生命周期,包括初始化、配置、读写操作、错误处理等。它确保硬件设备能够按预期工作,并且在系统中可用。
- 资源分配与访问控制:驱动模块负责在多个进程或用户之间分配硬件资源,如
I/O
端口、内存映射区域等,确保资源的共享和保护,避免冲突。 - 性能优化:驱动程序能对硬件的操作进行优化,例如缓存管理、数据传输的并行化处理等,从而提高硬件操作的效率。
- 兼容性与可扩展性:通过驱动模块,操作系统能够支持多种硬件平台和设备,而不需要修改核心系统代码。这使得系统更加灵活,能够兼容新的硬件设备。
驱动模块初始化
驱动模块的初始化是在系统启动时或设备被发现时执行的。初始化的目的是配置硬件设备并使其准备好与操作系统交互。
初始化的触发条件
- 系统启动时:
- 当操作系统启动时,内核会扫描并检测系统中已安装的硬件设备。对于每个硬件设备,操作系统会根据设备类型和型号加载相应的驱动程序。
- 驱动程序在加载时会进行初始化。初始化通常包括设备的配置、分配所需的资源(如内存、I/O端口、IRQ等)、硬件的启动和故障检测等。
- 硬件设备插入或连接时:
- 对于外部硬件(如USB设备、PCI设备等),当设备插入或连接时,操作系统会检测到设备并加载对应的驱动模块进行初始化。
- 例如,当一个新的外部USB设备连接到计算机时,操作系统会加载相应的USB驱动模块进行初始化和配置。
- 设备管理工具或系统调用触发:
- 驱动初始化也可能是由设备管理工具或用户空间程序(如
udevadm
、modprobe
等)主动触发的。 - 在这种情况下,系统会加载并初始化驱动程序来支持新添加的硬件设备。
- 驱动初始化也可能是由设备管理工具或用户空间程序(如
初始化过程
- 分配和初始化与硬件设备相关的内存区域(例如映射I/O空间或DMA区域)。
- 配置硬件设备的寄存器、端口、
IRQ
等。 - 启动设备的操作,例如打开通信端口、初始化网络接口、设置硬盘驱动程序的读写队列等。
- 设置操作系统与硬件设备之间的接口,例如注册设备文件、创建设备节点。
驱动模块的读写操作
由系统调用、内核操作、硬件中断、DMA请求等触发。驱动程序负责将数据从硬件设备读取到内存或将内存中的数据写入硬件设备。
读写操作的触发条件
- 用户进程的系统调用:
- 当用户程序执行I/O操作时,例如读文件、写文件、读网络数据、写数据到设备等,操作系统通过系统调用将请求传递给相应的设备驱动。
- 例如,用户程序通过标准I/O接口调用
read()
或write()
,这些调用会触发文件系统或块设备驱动程序的读写操作。
- 内核中的设备访问请求:
- 内核中的某些模块可能会直接访问硬件设备进行数据读写,例如网络协议栈、文件系统等。
- 例如,内核会调用网络驱动来发送和接收网络数据包,或者调用磁盘驱动来进行磁盘读写操作。
- 异步事件触发:
- 一些设备驱动程序可能会响应外部事件或中断。例如,网络驱动程序可能会在接收到数据包中断时触发读操作,将数据从硬件缓冲区复制到内核缓冲区。
- 硬件设备(如硬盘、网卡等)通过中断通知操作系统进行相应的读写操作。
- DMA(Direct Memory Access)请求:
- 一些高效的设备驱动使用DMA来直接在设备和内存之间进行数据传输。驱动模块需要响应DMA请求,执行数据的传输操作,而不需要CPU的干预。
读写操作的过程
- 读操作:
- 当请求读取数据时,驱动模块从设备读取数据并将其传输到内核或用户空间。例如,磁盘驱动会将磁盘上的数据块读取到内核缓冲区。
- 对于网络设备,网络驱动将从硬件接收缓冲区读取数据,并将数据传输到网络协议栈。
- 写操作:
- 当请求写入数据时,驱动模块将数据从内存或用户空间传输到硬件设备。例如,磁盘驱动将内存中的数据写入硬盘的指定区域。
- 对于打印机驱动,数据会从内存缓冲区传输到打印机的输入缓冲区。
驱动编译
法一:驱动编译为Module
- 使用命令把驱动加载到内核,模块本身不被编译到内核镜像,方便控制内核大小
- 驱动编译
法二:直接把驱动编译到内核
图形化配置内核
menuconfig
需要ncurses
库支持
sudo apt-get install build-essential
sudo apt-get install libncurses5-dev
- 内核图形化配置
#make config (基于文本的最为传统的配置界面,不推荐使用)
#make menuconfig (基于文本菜单的配置界面)
#make xconfig (要求 QT 被安装)
#make gconfig (要求 GTK+ 被安装)
设置对应的环境变量
make ARCH=arm64 menuconfig
Linux配置系统组成
- Makefile:分布在
Linux
内核源代码中,定义Linux
内核的编译规则。 - 配置文件(
Kconfig
):给用户提供配置选择的功能。 - 配置工具:包括配置命令解释器(对配置脚本中使用的配置命令进行解释)和配置用户界面(提供字符界面和图形界面)。这些配置工具使用的都是脚本语言,如用
Tcl/TK
、Perl
等。
.config
配置完内核以后生成的配置选项