Linux源码阅读笔记14-IO体系结构与访问设备

IO体系结构

与外设通信通常称为输入输出,一般缩写为I/O。在实现外设IO的时候,内核必须处理三个可能出现的问题:

  • 必须根据具体的设备类型和模型,使用各种方法对硬件寻址。
  • 内核必须向用户应用程序和系统工具提供访问各种设备的方法。但凡有可能,都应当采用统一的方案,确保程序设计的工作量不会过多,同时保证应用程序能够在不考虑特定硬件方法的情况下进行互操作。
  • 用户空间需要知道内核中有哪些设备可用。

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

系统总线

尽管外设的范围看上去是无线的,但是他们不直接连接到CPU,而是通过总线连接起来。总线负责设备与CPU之间及各个设备之间的通信。有代表性的总线有:

  • PCI(Peripheral Component Interconnect)
  • ISA(Industrial Standard Architecuture)
  • SBus
  • IEEE 1394
  • SCSI(Small Computer System Interface)
  • USB(Universal Serial Bus)
  • 并口与串口(Parallel and Sreial Interface)

与外设交互

与外设通信方法,有几种方法可以与连接到系统的硬件通信

  • IO端口:使用IA-32和很多其他体系结构都有IO端口,在这种情况下,内核发送数据给IO控制器。数据的目标设备通过唯一的端口号标识,数据被传输到设备进行处理。处理器管理一个独立的虚拟地址空间,可能用于管理所有IO地址。IO地址空间不关联到普通的系统内核。因为端口也可以映射到内存中,这样会引起混淆。在IA-32体系结构上,端口地址空间由2的16次方个不同的8位地址组成,通过0x0到0xFFFF之间的数字唯一标识。
  • IO内存映射:程序员必须寻址很多设备,与内存的处理方式类似。因此现在处理器提供对IO端口进行内存地址映射,将特殊外设的端口地址映射到普通内存中。
  • 轮询和中断: 轮询(polling)策略比较健达,只需要重复询问设备数据是否可用,如果可以则处理器取回数据;中断策略比较好,每个CPU都提供中断线,可由各个系统设备共享,每个中断通过唯一号码识别,内核对使用每个中断提供一个服务例程。

通过总线控制设备

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

访问设备

设备特殊文件(设备文件)用于访问扩展设备。这些文件并不关联到硬盘或其他任何存储介质上的数据段,而是建立了与某个设备驱动程勋的连接,以支持与扩展设备的通信。

  • 就应用程序而言,普通文件和设备文件的处理有一定差别。二者都是可以通过同样的库函数处理。
  • /dev目录下的一些成员,特别在访问权限上,访问之前的字母是b或c,分别代表块设备和字符设备;设备文件没有文件长度,而是增加另外两个值,分别是主设备号和次设备号。
  • /dev/hda/dev/hdb/dev/sda/dev/sdb:hda(一般是IDE接口的硬盘,sda一般是指sata接口的硬盘)。
  • 热插拔消息:每当内核检测到一个设备时,都会创建一个内核对象kobject。该对象借助于sysfs文件系统导出用户到用户层,内核还像用户空间发送一条热插拔消息。
  • 网卡和其他设备:字符设备和块设备不是内核管理的全部设备类别。网卡在内核重具有特殊地位,它无法融入到分类方案当中,事实很明显:网卡没有设备文件。相反,用户程序必须使用套接字与网卡通信。套接字是一个抽象层,对所有网卡提供抽象视图。标准库的网络相关函数调用socketcall系统调用与内核通信交互。进而访问网卡。

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

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

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

用于系统连接的输入/输出装置通信,如硬盘,软驱,各种接口、声卡等。设备驱动程序的任务在于支持应用程序由设备文件与设备通讯,是的能够按照适当方式在设备上读取/写入数据。

设备号

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

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

设备文件查询
  • 标识设备文件查询
ls -l /dev
  • 查询/dev目录中与sda硬盘相关的其他设备文件:
ls -l /dev/sda*
动态创建设备文件

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

字符设备

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

hugging face 使用教程———快速入门

概述 本篇存在的意义是快速介绍hugging face使用,梳理主要部件,梳理易混淆概念。原因是:目前hugging face的使用,官方放在了3个地方(参考链接部分):使用文档、NLP教程、Transformers git的readm…

Vue3+Element Plus 实现table表格中input的验证

实现效果 html部分 <template><div class"table"><el-form ref"tableFormRef" :model"form"><el-table :data"form.detailList"><el-table-column type"selection" width"55" align&…

基于springboot+vue+uniapp的养老院系统小程序

开发语言&#xff1a;Java框架&#xff1a;springbootuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#…

repo 工具安装和使用教程(windows+gitee)

repo是什么 官方的定义&#xff1a;Repo是谷歌用python脚本写的调用git的一个脚本&#xff0c;可以实现管理多个git库。 Android的源代码使用Repo 命令行工具来管理多个git仓库&#xff0c;大概有百多个。要想克隆和管理百多个 Git 仓库&#xff0c;不是一件简单的事情。Repo 命…

LoRaWAN网络中的chirpstack

目录 一、chirpstack介绍 二、网关与chirpstack之间的通信 三、NS与AS之间的通信 1、Protobuf 2、gRPC 一、chirpstack介绍 ChirpStack 是一个开源的 LoRaWAN 网络服务器&#xff0c;可用于 设置私有或公共 LoRaWAN 网络。ChirpStack 提供了一个 Web 界面 用于管理网关、设…

HBuilder X中配置vue-cli项目和UI库

目录 一.前端项目结构 二.在HBuilder X中搭建vue-cli项目 1. 安装node.js前端环境 2. HBuilder X创建一个vue-cli项目 3. vue-cli项目结构 4. 如何运行前端项目 5. 创建组件 6. 组件路由(页面跳转) 6.1 创建router目录 6.2 使用路由 6.3 在main.js中配置路由 6.4 路…

【IoTDB 线上小课 05】时序数据文件 TsFile 三问“解密”!

【IoTDB 视频小课】持续更新&#xff01;第五期来啦~ 关于 IoTDB&#xff0c;关于物联网&#xff0c;关于时序数据库&#xff0c;关于开源... 一个问题重点&#xff0c;3-5 分钟详细展开&#xff0c;为大家清晰解惑&#xff1a; IoTDB 的 TsFile 科普&#xff01; 了解了时序数…

系统移植(三)u-boot移植 ① 相关概念

文章目录 一、u-boot概念&#xff08;一&#xff09;概念&#xff08;二&#xff09;获取u-boot源码1.从u-boot官网获取2. 从 STM官网3. 开发板厂商获取 &#xff08;三&#xff09;分析u-boot源码1. u-boot源码的目录结构2. 获取make的帮助信息3. 分析README文件 &#xff08;…

讨逆猴子剪切板,浏览器复制失败?

讨逆猴子剪切板&#xff0c;复制失败&#xff1f; 问题&#xff1a;本地开发情况下可以直接复制&#xff0c;公网就不行了…触发了安全机制。 const link 内容;navigator.clipboard.writeText(link);报错&#xff1a; 解决方案&#xff1a; if (navigator.clipboard &&…

使用代理IP进行本地SEO优化:如何吸引附近的客户?

在今天竞争激烈的互联网时代&#xff0c;如何利用代理IP进行本地SEO优化并吸引附近的客户已经成为许多企业和网站面临的关键挑战。本文将探讨使用代理IP的策略和技巧&#xff0c;以帮助公司提高在本地市场的可见性和吸引力&#xff0c;从而扩大本地客户群体。 1. 代理IP在本地…

Windosw下Visual Studio2022编译FFmpeg(支持x264、x265、fdk-acc)

FFmpeg 7.0 版本移除了 6.0 之前已弃用的 API&#xff0c;无法向下兼容。所以编译的版本选择FFmpeg 6.1.1。 一、安装Visual Studio2022 可参考另外一篇文章&#xff1a;Windows安装Visual Studio2022 QT5.15开发环境_qt5.15.2 vs2022-CSDN博客 二、安装MSYS2 下载地址&…

lua 游戏架构 之 游戏 AI (四)ai_autofight_find_target

定义一个名为 ai_autofight_find_target 的类&#xff0c;继承自 ai_base 类。 lua 游戏架构 之 游戏 AI &#xff08;一&#xff09;ai_base-CSDN博客文章浏览阅读237次。定义了一套接口和属性&#xff0c;可以基于这个基础类派生出具有特定行为的AI组件。例如&#xff0c;可…

大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

Docker+consul容器服务的更新与发现

1、Consul概述 &#xff08;1&#xff09;什么是服务注册与发现 服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的&#xff0c;不保障高可用性&#xff0c;也不考虑服务的压力承载&#xff0c;服务之间调用单纯的通过接口访问。直到后来出现了多个节点…

Spark实时(三):Structured Streaming入门案例

文章目录 Structured Streaming入门案例 一、Scala代码如下 二、Java 代码如下 三、以上代码注意点如下 Structured Streaming入门案例 我们使用Structured Streaming来监控socket数据统计WordCount。这里我们使用Spark版本为3.4.3版本&#xff0c;首先在Maven pom文件中导…

在 Spring Boot 中使用 Filters 实现请求过滤和预处理

​ 博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 什么是过滤器 过滤器&#xff08;Filter&#xff09;是一种在Web应用中用于拦截和处理HTTP请求和响应的对象。 在Java Web开发中&#xff0c;过滤器是实现特定功能&#xff0c;如认证、日志记录和字符编码处…

X-AnyLabeling标注软件使用方法

第一步 下载 官方X-AnyLabeling下载地址 github&#xff1a;X-AnyLabeling 第二步 配置环境 使用conda创建新的虚拟环境 conda create -n xanylabel python3.8进入环境 conda activate xanylabel进入X-AnyLabeling文件夹内&#xff0c;运行下面内容 依赖文件系统环境运行环…

MyBatisPlus复习

目录 自定义sql swagger工具 IService批量新增 代码生成器 DB静态工具&#xff0c;hutool工具 逻辑删除 枚举处理器 Json处理器 分页 自定义sql swagger工具 IService批量新增 代码生成器 DB静态工具&#xff0c;hutool工具 逻辑删除 枚举处理器 Json处理器 分页

ks滑块验证码逆向分析与python识别

文章目录 1. 写在前面3. 接口分析3. 算法实现 【&#x1f3e0;作者主页】&#xff1a;吴秋霖 【&#x1f4bc;作者介绍】&#xff1a;擅长爬虫与JS加密逆向分析&#xff01;Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python…

大模型技术:发展历程、经典模型、微调与应用[更新中...]

文章目录 一、预训练语言模型发展历程二、经典的Pre-trained任务2.1 Masked Language Modeling2.2 Next Sentence Prediction 三、Task-specific Fine-tuning 任务3.1 Single-text Classification (单句分类)3.2 Sentence-pair Classification (句子匹配/成对分类)3.3 Span Tex…