当前位置: 首页 > news >正文

Linux 内核源码分析---I/O 体系结构与访问设备

I/O 体系结构

与外设的通信通常称之为输入输出,一般都缩写为I/O。
在实现外设的I/O时,内核必须处理3个可能出现的问题:
(1)必须根据具体的设备类型和模型,使用各种方法对硬件寻址
(2)内核必须向用户应用程序和系统工具提供访问各种设备的方法。但凡有可能,都应当采用统一的方案,确保程序设计的工作量不会过多,同时保证应用程序能够在不考虑特定硬件方法的情况下进行互操作;
(3)用户空间需要知道内核中有哪些设备可用

硬件设备可能以多种方式连接到系统,主板上的扩展槽或外部连接器最常见的方法,当然,扩展硬件也可以直接集成到主板上。

在这里插入图片描述

1.系统总线

尽管外设的范围可能看上去是无限的,它们并不直接连接到CPU,而是通过总线连接起来。
总线负责设备与CPU之间及各个设备之间的通信。
在这里插入图片描述

如下为代表性的总线:
a.PCI(Peripheral Component Interconnect):定义了 32 位数据总线,且可扩展为 64 位。PCI 总线主板插槽的体积比原 ISA 总线插槽还小,其功能比 VESA、ISA 有极大的改善,支持突发读写操作,最大传输速率可达 132MB/s,可同时支持多组外围设备。PCI局部总线不能兼容现有的 ISA、EISA、MCA(microchannelarchitecture)总线,但它不受制于处理器,是基于奔腾等新一代微处理器而发展的总线。
b.ISA(Industrial Standard Architecture):总线标准是 IBM 公司 1984 年为推出 PC/AT 机而建立的系统总线标准,所以也叫AT总线。它是对XT总线的扩展,以 适应 8/16 位数据总线要求。它在 80286 至 80486 时代应用非常广泛,以至于现在奔腾机中还保留有ISA总线插槽。ISA总线有98只引脚。
c.SBus:全称Serial Bus,即串行通信总线。本质上是一种串口通信协议,采用100K的波特率,8位数据位,2位停止位,偶效验,即8E2的串口通信。
d.IEEE1394
e.SCSI(Small Computer System Interface)
f.USB(Universal Serial Bus):通用串行总线USB是由Intel、Compaq、Digital、IBM、Microsoft、NEC、NorthernTelecom等7家世界著名的计算机和通信公司共同推出的一种新型接口标准。它基于通用连接技术,实现外设的简单快速连接,达到方便用户、降低成本、扩展PC连接外设范围的目的。它可以为外设提供电源,而不像普通的使用串、并口的设备需要单独的供电系统。
g.并口与串口(Parallel and Serial Interface)

总线的分类和区别

2.与外设交互

与外设通信的方法,有几种方法可以与连接到系统的硬件通信
a.I/O端口
使用 IA-32 和很多其他体系结构上都有 I/O 端口,在这种情况下,内核发送数据给 I/O 控制器。数据的目标设备通过唯一的端口号标识,数据被传输到设备进行处理。处理器管理一个独立的虚拟地址空间,可以用于管理所有 I/O 地址。I/O 地址空间不关联到普通的系统内核。因为端口也可以映射到内存中,这样会引起混淆。
在IA-32体系结构上,端口地址空间由 2 的 16 次方(大约 64000 )个不同的8位地址组成,通过0x00xFFFF之间的数字唯一标识。

1、每个连接到I\O总线上的设备都有自己的I\O地址集,通常称为I\O端口。
2、一共提供了65536个8位的端口,可以把两个连续的8位端口看成一个16位端口,但是这必须从偶数地址开始。
3、可以讲2个8位的看作一个16位的(必须从偶数开始),2个16位的看作一个32位的端口(必须从4倍数开始)
4、对端口对读写命令 in、ins、out、outs
5、为了提高性能提供控制寄存器、状态寄存器、输入寄存器、输出寄存器

深入理解Linux内核-I/O体系结构和设备驱动程序

b.I/O内存映射
程序员必须寻址很多设备,与内存的处理方式类似。因此现在处理器提供对 I/O 端口进行内存映射,将特殊外设的端口地址映射到普通内存中。

c.轮询和中断
轮询(polling)策略比较简单,只需要重复询问设备数据是否可用,如果可用,则处理器取回数据。
中断策略比较好。每个CPU都提供中断线,可由各个系统设备共享,每个中断通过一个唯一号码标识,内核对使用的每个中断提供一个服务例程。

3.通过总线控制设备

并非所有设备都是直接通过I/O语句寻址,也有通过总线系统访问的。具体的方式与所使用的总线和设备相关。并非所有设备类别都可以连接到所有总线系统(比如:将硬盘和CD记录机连接到SCSI接口,但图形卡就行)。

访问设备

设备特殊文件(设备文件)用于访问扩展设备。这些文件并不关联到硬盘或任何其他的存储介质上的数据段,而是建立了与某个设备驱动程序的连接,以支持与扩展设备的通信。
就应用程序而言,普通文件和设备文件的处理有一定差别。二者都是可以通过同样的库函数处理。

字符设备、块设备和其他设备

根据外设与系统之间交换数据的方法,可以将设备分为几种类别。有些设备非常适合于面向字符的数据交换,因为数据传输量很低。其他的设备则更适合于处理包含固定数目字节的数据块。内核会区分字符设备和块设备。

1、/dev目录下一些成员,特别在访问权限上面,访问之前的字母是 b 或 c,分别代表块设备和字符设备;设备文件没有文件长度,而增加另外两个值,分别是主设备号和从设备号。
2、/dev/hda/dev/hdb/dev/sdadev/sdb:hda(一般指IDE接口的硬盘,sda-般指sata接口硬盘)

标识设备文件:
在这里插入图片描述

查询/dev目录中与sda硬盘有关的其他设备文件:
在这里插入图片描述

3、热插拔消息:新设备
每当内核检测到一个设备时,都会创建一个内核对象 kobject。该对象借助于 sysfs 文件系统导出到用户层,内核还向用户空间发送一个热插拔消息。
在这里插入图片描述

sysfs文件系统是一种特殊的文件系统,被安装于/sys目录下的/proc文件系统相似。
/proc文件系统是首次被设计成允许用户态应用程序访问内核内部数据结构的一种文件系统。
/sysfs文件系统本质上与/proc有相同的目的,但是它还提供关于内核数据结构的附加信息;此外,/sysfs的组织结构比/proc更有条理。或许,在不远的将来,/proc和/sysfs将会继续共存。

sysfs文件系统的目标是要展现设备驱动程序模型组件间的层次关系。该文件系统的相应高层目录是:
block:块设备,它们独立于所连接的总线。
devices:所有被内核识别的硬件设备,依照连接它们的总线对其进行组织。
bus:系统中用于连接设备的总线。
drivers:在内核中注册的设备驱动程序。
class:系统中设备的类型;同一类可能包含由不同总线连接的设备,于是由不同的驱动程序驱动。
power:处理一些硬件设备电源状态的文件。
firmware:处理一些硬件设备的固件的文件。

4、网卡及其它设备
字符设备和块设备不是内核管理的全部设备类别
网卡在内核中具有特殊地位,它无法融入到分类方案当中,事实很明显:网卡没有设备文件。相反,用户程序必须使用套接字与网卡通信。套接字就是一个抽象层,对所有网卡提供一个抽象视图。标准库的网络相关函数调用socketcall系统调用与内核通信交互。进而访问网卡。

5、字符设备与块设备
字符设备:提供连续的数据流,应用程序可以顺序读取,通常不支持随机存取,相反,此类设备支持按字节字符读取。比如:调度解调器是典型的字符设备。
块设备:应用可以随机访问设备数据,程序可自行确定读取数据的位置。比如:硬盘是块设备,应用程序可以寻址磁盘上的任何位置,并由此读取数据。

动态创建设备文件
/dev 中的设备结点一般是在基于磁盘的文件系统中静态创建的。随着支持设备越来越多,必须安置和管理越来越多的项,典型发布版大约包含 20000 项。几乎所有的发布版都将 /dev 内容的管理工作切换到 udevd,这是一个守护进程,允许从用户层动态创建设备文件。
udevd 基本思想,即使从用户层管理设备文件,内核的支持也是绝对必须的,否则就无法判断系统上有哪些设备可用。

字符设备

在这里插入图片描述

a.设备号
主设备号是用来标识与设备文件相连的驱动程序,主设备号用来反映设备类型;次设备号被驱动程序用来辨别操作的是哪个设备,并区分同类型的设备。

设备号,就是系统分配一个编号,设备号是一个无符号的 32 位整型,包括主设备号+次设备号,主设备号为高12位,次设备号为低20位

设备文件需要设备号才能够创建,设备驱动也需要设备号才载装载,设备文件正是通过主设备号找到它的驱动;设备驱动正是利用次设备号才知道他要操作的具体是哪一个设备。

b.字符设备管理框架
在这里插入图片描述
在这里插入图片描述

c.字符设备数据结构
在这里插入图片描述

d.管理设备驱动程序函数的数据结构
在这里插入图片描述

I/O体系结构和设备驱动程序

相关文章:

Linux 内核源码分析---I/O 体系结构与访问设备

I/O 体系结构 与外设的通信通常称之为输入输出,一般都缩写为I/O。 在实现外设的I/O时,内核必须处理3个可能出现的问题: (1)必须根据具体的设备类型和模型,使用各种方法对硬件寻址; &#xff08…...

在cPanelWHM中如何重置 MySQL 用户帐户密码

更改MySQL用户账户密码非常简单。服务器管理员可以在WHM中编辑任何MySQL用户的帐户。cPanel用户可以编辑其帐户管理的数据库的密码。 在WHM中更改MySQL用户帐户密码 打开WHM,在侧边菜单中的SQL服务下选择“Change MySQLUser Password”。Hostease的服务器产品提供稳…...

软件测试基础1--功能测试

1、什么是软件测试? 软件是控制计算机硬件运行的工具。 软件测试:使用技术手段验证软件是否满足使用需求,为了发现软件功能和需求不相符合的地方,或者寻找实际输出和预期输出之间的差异。 软件测试的目的:减少软件缺陷…...

《计算机网络》(第8版)第9章 无线网络和移动网络 复习笔记

第 9 章 无线网络和移动网络 一、无线局域网 WLAN 1 无线局域网的组成 无线局域网提供移动接入的功能,可分为两大类:有固定基础设施的和无固定基础设 施的。 (1)IEEE 802.11 IEEE 802.11 是无线以太网的标准,是有固定…...

非负数、0和正整数 限制最大值且保留两位小数在elementpuls表单中正则验证

一、结构 <el-form-item label"单价&#xff1a;" prop"price"><el-inputv-model.trim"formData.price"placeholder"请输入"blur"formMethod.fixTwo"><template #append>(元)</template></el-i…...

Java多线程-----定时器(Timer)及其实现

目录 一.定时器简介&#xff1a; 二.定时器的构造方法与常见方法&#xff1a; 三.定时器的模拟实现&#xff1a; 思路分析&#xff1a; 代码实现&#xff1a; 在开发中&#xff0c;我们经常需要一些周期性的操作&#xff0c;例如每隔几分钟就进行某一项操作&#xff0c;这…...

【Linux修行路】进度条小程序

目录 ⛳️推荐 一、预备知识 1.1 回车换行 1.2 缓冲区 二、倒计时 2.1 注意事项 三、进度条 3.1 源代码 3.2 代码分析 3.2 实际使用场景 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家…...

网络安全入门教程(非常详细)从零基础入门到精通,看完这一篇就够了。

学前感言: 1.这是一条坚持的道路,三分钟的热情可以放弃往下看了.2.多练多想,不要离开了教程什么都不会了.最好看完教程自己独立完成技术方面的开发.3.有时多google,baidu,我们往往都遇不到好心的大神,谁会无聊天天给你做解答.4.遇到实在搞不懂的,可以先放放,以后再来解决. 基…...

【探索Linux】P.44(数据链路层 —— 以太网的帧格式 | MAC地址 | MTU | ARP协议)

阅读导航 引言一、认识以太网二、以太网的帧格式三、MAC地址四、MTU五、ARP协议温馨提示 引言 在深入探讨了网络层的IP协议之后&#xff0c;本文将带领读者进一步深入网络的底层——数据链路层。我们将详细解析以太网的帧格式&#xff0c;这是数据链路层传输数据的基本单元&am…...

<数据集>航拍行人识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;7482张 标注数量(xml文件个数)&#xff1a;7482 标注数量(txt文件个数)&#xff1a;7482 标注类别数&#xff1a;1 标注类别名称&#xff1a;[people, pedestrian] 序号类别名称图片数框数1people5226385602pedes…...

在 Windows 10 系统上部署 Medusa

先决条件 在安装 Medusa 之前&#xff0c;你需要确保已经安装了以下工具&#xff1a; Node.js: Medusa 需要 Node.js v16 或更高版本。你可以从 Node.js 官网下载并安装。Git: Git 用于从 GitHub 获取 Medusa 的源代码。你可以从 Git 官网下载并安装。PostgreSQL: Medusa 使用…...

Linux进程 (冯诺依曼体结构 管理 PCB 进程状态 僵尸进程 孤儿进程 运行阻塞挂起状态 进程优先级)

文章目录 一.冯诺依曼体系结构冯诺依曼结构能干什么&#xff1f; 二.操作系统概念结构图(不完整)为什么要有操作系统&#xff1f; 尝试理解操作系统管理结构图(完整)总结&#xff1a; 三.进程进程是什么&#xff1f;PCB为什么要有PCB&#xff1f; Linux中的PCB进程的task_struc…...

《LlamaIndex 之美》-01-LLM、Prompt、Embedding基础入门

在基于数据构建任何 LLM 应用程序时&#xff0c;选择合适的大型语言模型 &#xff08;LLM&#xff09; 是您需要考虑的首要步骤之一。 LLM 是 LlamaIndex 的核心组成部分。它们可以作为独立模块使用&#xff0c;也可以插入到其他核心 LlamaIndex 模块&#xff08;索引、检索器…...

C++ 智能指针简单介绍及用法

C 智能指针简单介绍及用法 智能指针是 C11 引入的一个非常实用的特性&#xff0c;旨在自动管理动态分配的内存&#xff0c;避免内存泄漏和悬空指针问题。主要有三种类型的智能指针&#xff1a;std::unique_ptr、std::shared_ptr 和 std::weak_ptr。下面是对它们的详细介绍&…...

k8s笔记之创建Istio Gateway规则

创建Istio Gateway 背景如何创建Istio Gateway规则配置方式rewrite重写路径直接去除match&#xff0c;默认都转发到一个服务路由规则多种配置方式实践&#xff08;即开头的完整版&#xff09; 涉及的命令补充注意事项 背景 为什么需要使用到Istio Gateway&#xff1f;充当k8s服…...

NAND行业回归盈利:AI与云存储需求驱动

市场概览 根据Yole Group于2024年6月25日发布的市场报告&#xff0c;经过五个季度的亏损之后&#xff0c;NAND闪存行业在2024年第一季度&#xff08;1Q24&#xff09;实现了盈利回归。这一转变主要得益于企业级固态硬盘&#xff08;SSD&#xff09;领域的强劲需求增长&#xf…...

【限免】频控阵雷达:概念、原理与应用【附MATLAB代码】

​微信公众号&#xff1a;EW Frontier QQ交流群&#xff1a;949444104 主要内容 PDA、FDA MATLAB代码 %---------------------------------------- %功能:FDA和相控阵天线方向图 %版本:ver1.0 %时间:2017.11.1 %--------------------------------------- clear all; clc; disp…...

从0开始搭建vue + flask 旅游景点数据分析系统( 六):搭建后端flask框架

这一期开始开发header部分&#xff0c;预期实现两个目标&#xff1a; 创建 Flask 项目导入旅游数据后端实现旅游数据的查询 1 python 环境 & 开发环境 python 安装和pycharm安装需要去网上找包&#xff0c;建议python使用3.8 或者3.9版本 2 新建项目 我们新建一个文件…...

学习硬件测试04:触摸按键+PWM 驱动蜂鸣器+数码管(P62~P67、P71、P72)

一、触摸按键 1.1理论讲解 1.1.1实验现象 触摸按键 1 单击与长按&#xff0c;控制 LED1&#xff1b;触摸按键 2 单击与长按&#xff0c;控制 LED2;触摸按键 3 单击与长按&#xff0c;控制 LED3;触摸按键 4 单击与长按&#xff0c;控制继电器; 1.1.2硬件电路 是原理图上触摸…...

JS原型链

JS的原型链 文章目录 JS的原型链前言一、原型是什么&#xff1f;二、原型链总结 前言 在使用数组或对象中的方法时&#xff0c;你是不是会感觉很奇怪&#xff0c;为什么仅仅是创建了一个数组或是对象&#xff0c;就能够使用它提供的方法呢&#xff1f;JS是怎么做到的呢&#x…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

Bean 作用域有哪些?如何答出技术深度?

导语&#xff1a; Spring 面试绕不开 Bean 的作用域问题&#xff0c;这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开&#xff0c;结合典型面试题及实战场景&#xff0c;帮你厘清重点&#xff0c;打破模板式回答&#xff0c…...

沙箱虚拟化技术虚拟机容器之间的关系详解

问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西&#xff0c;但是如果把三者放在一起&#xff0c;它们之间到底什么关系&#xff1f;又有什么联系呢&#xff1f;我不是很明白&#xff01;&#xff01;&#xff01; 就比如说&#xff1a; 沙箱&#…...

CVE-2023-25194源码分析与漏洞复现(Kafka JNDI注入)

漏洞概述 漏洞名称&#xff1a;Apache Kafka Connect JNDI注入导致的远程代码执行漏洞 CVE编号&#xff1a;CVE-2023-25194 CVSS评分&#xff1a;8.8 影响版本&#xff1a;Apache Kafka 2.3.0 - 3.3.2 修复版本&#xff1a;≥ 3.4.0 漏洞类型&#xff1a;反序列化导致的远程代…...

初探用uniapp写微信小程序遇到的问题及解决(vue3+ts)

零、关于开发思路 (一)拿到工作任务,先理清楚需求 1.逻辑部分 不放过原型里说的每一句话,有疑惑的部分该问产品/测试/之前的开发就问 2.页面部分(含国际化) 整体看过需要开发页面的原型后,分类一下哪些组件/样式可以复用,直接提取出来使用 (时间充分的前提下,不…...