<Linux>(极简关键、省时省力)《Linux操作系统原理分析之Linux 设备管理》(29)

《Linux操作系统原理分析之Linux 设备管理》(29)

  • 10 Linux 设备管理
    • 10.1 Linux 设备分类与识别
      • 10.1.1 Linux 设备的分类
      • 10.1.2 设备文件
    • 10.2 设备驱动程序与设备注册
      • 10.2.1 设备驱动程序
      • 10.2.2 设备注册
    • 10.3Linux 的 I/O 控制方式
      • 10.3.1 查询等待方式((轮询方式 轮询方式)
      • 10.3.2 中断方式
    • 10.4Linux 设备 I/O 操作

10 Linux 设备管理

10.1 Linux 设备分类与识别

10.1.1 Linux 设备的分类

类别详细
字符设备以字符为单位输入输出数据的设备,并且以字符为单位对设备中的信息进行组织和处理。显示器、键盘等
块设备以一定大小的数据块为单位输入输出数据,并且设备中的数据也是以物理块为单位进行组织和管理的。硬盘、软盘、光盘等。
网络设备通过网络与外部近程或远程计算机进行通信的设备。网卡

10.1.2 设备文件

linux 设备管理的特点:物理设备抽象化,把物理设备看成文件,采用文件系统的接口和系统调用来
管理和控制设备。Linux 设备就是一种特殊文件,称为设备文件。

  1. 从设备向内存输入数据,相当于从设备文件读取数据;把数据从内存输出到设备可以看作是把数据写
    入设备文件;启动设备时可以看作是打开设备文件;停止设备可看作是关闭设备文件。
  2. Linux 的设备文件一般置于/dev 目录下。系统中每个设备文件都有设备文件名。设备文件名由两个部分
    组成:
    第一部分 2~3 个字符,表示设备的种类;
    第二部分通常是字母或数字,区分同种设备中的单个设备
    👉IDE 普通硬盘是以 hd 命名;第一个 ide 设备是 hda,第二个是 hdb… ;而 hda1,hda2 表示第一块硬盘的第一、第二个磁盘分区。每个硬盘可以最多有四个主分区,因此 1-4 命名硬盘的主分区。
    逻辑分区是从 5 开始的,每多一个分区,数字加 1 就可以。
    👉SCSI 硬盘是用 sd 命名
    👉软盘是用 fs 命名
  3. Linux 设备中有一个特殊的设备:null 设备。通常称其为“黑洞”设备,并没有实体与之对应。向 null
    设备输出的一切数据都被舍弃。(相当于“回收站”)
  4. 在终端使用 ls –l /dev 查看设备列表
  5. 逻辑设备名( 设备类型, 面向进程),物理设备名(设备文件名,面向内核),设备无关性。
  6. 设备文件与与普通文件的差异
    👉设备文件没有象普通文件那样的文件实体,不在外存占据数据块来存放数据
    👉进程访问普通文件是读写磁盘分区中的数据,访问设备文件是对硬件设备进行读写,完成设备与内存之间的数据传送
  7. 网络设备并不与设备文件对应,故网络设备没有设备文件名,只有逻辑设备名。如系统的第一块以太
    网网卡的逻辑设备名是 eth0。Linux 文件系统不能用来管理和控制网络设备。

10.1.3 Linux 设备的识别
Linux 内核对设备的识别是通过: 设备类型+设备号(主、次设备号)。
👉设备类型:字符设备、块设备
👉主设备号:使用同一个驱动程序的每种设备有一个唯一的主设备号
👉次设备号:区分同种设备中的各个具体设备
主次设备号值都是从 0~255

10.2 设备驱动程序与设备注册

10.2.1 设备驱动程序

在这里插入图片描述
1.功能:
👉对设备进行初始化
👉启动、停止设备的运行
👉把设备上的数据传到内存
👉把数据从内存传送到设备
👉检测设备状态
2. 驱动程序虽然是在设备生产厂家开发的,但装入系统后由内核统一管理,处于内核态,成为内核的一部分。
3. Linux 对设备的管理和控制是使用 VFS 提供的各种数据结构和操作函数实现的
4. 驱动程序的编制:
Linux 中对文件的操作使用的是 VFS 虚拟文件系统的文件操作接口,即 file_operations 结构 。
file_operations 结构是文件操作函数指针的集合,在设备管理中,该结构体各个成员项指向的操作函数就是设备驱动程序的各个操作例程。
编制设备驱动程序的工作就是使用汇编或 c 语言编写控制设备完成各种操作的例程,然后把这些操作例程的入口地址赋予 file_operations 结构体的有关成员项即可。
各个操作函数的主要功能:
在这里插入图片描述

10.2.2 设备注册

当一种设备安装到系统时,必须向系统进行注册,注册之后才能使用,设备注册的任务是把驱动程
序加载到系统中。
👉设备的驱动程序是系统在启动时装载到系统中的;
👉对于“即装即用”设备,驱动程序作为程序模块可以随时加载到系统中,

  1. 设备注册表
    两个设备注册表:字符设备注册表、块设备注册表。
#define MAX_CHRDEV 255
#define MAX_BLKDEV 255
static struct device_struct chrdevs[MAX_CHRDEV]; 
static struct device_struct blkdevs[MAX_BLKDEV];
每个注册表都有 255 个表项,每个表项表示一个设备,都是一个 device_struct 结构,称为设备描述符。
在 fs/device.c 中。
struct device_struct {
const char * name; /*指向设备名字符串*/
struct file_operations * fops; /*指向文件操作函数 file_operations 的指针*/
};

在这里插入图片描述
说明:
👉设备注册表的下标是某种设备的主设备号。使用主设备号作为索引就可以从设备注册表得到这种
设备的驱动程序。
👉两个注册表的第一个表项通常为 null,因为系统中不存在主设备号为 0 的字符设备和块设备。

  1. 设备注册函数
    设备被注册时,系统首先构筑 file_operations 结构体,然后把驱动程序的各个操作函数的入口地址
    赋予结构体的有关成员项,成员项没有对应函数时,则置为 null。设备注册是通过系统调用注册函数实现
    的。在 fs/device.c 中。
    字符设备注册函数:
int register_chrdev(unsigned int major, const char * name, struct file_operations *fops)

块设备注册函数:

int register_blkdev(unsigned int major, const char * name, struct file_operations *fops)

👉若major=0。注册一个新设备,由系统自动分配一个主设备号给驱动程序,成功则返回主设备号。
👉若major!=0,此时注册函数可以变更主设备号为 major 的设备的: 设备名或驱动程序。 成功返回0;

if (major == 0)
 {
for (major = MAX_CHRDEV-1; major > 0; major--) 
if (chrdevs[major].fops == NULL) /*从注册表 chrdevs[]的底部开始,,,,向上搜寻一个空表项 向上搜寻一个空表项。。。。
{
chrdevs[major].name = name;
chrdevs[major].fops = fops;
write_unlock(&chrdevs_lock);
return major;
}
}
write_unlock(&chrdevs_lock);
return -EBUSY;
}
  1. 设备注销
    当设备需要撤销时,可以使用注销函数从设备注册表中删除。
int unregister_blkdev(unsigned int major, const char * name) /* 块设备注销函数*/
int unregister_chrdev(unsigned int major, const char * name) /* 字符设备注销函数*/
{
if (strcmp(chrdevs[major].name, name)) return -EINVAL;
chrdevs[major].name = NULL;
chrdevs[major].fops = NULL;
return 0;
}

10.3Linux 的 I/O 控制方式

Linux 对设备的输入、输出过程实际上是在 cpu 的控制下主机(内存)与外部设备之间传送数据的过程。
所以 Linux 的 I/O 控制方式有 3 种:
👉查询等待方式
👉中断方式
👉DMA 方式

10.3.1 查询等待方式((轮询方式 轮询方式)

驱动程序不断检测设备状态,当设备准备好传送数据时,cpu 执行驱动完成一次 I/O 过程,若设备未转备好,则驱动程序反复检测设备状态,直到设备转备好。适用于:不支持设备中断的系统、系统支持的中断数目有限时;例如并行接口(打印机接口)的驱动程序中默认的控制方式就是轮询方式。

10.3.2 中断方式

当进程向设备提出 I/O 请求时并不等待设备完成 I/O 操作,而是把 cpu 让给其它进程使用,自己则进入睡眠状态。在设备完成 I/O 操作时发出中断信号,系统根据中断信号调用相应的中断服务唤醒等待的进程继续执行后面的操作。

在机器硬件支持中断的情况下,设备驱动程序就可以使用中断方式控制设备的 I/O 操作。因此,设备驱动程序中处理包含各种操作函数外,同时还要提供进行各种中断处理的中断服务例程。CPU 接受到来自硬件的中断请求后,则通过中断请求好就能够执行该设备驱动程序的中断服务例程。

  1. 中断服务例程
    👉 中断服务例程描述表:Linux 中,各种中断服务例程是通过中断服务例程描述表进行管理。中断
    服务例程描述表是一个名为 Irq_action 的指针数组,定义如下:
    Static struct irqaction * irq_action[NR_IRQS+1];
    👉中断服务例程描述符:Irqaction 结构体;
    👉机器支持硬件中断源的数目:NR_IRQS;
    👉中断服务例程描述表数组的下标:与中断请求号 IRQ 对应,使用 IRQ 作为索引就可以找到该设备的中断例程描述符。

  2. Irqaction 结构体

Irqaction 结构体定义在/include/linux/interrupte.h 中,如下所示:
Struct irqaction
{
Void(*handler)(int,void*,struct pt_regs*)/*指向中断服务例程*/
Unsigned long flags; /*中断标志*/
Unsigned long mask; /*中断掩码*/
Const char *name; /*设备名*/
Void *dev_id; /*设备号*/
Struct irqaction *next; /*指向下一个描述符:允许多个设备共享一个中断
请求号 IRQ,一个 IRQ 对应的多个中断例程描述符链接成一个单向链表*/
}

在这里插入图片描述

  1. Request_irq()
    在设备驱动程序加载时,通过调用内核函数 Request_irq()建立驱动程序中断例程描述符 irqaction 结构体,并把它登记到 Irq_action 数组中。Request_irq()与硬件相关。在 80x86 机器上 Request_irq()函数定义在arch/i386/kernel/irq.c 中:
int request_irq(unsigned int irq, void (*handler)(int, void *, struct pt_regs *),unsigned long irqflags, const 
char * devname, void *dev_id)
  1. free_irq()
    撤消中断例程时,可以使用函数:
Void free_irq(unsigned int irq, void *dev_id)

把中断例程描述符表中下标为 irq,设备号为 dev_id 占用的表项释放。

10.4Linux 设备 I/O 操作

10.4.1 设备 I/O 操作

  1. 设备文件的建立 设备文件的建立
    调用:mknod (const char *pathname, mode_t mode, dev_t dev)
    终端:mknod /dev/name type major minor
    提供文件名、类型、主设备号 、次设备号

  2. 设备文件的打开 设备文件的打开、关闭

int open(const char *pathname,int flags) /*flag 给出的对文件的处理方式:只读、只写、读写*/
int close(int fd) /*fd 设备的文件标识号*/
  1. 的读写 的读写
int read(int fd,void *buf,int count)
int write(int fd,void *buf,int count)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/230318.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Docker, Docker-compose部署Sonarqube

参考文档 镜像地址: https://hub.docker.com/_/sonarqube/tags Docker部署文档地址 Installing from Docker | SonarQube Docs Docker-compose文档部署地址: Installing from Docker | SonarQube Docs 部署镜像 2.1 docker部署 # 宿主机执行 $. vi /etc/sysctl.conf…

探索CSS:从入门到精通Web开发(二)

前言 当我们谈论网页设计和开发时,CSS(层叠样式表)无疑是其中的重要一环。作为HTML的伴侣,CSS赋予网页以丰富的样式和布局,使得网站看起来更加吸引人并且具备更好的可读性。本书将通过一系列深入浅出的方式&#xff0…

kafka学习笔记--安装部署、简单操作

本文内容来自尚硅谷B站公开教学视频,仅做个人总结、学习、复习使用,任何对此文章的引用,应当说明源出处为尚硅谷,不得用于商业用途。 如有侵权、联系速删 视频教程链接:【尚硅谷】Kafka3.x教程(从入门到调优…

深入理解 Promise:前端异步编程的核心概念

深入理解 Promise:前端异步编程的核心概念 本文将帮助您深入理解 Promise,这是前端异步编程的核心概念。通过详细介绍 Promise 的工作原理、常见用法和实际示例,您将学会如何优雅地处理异步操作,并解决回调地狱问题。 异步编程和…

python主流开发工具排名,python开发工具有哪些

本篇文章给大家谈谈python的开发工具软件有哪些,以及python主流开发工具排名,希望对各位有所帮助,不要忘了收藏本站喔。 python中用到哪些软件 一、Python代码编辑器1、sublime Textsublime Text是一款非常流行的代码编辑器,支持P…

基于单片机指纹考勤机控制系统设计

**单片机设计介绍,基于单片机指纹考勤机控制系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的指纹考勤机控制系统是一种用于管理员工考勤和实现门禁控制的设计方案。它通过使用单片机作为主控制器…

Amazon CodeWhisperer 提供新的人工智能驱动型代码修复、IaC 支持以及与 Visual Studio 的集成...

Amazon CodeWhisperer 的人工智能(AI)驱动型代码修复和基础设施即代码(IaC)支持已正式推出。Amazon CodeWhisperer 是一款用于 IDE 和命令行的人工智能驱动型生产力工具,现已在 Visual Studio 中推出,提供预…

nodejs微信小程序+python+PHP的游戏测评网站设计与实现-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性:…

初识Matter——esp-box控制两盏灯

初识Matter 一、效果展示 二、准备 1.ubuntu系统/Mac系统电脑 2.安装esp-idf及esp-matter环境 3.esp-box设备 4.两块esp32 5.两个led灯或使用板载灯 三、烧录固件(esp-box) 下载esp-box例程 git地址:GitHub - espressif/esp-box: Th…

微信小程序 - PC端选择ZIP文件

微信小程序 - PC端选择文件 分享代码片段场景分析解决思路附魔脚本chooseMediaZip 选择附魔后的ZIP文件相关方法测试方法 参考资料 分享代码片段 不想听废话的,直接看代码。 https://developers.weixin.qq.com/s/UL9aojmn7iNU 场景分析 如果你的微信小程序需要选…

机器视觉相机镜头光源选型

镜头选型工具 - HiTools - 海康威视 Hikvisionhttps://www.hikvision.com/cn/support/tools/hitools/cl8a9de13648c56d7f/ 海康机器人-机器视觉产品页杭州海康机器人股份有限公司海康机器人HIKROBOT是面向全球的机器视觉和移动机器人产品及解决方案提供商,业务聚焦于…

dell服务器重启后显示器黑屏

1.硬件层面:观察主机的指示灯 (1)指示灯偏黄,硬件存在问题(内存条有静电,拔出后用橡皮擦擦拭;或GPU松动) a.电源指示灯黄,闪烁三下再闪烁一下,扣下主板上的纽…

response应用及重定向和request转发

请求和转发: response说明一、response文件下载二、response验证码实现1.前置知识:2.具体实现:3.知识总结 三、response重定向四、request转发五、重定向和转发的区别 response说明 response是指HttpServletResponse,该响应有很多的应用&…

从阻抗匹配看拥塞控制

先来理解阻抗匹配,但我不按传统方式解释,因为传统方案你要先理解如何定义阻抗,然后再学习什么是输入阻抗和输出阻抗,最后再看如何让它们匹配,而让它们匹配的目标仅仅是信号不反射,以最大能效被负载接收。 …

数据结构——二叉树的链式结构

个人主页:日刷百题 系列专栏:〖C语言小游戏〗〖Linux〗〖数据结构〗 〖C语言〗 🌎欢迎各位→点赞👍收藏⭐️留言📝 ​ 一、二叉树的创建 这里我们使用先序遍历的思想来创建二叉树,这里的内容对于刚接触二…

【银行测试】金融项目+测试方法范围分析,功能/接口/性能/安全...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、金融行业软件特…

[Linux] 基于LAMP架构安装论坛

一、安装Discuz论坛 1.1 创建数据库,并进行授权 mysql -u root -p123CREATE DATABASE bbs; #创建一个数据库GRANT all ON bbs.* TO bbsuser% IDENTIFIED BY admin123; #把bbs数据库里面所有表的权限授予给bbsuser,并设置密码admin123flush privileges; #刷新数据库…

数据库——数据库与表

智能2112杨阳 一、目的与要求: 1、掌握MySQL中如何创建数据库和表的方法 熟练掌握MySQL的数据类型、主键实体完整性的设置参照完整性的定义及应用插入数据数据库的备份操作 二、内容: 1、创建名为fruitshop的数据库&#xff0…

使用静态HTTP提供动态内容

在Web开发中,静态HTTP和动态HTTP常被视作两种截然不同的技术。静态HTTP主要用于传输不变的内容,如HTML、CSS和JavaScript文件,而动态HTTP则能处理用户交互、实时数据等动态需求。但鲜为人知的是,我们其实可以通过一些技巧&#xf…

【数据分析实战】酒店行业华住集团门店分布与评分多维度分析

文章目录 1. 写在前面2. 数据集展示3. 多维度分析3.1 门店档次多元化:集团投资战略观察3.1.1 代码实现3.1.2 本人浅薄理解 3.2 门店分布:各省市分布概览3.2.1 代码实现3.2.2 本人浅薄理解 3.3 门店分级评分:服务水平的多维度观察3.3.1 代码实…