设备驱动程序 (一)

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

一、基础知识

               1、设备文件

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

                    Linux为文件和设备提供了一致性的接口,用户操作设备文件与操作普通文件类似。例如:通过open()函数可打开设备文件,建立起应用程序与目标设备的连接;之后,可以通过read()、write()等常规文件函数对目标设备进行操作。linux将硬件设备分为两大类:块设备和字符设备。相应地,提供了两个标准接口:块设备文件和字符文件。块设备驱动和字符设备不同,字符设备是直接和虚拟文件系统进行交互,而块设备驱动则是通过块缓冲/高度层间接和虚拟文件系统交互;块设备驱动数据访问都是以块为单位;多个块I/O需要组成一个请求队列,这个功能是块缓冲/调度层提供的,它出于硬件特性和读写性能的考虑,将块I/O进行重新排序,并组成 一个请求队列,交给内核 ,内核则调用请求队列处理函数来逐个处理请求队列。

           2、 主设备号与次设备号

              设备文件作为一个可挂接的文件系统并可被挂接到任何需要的目录下。调和文件的索引节点,是包含硬件设备相关信息的一个表示。通常,主设备号指明唯一的设备类型,即标识设备对应的驱动程序类型,它是块设备表或字符设备表中表项的索引。

              在内核中,dev_t类型用来保存设备编号,包括主设备号和次设备号。在使用dev_t时,应该采用系统提供的一组宏对设备号进行访问:

              MAJOR(dev_t dev);  /*从dev_t类型中取出主设备号*/

              MINOR(dev_t dev);  /*从dev_t类型中取出次设备号*/

              mknod()函数可用来创建设备文件,使用该函数需要4个参数:设备文件名、设备类型、主设备号及次设备号。用户也可通过mknod命令创建设备文件,例如:       

             mknod/dev/fd1 b 2 1 

             该命令在/dev目录下创建一个名为fd1的块设备文件,文件的主设备号为2,次设备号1。设备文件的主设备号与次设备号放在索引对象的i_rdev字段,设备文件的类型存放在索引对象的i_mode字段。对于内核而言,设备名是无关紧要的,依靠主设备号和次设备号对设备进行标识。

           3、设备文件的VFS处理

             在VFS中,每个文件都有一个索引节点与之对应。在内核的inode结构中,有一个名为i_fop成员,其类型file_operations.file_operations定义文件的各种操作,用户对文件的操作是通过调用file_operations来实现的。为了使用户对设备文件的操作转换为设备的驱动操作,VFS必须在设备文件打开时,改变其node结构中i_fop成员的默认值,将该值换成与该设备相关的具体函数操作。

             当用户准备对设备文件进行访问时,文件系统读取设备文件在磁盘上相应的索引节点,并存入主存inode结构中。内核将文件的主设备号与次设备号写入inode结构中的i_dev字段,并将i_fop字段设置为def_bkl_fops(块)或def_chr_fops(字符)。

二、字符设备

           1、数据结构

             3个重要内核数据结构,file_operations、file 和inode。内核通过这3个数据结构的关联,将用户对设备文件的操作转换为驱动程序相关函数的调用,,进而实现对设备的驱动操作。

            file_operations    函数指针集合:

              图

              在内核中,通过包含一个指向file_operations结构的f_op字段,每个打开的设备文件都会与一组文件操作函数相关联。file_operations结构的每个字段都必须指向驱动程序中实现特定操作的具体函数,对于不支持的文件操作,可设为NULL值。

              file代表一个打开了的文件。它由内核在使用open()函数时建立,并传递给该文件上进行操作的所有函数,直到最后的close()函数。当文件的所有 操作结束后,内核会释放

             


                    内核用inode结构在内部标识文件,它和file结构不同,后者标识打开的文件描述符。对于单个文件,可能会有许多个表示打开的文件描述符的file结构,但它们 都指向同一个inode结构。  inode结构中有两个重要的字段:

                    struct cdev *i_cdev;

                    dev_t  i_rdev;

                   i_cdev结构表示字符设备的内核数据结构,当inode指向一个字符设备文件时,该字段包含指向struct cdev结构的指针。i_rdev包含设备编号,内核不推荐开发直接通过访问inode结构的 i_rdev字段来获得设备的主、次设备号,宏:

                   unsigned int imajor(struct inode *inode);

                   unsigned int iminor(struct inode *inode);

                2、申请与释放设备编号

                   在创建字符设备之前,需要给设备申请设备编号。

                   int register_chrdev_region(dev_t from,unsigned count,const char *name);//静态

                  开发者须明确知道所需要的设备编号。   


                  int alloc_chrdev_region(dev_t from,unsigned count,const char *name);//设备号并没有预先确定,动态

                  缺点:每次分配的主设备号不能够保持一致,因而用户不能够预先在/dev目录下用mknod命令创建设备文件。用户需要在驱动程序注册后,根据/proc/device读取到设备所用到的设备编号,然后创建相应的设备文件。

                 int unregister_chrdev_region(dev_t from,unsigned count);

                  驱动程序一般通过模块加载,可在模块的初始化函数进行设备号申请,并在模块的清理函数中,对设备号进行释放。

                3、设备注册与注销

                 内核用cdev结构 来表示字符设备,在内核调用设备的驱动操作之前,必须分配并注册一个上述结构。分配 和初始化cdev结构有两种方式,获得一个独立的cdev结构:

                  struct cdev *my_cdev=cdev_alloc();

                  my_cdev->ops=&my_ops;

                  也可以通过内核函数cdev_init()来进行cdev结构的初始化。通过cdev_add()内核函数将cdev结构添加到内核中,

                    int cdev_add(struct cdev *p,dev_t dev,unsigned count);

                  若cdev_add成功返回,驱动程序就可以有时被内核调用。

                     void cdev_del(struct cdev *dev); 



http://chatgpt.dhexx.cn/article/7Akbhoyp.shtml

相关文章

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

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

【操作系统】设备驱动

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

设备驱动简介

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

Windows设备与驱动器管理

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

linux 没有可用软件包 pstree

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

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

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

模仿pstree 打印进程树

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

pstree 详解

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

Centos安装pstree

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

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

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

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

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

学习一个 Linux 命令:pstree

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

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

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

Android下载安装Apk

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

在Win 11上安装APK

听说在Win11上支持直接安装apk了,所以先把系统升级到了Win11。 1、 安装WSA 因为安装的不是开发版,所以需要下载完整的WSA(安卓子系统),下载操作如下: 首先进入网站 https://store.rg-adguard.net,分别选…

google Play安装APK软件

一、参考资料 此 Google 帐号尚未与设备关联。要安装应用,请先访问设备上的 Play 商店应用 二、相关介绍 利用现有网站平台生成新的Google Play下载APK链接,APK下载器允许APK文件从Google Play直接下载到电脑或移动设备。 三、准备工作 在 Google P…

android怎么安装apk文件,apk文件怎么安装?如何安装apk文件

可能很多已经入手或者将要入手的机友,对Android系统软件如何安装和卸载比较模糊,我们有必要对之有一个系统的了解和认知,这样我们才能更容易上手,熟悉了解这个系统的使用。 一、从手机直接安装 1、将APK 文件拷贝入手机的存储卡,在手机上运行安装好的APK 程序安装器,找到…

cmd 安装 apk

➥ 检查 adb, 如果不是下面 的页面说明;要么配置下 环境变量;要么在 adb.exe 文件夹中执行 adb ;如果你没有 去你 Android SDK 地址拿一个也行 ➥ 直接跑命令 adb install D:\MineGit\flutter_spawn\sdk\demo_2201.apk 如果你电脑 有…

androidP: apk安装流程

一、Android应用安装有如下四种方式 1 系统应用安装――开机时完成,没有安装界面 2.网络下载应用安装――通过market应用完成,没有安装界面 3.ADB工具安装――没有安装界面。 4. 第三方应用安装――通过SD卡里的APK文件安装,有安装界面&#…

APK安装流程及详细步骤

往期推荐 APK打包流程 APK文件结构 Android开发之数据储存 1.1 安装方式 1.安装APK文件共有4种方式: (1)系统程序安装 (2)通过Android市场安装 (3)手机自带安装 (4&#xff09…