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.rhkb.cn/news/386873.html

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

相关文章

maven引入了jar包但在class文件里找不到jar包里的类

在工作当中遇到的这个问题,别人引入的jar包,我代码里报错 maven clean 和 maven install 都不管用 检查过了pom文件 检查了maven仓库路径下是否有这个cn.hutool的jar包 都没有找到问题 最终解决办法是手动引入 步骤一:点击左上角file->…

Golang | Leetcode Golang题解之第290题单词规律

题目: 题解: func wordPattern(pattern string, s string) bool {word2ch : map[string]byte{}ch2word : map[byte]string{}words : strings.Split(s, " ")if len(pattern) ! len(words) {return false}for i, word : range words {ch : patt…

基于python的百度迁徙迁入、迁出数据分析(四)

这篇文章是对上篇文章的可获取数据的时间区间的修正,依然通过开发者模式找寻相关数据源,我直接把数据url贴在这里,可以发现里面包含了相对明面上看不到的数据包括,行政区id、春运迁徙数据等:qianxi.cdn.bcebos.com/app…

【C语言报错已解决】“Undefined Reference”

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 引言: 在开发过程中,我们经常会遇到各种编译错误或运行时错误。其中,“Undefined Referenc…

The Llama 3 Herd of Models 第5部分,结果部分全文

第1-3部分 第4部分 5 Results 我们对Llama 3进行了一系列广泛的评估,调查了:(1)预训练语言模型的性能,(2)后训练语言模型的性能,以及(3)Llama 3的安全特性。我们在下面单独的小节中提出这些评估的结果。 5.1 Pre-trained Language Model 预训练语言模型 在本节中,我们报…

逻辑回归推导

逻辑回归既可以看作是回归算法,也可以看做是分类算法。通常作为分类算法使用,只可以解决二分类问题。 在上述平面中,每个颜色代表一个类别,即有4个类别 将红色的做为一个类别,其他三个类别都统称为其他类别&#xff0…

C#初级——枚举

枚举 枚举是一组命名整型常量。 enum 枚举名字 { 常量1, 常量2, …… 常量n }; 枚举的常量是由 , 分隔的列表。并且,在这个整型常量列表中,通常默认第一位枚举符号的值为0,此后的枚举符号的值都比前一位大1。 在将枚举赋值给 int 类型的…

完成stable将图片转换为二维码

1.创建虚拟环境 conda create -n stable python=3.10.6 2.克隆项目 git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui 或者 git clone https://kgithub.com/AUTOMATIC1111/stable-diffusion-webui 3.安装依赖(-i https://pypi.tuna.tsinghua.edu.cn/s…

大数据-54 Kafka 安装配置 环境变量配置 启动服务 Ubuntu配置 ZooKeeper

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…

抓包工具——wireshark的使用

​ 什么是wireshark wireshark是一个数据包捕捉程序。和linux下的tcpdump,以及sniffer,Fidder等软件功能类似。按理说,我们的计算机中的网卡设备只会将发给本机的数据包传输到上层进行解析,而其他的数据包会进行丢弃,…

纯原创【车牌识别】基于图像处理的车牌识别——matlab项目实战(含GUI界面)详解

摘要 车牌识别系统乃计算机视觉与模式识别技术于智能交通领域的重要研究课题之一。其作用在于从复杂背景里提取运动中的汽车牌照,进而识别出车牌号码。车牌识别技术在高速公路电子收费、日常停车场管理以及交通违章监控等场景得到广泛运用。它的问世对于维护交通安全…

MongoDB 基础知识

一、为什么学习MongoDB MongoDB解决Mysql 的“三高”问题: 1.对数据库高并发写入需求 2.对海量数据高效率存储访问需求 3.对数据库高扩展和高可用的需求 MongoDB 实际应用: 1.社交场景,比如朋友圈,附近的人的地点的存储 2.…

【JAVA开发笔记】Reids下载、安装、配置-Windows篇(超详细,含Redis可视化管理工具!!!)

目录 1. Redis 简介 2. 下载 Redis 安装包 3. 开启 Redis 服务 4. 配置环境变量 5. Redis 服务注册为系统服务 6. Redis 服务测试和简单使用 7. 下载安装 Redis 管理工具 8. 管理工具连接 Redis 服务器 1. Redis 简介 Redis(Remote Dictionary Server&…

SpringBoot 整合 Redis 实现验证码登录功能

一、整合Redis 在pom.xml中添加Redis相关依赖&#xff1b; <!--Spring Data Redis依赖配置--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency>…

永结无间Ⅵ--第一支AI测试团队

我们都梦想拥有一支 AI 测试团队。每个工程团队都应该测试他们的应用程序&#xff0c;但测试速度慢、成本高&#xff0c;而且很少能提供足够的覆盖范围。大多数团队几乎没有测试。专门的测试人员或供应商往往会忽略测试的许多方面。测试人员希望专注于测试中有趣且重要的方面&a…

WPF的MVVM架构:如何通过数据绑定简化UI逻辑

WPF的MVVM架构&#xff1a;如何通过数据绑定简化UI逻辑 目录 MVVM模式概述数据绑定在MVVM中的作用实现MVVM模式的步骤MVVM模式中的常见问题与解决方案实践示例总结 MVVM模式概述 MVVM&#xff08;Model-View-ViewModel&#xff09;是一种设计模式&#xff0c;用于WPF应用程序…

Navidrome音乐服务器 + 音流APP = 释放你的手机空间

20240727 By wdhuag 目录 前言&#xff1a; 参考&#xff1a; Navidrome音乐服务器 Demo试用&#xff1a; 支持多平台&#xff1a; 下载&#xff1a; 修改配置&#xff1a; 设置用NSSM成服务启动&#xff1a; 服务器本地访问网址&#xff1a; 音流 歌词封面API&am…

HTML+CSS+JavaScript实现烟花绽放的效果源码

源码 复制粘贴代码 在同级别下放一张图片fire.png接可以了 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><…

2024年7月23日~2024年7月29日周报

目录 一、前言 二、完成情况 2.1 一种具有边缘增强特点的医学图像分割网络 2.2 融合边缘增强注意力机制和 U-Net 网络的医学图像分割 2.3 遇到的困难 三、下周计划 一、前言 上周参加了一些师兄师姐的论文讨论会议&#xff0c;并完成了初稿。 本周继续修改论文&#xff0…

【Qt】QLCDNumberQProgressBarQCalendarWidget

目录 QLCDNumber 倒计时小程序 相关属性 QProgressBar 进度条小程序 相关设置 QLCDNumber QLCDNumber是Qt框架中用于显示数字或计数值的小部件。通常用于显示整数值&#xff0c;例如时钟、计时器、计数器等 常用属性 属性说明intValueQLCDNumber显示的初始值(int类型)va…