设备驱动程序基础

article/2025/11/8 2:19:44

设备驱动程序基础

​ 驱动程序是专用于控制和管理特定硬件设备的软件,因此也被称作设备驱动程序。从操作系统的角度来看,它可以位于内核空间(以特权模式运行),也可以位于用户空间(具有较低的权限)。在编写设备驱动程序之前,应该了解一些概念。C语言编程技巧是必需的,至少需要熟悉指针,并熟悉一些处理函数和必要的硬件知识。

  • 模块的构建过程及其加载和卸载
  • 驱动程序框架以及调试消息管理
  • 驱动程序中的错误处理

1. 内核空间和用户空间

内核空间:内存驻留和运行的地址空间。内核内存是由内核拥有的内存范围,受访问标志保护,防止任何用户应用程序有意或无意间与内核搞混。在系统上以更高的优先级运行。

用户空间:正常程序被限制运行的地址(位置)空间。可以将其视为沙盒或监狱,以便用户程序不能混用其他程序拥有的内存或任何其他资源。在用户模式下,CPU只能访问标有用户空间访问权限的内存。

分享图片

2.模块的相关概念

模块对于Linux而言就像插件和用户软件一样,模块动态扩展了内核的功能。大多数情况下,内核模块是即插即用的。内核中的模块可以提供函数或变量,在内核构建过程中运行depmod工具可以生成模块依赖文件。它通过读取/lib/modules/<kernel_release>/中的每个模块来确定它应该导出哪些符号以及它需要什么符号。处理得到的结果写入文件modules.dep.在这里插入图片描述
【模块加载】模块运行需要先加载到内核,可以使用insmod 或modprobe 来实现,前者需要指定模块路径作为参数,作为开发期间的首选;后者更加智能化,是生产系统中的首选。

  • 手动加载

    手动加载需要用户的干预,该用户应该拥有root访问权限。具体方法如下:

    1.使用insmod来加载模块,并给出所加载模块的路径:
    在这里插入图片描述

    2.insmod这种模块加载形式低级,相反,系统管理员或在生产系统中常用的modprobe.modprobe更加智能,它会加载指定的模块之前解析文件modules.dep,以便首先加载依赖关系。
    在这里插入图片描述

    • 自动加载

      depmod实用程序的作用不只是构建modules.dep 和modules.dep.bin 文件。内核开发人员实际编写驱动程序时已经明确知道该驱动程序将要支持的硬件。将驱动程序支持的所有设备的产品和厂商ID提供给该驱动程序。depmod还处理模块文件来提取和收集该信息,并生成modules.alias文件,该文件将设备映射到其对应的驱动程序。

【模块卸载】常用的模块卸载命令是rmmod,使用这个命令来卸载insmod命令加载的模块。

在这里插入图片描述

而另一个更高级的模块卸载命令是modprobe -r ,它会自动卸载未使用的相关依赖模块:
在这里插入图片描述

在开发中还有一个常用的命令lsmod,可以用来检查模块是否已加载:
在这里插入图片描述

3.驱动程序框架

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>static int __init helloworld_init(void)
{pr_info("Hello world!\n");return 0;
}
static void __exit helloworld_exit(void)
{pr_info("End of the world\n");
}/* 模块的入点和出点 */
module_init(helloworld_init);
module_init(helloworld_exit);
/* 模块相关信息 */
MODULE_AUTHOR("***** <*****@mail.com>");
MODULE_DESCRIPTION("Hello world! Module");
/* 许可 */
MODULE_LICENSE("GPL");

4.错误和消息打印

​ 错误代码有内核空间应用程序(error变量)解释。错误处理在软件开发中非常重要,而不仅仅实在内核开发中。在内核当中提供了几种错误,几乎涵盖了可能出现的错误,有时需要将它们打印出来以帮助调试。

4.1 错误处理

由于给定的错误返回错误代码会导致内核或用户空间应用产生不必要的行为,从而做出错误的决定。为了方便处理这些错误,内核树中预定义的错误几乎涵盖了可能遇到的情况。它们被定义在路径为 include/upia/asm-generic/errno-base.h 的头文件中 ,下面是定义的所有错误定义代码:

#ifndef _ASM_GENERIC_ERRNO_BASE_H
#define _ASM_GENERIC_ERRNO_BASE_H#define	EPERM		 1	/* Operation not permitted */
#define	ENOENT		 2	/* No such file or directory */
#define	ESRCH		 3	/* No such process */
#define	EINTR		 4	/* Interrupted system call */
#define	EIO		 5	/* I/O error */
#define	ENXIO		 6	/* No such device or address */
#define	E2BIG		 7	/* Argument list too long */
#define	ENOEXEC		 8	/* Exec format error */
#define	EBADF		 9	/* Bad file number */
#define	ECHILD		10	/* No child processes */
#define	EAGAIN		11	/* Try again */
#define	ENOMEM		12	/* Out of memory */
#define	EACCES		13	/* Permission denied */
#define	EFAULT		14	/* Bad address */
#define	ENOTBLK		15	/* Block device required */
#define	EBUSY		16	/* Device or resource busy */
#define	EEXIST		17	/* File exists */
#define	EXDEV		18	/* Cross-device link */
#define	ENODEV		19	/* No such device */
#define	ENOTDIR		20	/* Not a directory */
#define	EISDIR		21	/* Is a directory */
#define	EINVAL		22	/* Invalid argument */
#define	ENFILE		23	/* File table overflow */
#define	EMFILE		24	/* Too many open files */
#define	ENOTTY		25	/* Not a typewriter */
#define	ETXTBSY		26	/* Text file busy */
#define	EFBIG		27	/* File too large */
#define	ENOSPC		28	/* No space left on device */
#define	ESPIPE		29	/* Illegal seek */
#define	EROFS		30	/* Read-only file system */
#define	EMLINK		31	/* Too many links */
#define	EPIPE		32	/* Broken pipe */
#define	EDOM		33	/* Math argument out of domain of func */
#define	ERANGE		34	/* Math result not representable */
#endif

4.2 消息打印

printk()是在内核空间中使用的,其作用和在用户空间使用printf()一样。根据所打印消息的重要性不同,可以选用include/linux/kern_levels.h中定义的八个级别的消息日志。下面是所列出的内核日志级别,每个级别对应一个字符串格式的数字,其优先级与该数字的值成反比。

0具有较高的优先级,以此类推,7的优先级最低。

#define KERN_SOH	"\001"		/* ASCII Start Of Header */
#define KERN_SOH_ASCII	'\001'#define KERN_EMERG	KERN_SOH "0"	/* system is unusable */
#define KERN_ALERT	KERN_SOH "1"	/* action must be taken immediately */
#define KERN_CRIT	KERN_SOH "2"	/* critical conditions */
#define KERN_ERR	KERN_SOH "3"	/* error conditions */
#define KERN_WARNING	KERN_SOH "4"	/* warning conditions */
#define KERN_NOTICE	KERN_SOH "5"	/* normal but significant condition */
#define KERN_INFO	KERN_SOH "6"	/* informational */
#define KERN_DEBUG	KERN_SOH "7"	/* debug-level messages */

通过下列代码打印内核消息和日志级别:

printk(KERN_ERR "This is an error\n");

通过打印错误消息,检查日志级别参数,方便开发人员更快速的调试驱动程序。

/* integer equivalents of KERN_<LEVEL> */
#define LOGLEVEL_SCHED		-2	/* Deferred messages from sched code* are set to this special level */
#define LOGLEVEL_DEFAULT	-1	/* default (or last) loglevel */
#define LOGLEVEL_EMERG		0	/* system is unusable */
#define LOGLEVEL_ALERT		1	/* action must be taken immediately */
#define LOGLEVEL_CRIT		2	/* critical conditions */
#define LOGLEVEL_ERR		3	/* error conditions */
#define LOGLEVEL_WARNING	4	/* warning conditions */
#define LOGLEVEL_NOTICE		5	/* normal but significant condition */
#define LOGLEVEL_INFO		6	/* informational */
#define LOGLEVEL_DEBUG		7	/* debug-level messages */

http://chatgpt.dhexx.cn/article/ukdl9vRS.shtml

相关文章

重装Win7时提示“缺少所需的CD/DVD驱动器设备驱动程序”

好多朋友都是这样&#xff0c;自己的电脑用的时间长了而又懒得经常去清理修复&#xff0c;或者因为偶尔中毒&#xff0c;系统运行不畅甚至崩溃。这几天每天都在网上找资料、下载资料&#xff0c;弄得自己的本本凌乱不堪&#xff0c;也懒得花时间去整理修复了&#xff0c;今天&a…

安装win7时,显示缺少所需的CD/DVD驱动器设备驱动程序

出现这种错误的原因在于原生Windows7系统不包含USB3.0的驱动&#xff0c;所以当我们使用USB3.0的端口来安装Windows7系统时&#xff0c;在加装驱动程序时会出错。 解决的措施可尝试以下几种方式&#xff1a; 1、换一个use接口 2、重新插入u盘 3、进入BOIS&#xff0c;进行设置 …

安装WIN7时提示“缺少所需的CD/DVD驱动器设备驱动程序”的解决办法

PS:不明之处&#xff0c;请君留言&#xff0c;以期共同进步&#xff01; 1、遇到的问题 如图&#xff1a; 2、不一定管用的解决办法 &#xff08;1&#xff09;把U盘拔了重新插上&#xff08;不管用&#xff09;。 &#xff08;2&#xff09;更换USB2.0接口&#xff08;还…

通过注册表删除软件自动生成的设备和驱动器

比如腾讯视频会自动生成一个"腾讯视频&#xff08;32位)" 按下 winR 进入 命令行 输入 ’regedit‘ 进入注册表 搜索 \HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace\ 进入 找到腾讯视频的文件删除就行了

689-电脑的外部设备驱动程序

电脑的外部设备 设备管理 &#xff08;1&#xff09;回顾计算机结构 图&#xff1a; &#xff08;2&#xff09;常见的外部设备 1&#xff09;如何判定是不是外部设备 只要挂接在外设IO接口上的都是外部设备&#xff0c;与所在位置关系不大&#xff0c;可能在芯片内部、也…

设备驱动程序 (一)

一、基础知识 1、设备文件 设备驱动程序为内核和硬件设备之间的接口&#xff0c;其对硬件细节透明&#xff0c;且调和被映射为特殊的文件进行处理。每个设备都对应一个文件名&#xff0c;在内核中也对应一个索引节点&#xff0c;应用程序可以通过设备的文件名来访问硬件设备。 …

Windows 此电脑->设备与驱动器->图标管理

在Windows中此电脑里的”设备与驱动器“的图标信息会在注册表中。 1.记录值 储存图标UUID对应的注册表位置 计算机\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace\ 我这里有两项&#xff1a;分别是百度云盘和酷狗音乐 删除图…

【操作系统】设备驱动

本文为学习李治军老师《操作系统原理、实现与实践》第八章的总结&#xff0c;主要讲述显示器、键盘设备驱动。 参考资料&#xff1a; 哈工大李治军老师操作系统mooc视频&#xff1b;实践项目解析。 第八章 设备驱动 设备驱动的基本原理 外设工作原理 从CPU开始&#xff1a;…

设备驱动简介

设备驱动 一、设备驱动程序简介二、设备的分类和特点1.字符设备2.块设备3.网络设备 一、设备驱动程序简介 系统调用是操作系统内核和应用程序之间的接口&#xff0c; 设备驱动程序是操作系统内核和机器硬件之间的接口。 设备驱动程序为应用程序屏蔽了硬件的细节&#xff0c;这…

Windows设备与驱动器管理

在安装一些软件的时候经常会在“我的电脑-设备与驱动器”下面多几个图标&#xff0c;那么这些图标是怎么添加上去&#xff1f;要怎么删除掉呢&#xff1f; 只需要知道关联的注册表项&#xff0c;就可以轻松的添加、删除、修改了&#xff1a; 1、设备与驱动器标记注册表项 HKE…

linux 没有可用软件包 pstree

yum provides反查询文件在什么包中 通过 yum provides pstree yum install psmisc

top,ps,pstree工具介绍及举例

top 工具是我们常用的一个查看工具&#xff0c;能实时的查看我们系统的一些关键信息的变化: toptop 是一个在前台执行的程序&#xff0c;所以执行后便进入到这样的一个交互界面&#xff0c;正是因为交互界面我们才可以实时的获取到系统与进程的信息。在交互界面中我们可以通过…

模仿pstree 打印进程树

一个查看进程树的小栗子 可以打印进程数&#xff0c;并且可以加参数 -n 显示pid&#xff0c;加参数-p 显示线程信息 ( 和pstree 的参数并不一样) 准备工作 step 1 处理进程信息 想办法找到所有当前进程 在Linux下 proc 文件系统 (procfs) 是类 Unix 操作系统中的一种特殊文件系…

pstree 详解

pstree命令是用于查看进程树之间的关系&#xff0c;即哪个进程是父进程&#xff0c;哪个是子进程&#xff0c;可以清楚的看出来是谁创建了谁 #pstree 几个重要的参数&#xff1a; -A: 各进程树之间的连接以ASCII码字符来连接 -U:各进程树之间的连接以utf8字符来连接&#xff0c…

Centos安装pstree

说明 以树状图的方式展现进程之间的派生关系 补充说明 pstree命令 以树状图的方式展现进程之间的派生关系&#xff0c;显示效果比较直观。 语法 pstree(选项) 选项 -a&#xff1a;显示每个程序的完整指令&#xff0c;包含路径&#xff0c;参数或是常驻服务的标示&#x…

Linux命令之树状图显示所有进程pstree

概述 pstree 命令会将所有进程以树状图形式显示&#xff0c;方便查看进程之间的父子关系。pstree 是 display a tree of process 的缩写。 树状图将会以 pid (如果有指定) 或是以 init 这个基本进程为根 (root)&#xff0c;如果有指定使用者 id&#xff0c;则树状图会只显示该…

Linux基础命令-pstree树状显示进程信息

Linux基础命令-uname显示系统内核信息 Linux基础命令-lsof查看进程打开的文件 Linux基础命令-uptime查看系统负载 文章目录 前言 一 命令介绍 二 语法及参数 2.1 使用man查看命令语法 2.2 常用参数 三 参考实例 3.1 以树状图的形式显示所有进程 3.2 以树状图显示进程号…

学习一个 Linux 命令:pstree

linux在工作中用的越来越多&#xff0c;接下来为大家介绍一下比较常用的命令pstree的使用方法 命令简介 pstree 命令以树状图的方式展现进程之间的派生关系。 [rootcentos7 ~]# pstree -bash: pstree: command not found [rootcentos7 ~]# yum install psmisc -y 语法格式 …

android系统apk文件,如何安装apk文件 安卓手机apk文件安装方法

我们知道安卓手机软件程序均为APK格式文件&#xff0c;很多小白朋友对于安卓手机如何安装apk文件不是很了解&#xff0c;下面本文于大家简单介绍下。由于很多朋友使用一些手机应用软件里面下载安装程序&#xff0c;但那仅仅是针对Wifi用户很方便&#xff0c;而没有Wifi用户因流…

Android下载安装Apk

1.自定义监听类&#xff0c;用来返回下载结果 interface DownLoadListener {/*** 下载成功之后的文件*/fun onDownloadSuccess(file: File)/*** 下载进度*/fun onDownloading(progress: Int)/*** 下载异常信息*/fun onDownloadFailed(e:Exception) }进行文件下载 /*** param …