当前课程知识点:操作系统 > 第二十三讲 I/O子系统 > 23.2 I/O结构 > 816C80A0F5E3B8809C33DC5901307461
下面我们来讨论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结构
-0.1 Piazza讨论区
--html
-0.2 在线实验平台
--实验平台使用帮助
--平台使用帮助
-0.2在线实验平台
--Raw HTML
-1.1 课程概述
--视频
-第一讲 操作系统概述--练习
-1.2 教学安排
--视频
-1.3 什么是操作系统
--Video
-1.4 为什么学习操作系统,如何学习操作系统
--Video
-1.5 操作系统实例
--视频
-1.6 操作系统的演变
--视频
-1.7 操作系统结构
--视频
-2.1 前言和国内外现状
-2.2 OS实验目标
-2.3 8个OS实验概述
-2.4 实验环境搭建
-2.5 x86-32硬件介绍
-2.6 ucore部分编程技巧
-2.7 演示实验操作过程
--Q6
--Q7
--Q10
-3.1 BIOS
--3.1 BIOS
-3.2 系统启动流程
-3.3 中断、异常和系统调用比较
-第三讲 启动、中断、异常和系统调用--3.3 中断、异常和系统调用比较
-3.4 系统调用
--3.4 系统调用
-第三讲 启动、中断、异常和系统调用--3.4 系统调用
-3.5 系统调用示例
-3.6 ucore+系统调用代码
-4.1 启动顺序
--4.1 启动顺序
-4.2 C函数调用的实现
-4.3 GCC内联汇编
-4.4 x86中断处理过程
-4.5 练习一
--4.5 练习一
-4.6 练习二
--4.6 练习二
-4.7 练习三
--4.7 练习三
-4.8 练习四 练习五
-4.9 练习六
--4.9 练习六
-5.1 计算机体系结构和内存层次
-5.2 地址空间和地址生成
-5.3 连续内存分配
-5.4 碎片整理
--5.4 碎片整理
-5.5 伙伴系统
--5.5 伙伴系统
-第五讲 物理内存管理: 连续内存分配--5.6 练习
-6.1 非连续内存分配的需求背景
-6.2 段式存储管理
-- 6.2 段式存储管理
-6.3 页式存储管理
-6.4 页表概述
--6.4 页表概述
-6.5 快表和多级页表
-6.6 反置页表
--6.6 反置页表
-6.7 段页式存储管理
-第六讲 物理内存管理: 非连续内存分配--6.8 练习
-7.1 了解x86保护模式中的特权级
-第七讲 实验二 物理内存管理--7.1 了解x86保护模式中的特权级
-7.2 了解特权级切换过程
-第七讲 实验二 物理内存管理--7.2 了解特权级切换过程
-7.3 了解段/页表
-第七讲 实验二 物理内存管理--7.3 了解段/页表
-7.4 了解UCORE建立段/页表
-第七讲 实验二 物理内存管理--7.4 了解UCORE建立段/页表
-7.5 演示lab2实验环节
-8.1 虚拟存储的需求背景
-8.2 覆盖和交换
-8.3 局部性原理
-8.4 虚拟存储概念
-8.5 虚拟页式存储
-8.6 缺页异常
--8.6 缺页异常
-9.1 页面置换算法的概念
-9.2 最优算法、先进先出算法和最近最久未使用算法
-第九讲 页面置换算法--9.2 最优算法、先进先出算法和最近最久未使用算法
-9.3 时钟置换算法和最不常用算法
-第九讲 页面置换算法--9.3 时钟置换算法和最不常用算法
-9.4 Belady现象和局部置换算法比较
-第九讲 页面置换算法--9.4 Belady现象和局部置换算法比较
-9.5 工作集置换算法
-第九讲 页面置换算法--9.5 工作集置换算法
-9.6 缺页率置换算法
-第九讲 页面置换算法--9.6 缺页率置换算法
-9.7 抖动和负载控制
-10.1 实验目标:虚存管理
-第十讲 实验三 虚拟内存管理--10.1 实验目标:虚存管理
-10.2 回顾历史和了解当下
-第十讲 实验三 虚拟内存管理--10.2 回顾历史和了解当下
-10.3 处理流程、关键数据结构和功能
-第十讲 实验三 虚拟内存管理--10.3 处理流程、关键数据结构和功能
-10.4 页访问异常
-第十讲 实验三 虚拟内存管理--10.4 页访问异常
-10.5 页换入换出机制
-第十讲 实验三 虚拟内存管理--10.5 页换入换出机制
-11.1 进程的概念
-第十一讲 进程和线程--11.1 进程的概念
-11.2 进程控制块
-第十一讲 进程和线程--11.2 进程控制块
-11.3 进程状态
-第十一讲 进程和线程--11.3 进程状态
-11.4 三状态进程模型
-11.5 挂起进程模型
-第十一讲 进程和线程--11.5 挂起进程模型
-11.6 线程的概念
-第十一讲 进程和线程--11.6 线程的概念
-11.7 用户线程
-第十一讲 进程和线程--11.7 用户线程
-11.8 内核线程
-第十一讲 进程和线程--11.8 内核线程
-12.1 进程切换
-第十二讲 进程控制--12.1 进程切换
-12.2 进程创建
-第十二讲 进程控制--12.2 进程创建
-12.3 进程加载
-第十二讲 进程控制--12.3 进程加载
-12.4 进程等待与退出
-第十二讲 进程控制--12.4 进程等待与退出
-13.1 总体介绍
-13.2 关键数据结构
-13.3 执行流程
-13.4 实际操作
-14.1 总体介绍
-14.2 进程的内存布局
-14.3 执行ELF格式的二进制代码-do_execve的实现
--14.3 执行ELF格式的二进制代码-do_execve的实现
-14.4 执行ELF格式的二进制代码-load_icode的实现
--14.4 执行ELF格式的二进制代码-load_icode的实现
-14.5 进程复制
-14.6 内存管理的copy-on-write机制
-15.1 处理机调度概念
-第十五讲 处理机调度--15.1 处理机调度概念
-15.2 调度准则
-15.3 先来先服务、短进程优先和最高响应比优先调度算法
--15.3 先来先服务、短进程优先和最高响应比优先调度算法
-第十五讲 处理机调度--15.3 先来先服务、短进程优先和最高响应比优先调度算法
-15.4 时间片轮转、多级反馈队列、公平共享调度算法和ucore调度框架
--15.4 时间片轮转、多级反馈队列、公平共享调度算法和ucore调度框架
-第十五讲 处理机调度--15.4 时间片轮转、多级反馈队列、公平共享调度算法和uc
-15.5 实时调度和多处理器调度
-第十五讲 处理机调度--15.5 实时调度和多处理器调度
-15.6 优先级反置
-第十五讲 处理机调度--15.6 优先级反置
-16.1 总体介绍和调度过程
-16.2 调度算法支撑框架
-16.3 时间片轮转调度算法
-16.4 Stride调度算法
-17.1 背景
--17.1 背景
-17.2 现实生活中的同步问题
-第十七讲 同步互斥--17.2 现实生活中的同步问题
-17.3 临界区和禁用硬件中断同步方法
-第十七讲 同步互斥--17.3 临界区和禁用硬件中断同步方法
-17.4 基于软件的同步方法
-第十七讲 同步互斥--17.4 基于软件的同步方法
-17.5 高级抽象的同步方法
-第十七讲 同步互斥--17.5 高级抽象的同步方法
-18.1 信号量
--18.1 信号量
-第十八讲 信号量与管程--18.1 信号量
-18.2 信号量使用
-第十八讲 信号量与管程--18.2 信号量使用
-18.3 管程
--18.3 管程
-第十八讲 信号量与管程--18.3 管程
-18.4 哲学家就餐问题
-18.5 读者-写者问题
-19.1 总体介绍
-19.2 底层支撑
-第十九讲 实验七 同步互斥--19.2 底层支撑
-19.3 信号量设计实现
-第十九讲 实验七 同步互斥--19.3 信号量设计实现
-19.4 管程和条件变量设计实现
-第十九讲 实验七 同步互斥--19.4 管程和条件变量设计实现
-19.5 哲学家就餐问题
-20.1 死锁概念
-第二十讲 死锁和进程通信--20.1 死锁概念
-20.2 死锁处理方法
-第二十讲 死锁和进程通信--20.2 死锁处理方法
-20.3 银行家算法
-第二十讲 死锁和进程通信--20.3 银行家算法
-20.4 死锁检测
-第二十讲 死锁和进程通信--20.4 死锁检测
-20.5 进程通信概念
-第二十讲 死锁和进程通信--20.5 进程通信概念
-20.6 信号和管道
-第二十讲 死锁和进程通信--20.6 信号和管道
-20.7 消息队列和共享内存
-第二十讲 死锁和进程通信--20.7 消息队列和共享内存
-21.1 文件系统和文件
-第二十一讲 文件系统--21.1 文件系统和文件
-21.2 文件描述符
-第二十一讲 文件系统--21.2 文件描述符
-21.3 目录、文件别名和文件系统种类
-第二十一讲 文件系统--21.3 目录、文件别名和文件系统种类
-21.4 虚拟文件系统
-第二十一讲 文件系统--21.4 虚拟文件系统
-21.5 文件缓存和打开文件
-第二十一讲 文件系统--21.5 文件缓存和打开文件
-21.6 文件分配
-第二十一讲 文件系统--21.6 文件分配
-21.7 空闲空间管理和冗余磁盘阵列RAID
-第二十一讲 文件系统--21.7 空闲空间管理和冗余磁盘阵列RAID
-22.1 总体介绍
-第二十二讲 实验八 文件系统--22.1 总体介绍
-22.2 ucore 文件系统架构
-第二十二讲 实验八 文件系统--22.2 ucore 文件系统架构
-22.3 Simple File System分析
-第二十二讲 实验八 文件系统--22.3 Simple File System分析
-22.4 Virtual File System分析
-第二十二讲 实验八 文件系统--22.4 Virtual File System分
-22.5 I/O设备接口分析
-第二十二讲 实验八 文件系统--22.5 I/O设备接口分析
-22.6 执行流程分析
-23.1 I/O特点
--视频
-第二十三讲 I/O子系统--23.1 I/O特点
-23.2 I/O结构
--816C80A0F5E3B8809C33DC5901307461
-第二十三讲 I/O子系统--23.2 I/O结构
-23.3 I/O数据传输
--C58221E14388B9DB9C33DC5901307461
-第二十三讲 I/O子系统--23.3 I/O数据传输
-23.4 磁盘调度
--567A3F1FCBFB3F4C9C33DC5901307461
-第二十三讲 I/O子系统--23.4 磁盘调度
-23.5 磁盘缓存
--C327536B80D25CE79C33DC5901307461
-第二十三讲 I/O子系统--23.5 磁盘缓存
-html
--html