当前课程知识点:操作系统(RISC-V) > 第十九讲 I/O子系统 > 19.2 I/O结构 > 19.2 I/O结构
下面我们来讨论I/O结构
在I/O结构当中呢
我们先从硬件的结构说起
在我们计算机系统当中
我们的CPU为了跟外界相连
实际上在我们的主板上
它是分成了两段
一段是和高速的这些内存 显卡
相连的部分
这时候它的速度通常是若干个G
连的是内存显卡
然后还有一个部分是南桥
它负责跟我们这里的
各种各样的设备相连
比如说像这里的PCI总线
然后你的磁盘
网络都是通过这底下连的
在我们的基本原理里是说
CPU通过总线来连内存和I/O设备
那到这个地方
我们就细化成北桥连高速设备
南桥连I/O设备
这时候在这种结构下我们还需要
进一步来细化CPU到底
如何来识别每一个设备
它们的连接关系是什么样子的
在这儿呢
首先我们在这里头是CPU和I/O设备
设备上面呢有设备控制器
设备控制器的功能
是提供CPU和设备之间的接口
那在这里头就是总线接口
然后有相应的一组寄存器
可以进行数据的交互和
状态和控制的交互
也可以把它映射到内存当中
给一段内存区域
然后对于这段内存区域的访问
对应过来就是我们的I/O设备的访问
这就是我们这里说到的I/O地址
I/O地址通过总线连到我们的CPU上
总线和实际设备之间有总线适配器
在这里头我们映射过来
可能是内存地址
也可能是I/O空间的端口
那我们可以对I/O端口
有相应的I/O指令
如果是内存
那我们直接是访问存储
就对应着对I/O设备的访问
这是从CPU到设备
反过来还有一个从设备到CPU的通道
这就是我们的中断控制器
设备产生中断之后
在中断控制器进行汇总然后送给CPU
CPU就能对外部设备的事件做出响应
这就是我们在这里CPU和设备之间的
通讯的三种方式
轮询那就不用中断控制器
CPU直接访问I/O端口
或者说访问设备所对应的内存地址空间
我也可以采用中断方式
那就是外部设备有事件要通知CPU
就要通过中断到CPU
如果说在这里头
还有一种方式是说
我外部设备需要把数据
直接放到内存当中
你可以通过CPU读然后放到内存
在DMA控制器的控制下
把数据从I/O设备直接到内存单元
这是CPU和设备之间的连接关系
那下面我们进一步来讨论一下
I/O指令和内存映射I/O
I/O指令它是通过I/O端口
来访问设备寄存器
实际上也就是相当于我们通过端口号
来区别我访问的是哪个设备
以及于哪个设备上的哪一项功能
然后CPU上执行out in两个指令
来完成对端口的读写
这些读写不仅仅是数据的访问
也还对应着相应的设备控制
比如说我们有一些控制
就是直接对指定的端口发出写信号
那这个写信号来控制设备的操作
而写的内容有的时候反倒是不重要的
另一种呢是内存映射I/O
它是把设备的寄存器或者存储队列
或者说存储区域
映射到内存的物理地址空间
然后通过load /store
这种存储访问命令来实现I/O操作
在这地方呢
它的地址到底是在哪呢
实际上是在MMU来设置
或者说通过硬件的跳线
来完成相应地址的映射
有了这些讨论之后
那我们就可以给出
操作系统当中I/O子系统的结构
那我们从下往上来讨论
最底下是我们各种各样的设备
比如说存储的SCSI设备
和这边的ATAPI设备
然后还有其它的你比如说鼠标 键盘
然后每一个设备之上
都对应着有一个设备控制器
那不同的设备它的控制器是不一样的
然后在这之上呢
对应着我们就是开始是软件
操作系统里第一层是设备驱动
每一个设备
每一类设备对应着有自己的驱动
在这上头呢是我们的I/O子系统
它用来处理各种设备共同的一些内容
比如说我们的I/O请求
转换成驱动的I/O请求
这是一种细化
然后我也会缓存
设备给出来的一些结果
你比如说我要访问某一个磁盘上的
某一个扇区的数据
那我前面已经做过一次操作了
I/O子系统负责缓存
并且你第二次来访问的时候
我直接给你结果
然后上边是我们内核的其它部分内容
文件系统 那这些都是依赖于I/O子系统
来完成相应数据读写的
在这种结构下我们来看一个
完整的I/O请求的生命周期
跟我们刚才那张图呢
在这地方又有一些细化
这地方的驱动我把它分成两段
设备驱动和底下的中断处理例程
那我们来看一个用户
进行I/O请求它的过程
用户发出I/O请求 这是时间顺序
到这个系统调用返回
我得到相应的数据
或者说我输出数据完成
操作系统里头的I/O子系统
它会做什么事呢
首先判断一下你要进行这个操作
是否有现成的结果
比如说你的磁盘数据的读操作
如果有 那我在这儿呢
直接把我已经缓存的结果给应用
我这个操作就结束了
它实际上没有对实际的设备
进行任何的操作
如果说这个数据没有
它会给驱动发出I/O请求
那这时候我就要去读
指定的区域里的数据了
设备驱动再把这些I/O请求
转换成设备的控制命令
这个设备控制命令呢
直接给硬件进行控制硬件操作
那么这时候设备驱动处于等待状态
等这边处理结束之后
它会产生中断
中断回来我们的中断处理例程
会对它做出响应
这时候响应就是保存相应的结果
并且把结果通知上面的设备驱动层
设备驱动层负责来区分
返回的结果和哪个请求是相对应的
然后把这个结果
给到相应的I/O子系统当中
再把它送给用户的进程
整个一个I/O请求的
完整过程就实现了
这是我们说到的I/O结构
-1.1 课程概述
--课程概述
-1.2 教学安排
--视频
-1.3 什么是操作系统
--Video
-1.4 为什么学习操作系统,如何学习操作系统
--Video
-1.5 操作系统实例
--视频
-1.6 操作系统的演变
--视频
-1.7 操作系统结构
--视频
-1.8 OS实验概述
--视频
-2.1 从OS角度看计算机系统
-2.2 从OS角度看RISC-V
-2.3 Rust语言与系统编程
-2.4 RISC-V CPU启动
-2.5 RISC-V CPU启动进一步分析
-3.1 基本概念与原理
-3.2 硬件架构支持
-3.3 中断处理机制
-3.4 系统调用
--3.4 系统调用
-4.1 计算机体系结构和内存层次
-4.2 地址空间和地址生成
-4.3 连续内存分配
-4.4 碎片整理
--4.4 碎片整理
-4.5 伙伴系统
--4.5 伙伴系统
-4.6 SLAB分配器
-5.1 非连续内存分配的需求背景
-5.2 段式存储管理
-- 5.2 段式存储管理
-5.3 页式存储管理
-5.4 页表概述
--5.4 页表概述
-5.5 快表和多级页表
-5.6 RISC-V页映射机制
-5.7 使能RISC-V页表
-6.1 虚拟存储的需求背景
-6.2 覆盖和交换
-6.3 局部性原理
-6.4 虚拟存储概念
-6.5 虚拟页式存储
-6.6 缺页异常
--6.6 缺页异常
-6.7 RISC-V缺页异常
-7.1 页面置换算法的概念
-7.2 最优算法、先进先出算法和最近最久未使用算法
-7.3 时钟置换算法和最不常用算法
-7.4 Belady现象和局部置换算法比较
-7.5 页表自映射
-8.1 工作集置换算法
-8.2 缺页率置换算法
-8.3 抖动和负载控制
-8.4 面向缓存的页替换算法
-9.1 进程的概念
-9.2 进程控制块
-9.3 进程状态
--9.3 进程状态
-9.4 三状态进程模型
-9.5 挂起进程模型
-9.6 线程的概念
-9.7 用户线程
--9.7 用户线程
-9.8 内核线程
--9.8 内核线程
-9.9 进程地址空间与熔断 (meltdown) 漏洞
-10.1 进程切换
-10.2 进程创建
-10.3 进程加载
-10.4 进程等待与退出
-10.5 rCore进程和线程控制
-11.1 处理机调度概念
-11.2 调度准则
-11.3 先来先服务、短进程优先和最高响应比优先调度算法
--11.3 先来先服务、短进程优先和最高响应比优先调度算法
-11.4 时间片轮转、多级反馈队列、公平共享调度算法和ucore调度框架
--11.4 时间片轮转、多级反馈队列、公平共享调度算法和ucore调度框架
-11.5 实时调度
-11.6 优先级反置
-11.7 rCore调度框架
-12.1 对称多处理与多核架构
-12.2 多处理器调度概述
-12.3 O(1)调度
-12.4 CFS调度
-12.5 BFS调度算法
-13.1 背景
--13.1 背景
-13.2 现实生活中的同步问题
-13.3 临界区和禁用硬件中断同步方法
-13.4 基于软件的同步方法
-13.5 高级抽象的同步方法
-14.1 信号量
--14.1 信号量
-14.2 信号量使用
-14.3 管程
--14.3 管程
-14.4 哲学家就餐问题
-14.5 读者-写者问题
-14.6 Rust语言中的同步机制
-15.1 死锁概念
-15.2 死锁处理方法
-15.3 银行家算法
-15.4 死锁检测
-15.5 并发错误检测
-16.1 进程通信概念
-16.2 信号和管道
-16.3 Linux信号机制
-16.4 消息队列和共享内存
-16.5 D-Bus机制
-16.6 Binder机制
-17.1 文件系统和文件
-17.2 文件描述符
-17.3 目录、文件别名和文件系统种类
-17.4 虚拟文件系统
-17.5 文件缓存和打开文件
-17.6 文件分配
-17.7 空闲空间管理和冗余磁盘阵列RAID
-18.1 FAT文件系统
-18.2.1 EXT4文件系统-历史
-18.2.2 EXT4文件系统-支持大容量存储
-18.2.3 EXT4文件系统-支持恢复异常
-18.3 ZFS文件系统
-19.1 I/O特点
-19.2 I/O结构
-19.3 I/O数据传输
-19.4 磁盘调度
-19.5 Linux I/O子系统
-20.1 Linux内核错误分析
-20.2.1 用rust写操作系统-系统编程语言rust
--20.2.1 用rust写操作系统-系统编程语言rust
-20.2.2 用rust写操作系统-rust与操作系统开发
--20.2.2 用rust写操作系统-rust与操作系统开发
-21.1 Background
-21.2 Futures in Rust
-21.3 Generators and async/await
--21.3 Generators and async/await
-21.4 Self-Referential Structs & Pin
--21.4 Self-Referential Structs & Pin
-21.5 Waker and Reactor
-22.1 Overview
-22.2.1 How VMM works - CPU
-22.2.2 How VMM works - memory & I/O