1. 简介
字符设备(character device)是一种按字符方式进行数据传输的设备。与块设备不同,字符设备不以块为单位读写数据,而是以字符为单位进行操作。常见的字符设备包括串口、键盘、鼠标、以及一些传感器等。
字符设备驱动(character device driver)是操作系统内核中用于管理和控制字符设备的软件组件。它提供了一组操作接口,使得用户空间的程序可以通过系统调用与字符设备进行交互。字符设备驱动的主要功能包括初始化设备、管理设备的输入输出操作、处理设备的中断以及提供对设备的访问权限。
为什么要实现驱动程序,驱动到底有什么用???
首先需要明白一个概念:操作系统通常将其运行模式分为两种:内核模式(Kernel Mode)和用户模式(User Mode)。在内核模式下,代码可以直接访问硬件和内存,拥有更高的权限;而用户模式下的代码只能通过系统调用间接访问硬件和受保护的系统资源。
所以如果允许用户空间的应用程序直接访问硬件,这会带来极大的安全隐患。恶意程序可能会直接操作硬件,导致系统崩溃或安全漏洞。驱动程序在内核空间运行,受操作系统的严格控制,可以防止未经授权的硬件访问。
除此之外还有以下作用:
硬件抽象:不同硬件厂商的设备有不同的接口和操作方法。驱动程序提供了一个硬件抽象层,将这些差异屏蔽起来,使得操作系统和应用程序可以通过统一的接口访问不同的硬件设备。
统一接口,代码解耦:操作系统提供了一组标准化的接口(如 open
, read
, write
, ioctl
等)供用户空间应用程序调用。这些接口通过驱动程序实现,不管底层的具体硬件如何变化,用户程序可以依旧不变地调用这些接口。
性能优化:在用户空间直接操作硬件通常需要频繁的上下文切换(从用户模式切换到内核模式)。这种切换是昂贵的操作,会增加系统开销。驱动程序在内核空间执行,减少了这种开销,提高了性能。
实时性要求:某些硬件设备(如实时控制系统中的传感器和致动器)需要对外界变化做出非常快速的反应。驱动程序在内核空间执行,能够在需要时迅速响应硬件中断,而用户空间程序无法直接处理中断,无法满足实时性的要求。
资源管理: 内核需要管理系统中的所有硬件资源,包括设备文件、内存、I/O 端口、中断等。驱动程序是内核管理这些资源的关键模块。
硬件依赖:驱动程序通常是硬件相关的,为特定的硬件设备编写。操作系统内核通过这些驱动程序支持不同的硬件设备。
模块化设计:驱动程序允许操作系统模块化地设计和实现硬件支持。新的硬件支持可以通过加载新的驱动程序模块来添加,而不需要改变内核或用户空间程序。
可扩展性:驱动程序可以随着硬件的更新和功能的扩展而进行独立的开发和升级,而无需对操作系统内核本身进行大量修改。
等等;
2. 字符设备驱动实现过程及分析
字符设备驱动实现过程:
1. 确定主设备号
2. 定义实现自己的file_operations结构体(核心)
3. 实现入口函数,在入口函数中注册驱动程序
4. 实现出口函数,在出口函数中卸载驱动程序
5. 其他,如创建设备节点
以一个最简单的字符驱动程序为例详细解释驱动实现过程,实现一个hello.drv驱动程序,应用程序可以往驱动程序写字符串,也可从驱动程序中读取字符串;实例驱动程序实现过程:
1. 确定主设备号
static int major =0;//定义一个设备号,由内核分配
//定义主设备号: major 是一个整数变量,用于存储字符设备的主设备号(major number)。
//初始化为 0: 当 major 被初始化为 0 时,这表示驱动程序希望由内核自