当前课程知识点:操作系统(RISC-V) >  第十九讲 I/O子系统 >  19.2 I/O结构 >  19.2 I/O结构

返回《操作系统(RISC-V)》慕课在线视频课程列表

19.2 I/O结构在线视频

19.2 I/O结构

讲义PDF版本参见课程wiki页面:

http://os.cs.tsinghua.edu.cn/oscourse/OS2020spring/lecture19


下一节:19.3 I/O数据传输

返回《操作系统(RISC-V)》慕课在线视频列表

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结构

操作系统(RISC-V)课程列表:

第一讲 操作系统概述

-1.1 课程概述

--课程概述

-1.2 教学安排

--视频

-1.3 什么是操作系统

--Video

-1.4 为什么学习操作系统,如何学习操作系统

--Video

-1.5 操作系统实例

--视频

-1.6 操作系统的演变

--视频

-1.7 操作系统结构

--视频

-1.8 OS实验概述

--视频

第二讲 操作系统与系统结构和程序设计语言

-2.1 从OS角度看计算机系统

--2.1 从OS角度看计算机系统

-2.2 从OS角度看RISC-V

--2.2 从OS角度看RISC-V

-2.3 Rust语言与系统编程

--2.3 Rust语言与系统编程

-2.4 RISC-V CPU启动

--2.4 RISC-V CPU启动

-2.5 RISC-V CPU启动进一步分析

--2.5 RISC-V CPU启动进一步分析

第三讲 中断、异常和系统调用

-3.1 基本概念与原理

--3.1 基本概念与原理

-3.2 硬件架构支持

--3.2 硬件架构支持

-3.3 中断处理机制

--3.3.1 中断处理机制–Overview

--3.3.2 中断处理机制–Detail-1

--3.3.3 中断处理机制–Detail-2

--3.3.4 中断处理机制–Detail-3

--3.3.5 中断处理机制–Summary

-3.4 系统调用

--3.4 系统调用

第四讲 物理内存管理: 连续内存分配

-4.1 计算机体系结构和内存层次

--4.1 计算机体系结构和内存层次

-4.2 地址空间和地址生成

--4.2 地址空间和地址生成

-4.3 连续内存分配

--4.3 连续内存分配

-4.4 碎片整理

--4.4 碎片整理

-4.5 伙伴系统

--4.5 伙伴系统

-4.6 SLAB分配器

--4.6 SLAB分配器

第五讲 物理内存管理: 非连续内存分配

-5.1 非连续内存分配的需求背景

--5.1 非连续内存分配的需求背景

-5.2 段式存储管理

-- 5.2 段式存储管理

-5.3 页式存储管理

--5.3 页式存储管理

-5.4 页表概述

--5.4 页表概述

-5.5 快表和多级页表

--5.5 快表和多级页表

-5.6 RISC-V页映射机制

--5.6 RISC-V页映射机制

-5.7 使能RISC-V页表

--5.7 使能RISC-V页表

第六讲 虚拟存储概念

-6.1 虚拟存储的需求背景

--6.1 虚拟存储的需求背景

-6.2 覆盖和交换

--6.2 覆盖和交换

-6.3 局部性原理

--6.3 局部性原理

-6.4 虚拟存储概念

--6.4 虚拟存储概念

-6.5 虚拟页式存储

--6.5 虚拟页式存储

-6.6 缺页异常

--6.6 缺页异常

-6.7 RISC-V缺页异常

--6.7 RISC-V缺页异常

第七讲 虚拟存储:局部页面置换算法

-7.1 页面置换算法的概念

--7.1 页面置换算法的概念

-7.2 最优算法、先进先出算法和最近最久未使用算法

--7.2 最优算法、先进先出算法和最近最久未使用算法

-7.3 时钟置换算法和最不常用算法

--7.3 时钟置换算法和最不常用算法

-7.4 Belady现象和局部置换算法比较

--7.4 Belady现象和局部置换算法比较

-7.5 页表自映射

--7.5 页表自映射

第八讲 虚拟存储:全局页面置换算法

-8.1 工作集置换算法

--8.1 工作集置换算法

-8.2 缺页率置换算法

--8.2 缺页率置换算法

-8.3 抖动和负载控制

--8.3 抖动和负载控制

-8.4 面向缓存的页替换算法

--8.4.1 面向缓存的页替换算法-FBR

--8.4.2 面向缓存的页替换算法-LRU-K 2Q

--8.4.3 面向缓存的页替换算法-LIRS

第九讲 进程和线程

-9.1 进程的概念

--11.1 进程的概念

-9.2 进程控制块

--9.2 进程控制块

-9.3 进程状态

--9.3 进程状态

-9.4 三状态进程模型

--9.4 三状态进程模型

-9.5 挂起进程模型

--9.5 挂起进程模型

-9.6 线程的概念

--9.6 线程的概念

-9.7 用户线程

--9.7 用户线程

-9.8 内核线程

--9.8 内核线程

-9.9 进程地址空间与熔断 (meltdown) 漏洞

--9.9 进程地址空间与熔断 (meltdown) 漏洞

第十讲 进程和线程控制

-10.1 进程切换

--10.1 进程切换

-10.2 进程创建

--10.2 进程创建

-10.3 进程加载

--10.3 进程加载

-10.4 进程等待与退出

--10.4 进程等待与退出

-10.5 rCore进程和线程控制

--10.5 rCore进程和线程控制

第十一讲 处理机调度

-11.1 处理机调度概念

--11.1 处理机调度概念

-11.2 调度准则

--11.2 调度准则

-11.3 先来先服务、短进程优先和最高响应比优先调度算法

--11.3 先来先服务、短进程优先和最高响应比优先调度算法

-11.4 时间片轮转、多级反馈队列、公平共享调度算法和ucore调度框架

--11.4 时间片轮转、多级反馈队列、公平共享调度算法和ucore调度框架

-11.5 实时调度

--11.5 实时调度

-11.6 优先级反置

--11.6 优先级反置

-11.7 rCore调度框架

--11.7 rCore调度框架

第十二讲 多处理机调度

-12.1 对称多处理与多核架构

--12.1 对称多处理与多核架构

-12.2 多处理器调度概述

--12.2 多处理器调度概述

-12.3 O(1)调度

--12.3 O(1)调度

-12.4 CFS调度

--12.4 CFS调度

-12.5 BFS调度算法

--12.5 BFS调度算法

第十三讲 同步互斥

-13.1 背景

--13.1 背景

-13.2 现实生活中的同步问题

--13.2 现实生活中的同步问题

-13.3 临界区和禁用硬件中断同步方法

--13.3 临界区和禁用硬件中断同步方法

-13.4 基于软件的同步方法

--13.4 基于软件的同步方法

-13.5 高级抽象的同步方法

--13.5 高级抽象的同步方法

第十四讲 信号量与管程

-14.1 信号量

--14.1 信号量

-14.2 信号量使用

--14.2 信号量使用

-14.3 管程

--14.3 管程

-14.4 哲学家就餐问题

--14.4 哲学家就餐问题

-14.5 读者-写者问题

--14.5 读者-写者问题

-14.6 Rust语言中的同步机制

--14.6 Rust语言中的同步机制

第十五讲 死锁和并发错误检测

-15.1 死锁概念

--15.1 死锁概念

-15.2 死锁处理方法

--15.2 死锁处理方法

-15.3 银行家算法

--15.3 银行家算法

-15.4 死锁检测

--15.4 死锁检测

-15.5 并发错误检测

--15.5 并发错误检测

第十六讲 进程通信

-16.1 进程通信概念

--16.1 进程通信概念

-16.2 信号和管道

--16.2 信号和管道

-16.3 Linux信号机制

--16.3 Linux信号机制

-16.4 消息队列和共享内存

--16.4 消息队列和共享内存

-16.5 D-Bus机制

--16.5 D-Bus机制

-16.6 Binder机制

--16.6 Binder机制

第十七讲 文件系统概念

-17.1 文件系统和文件

--17.1 文件系统和文件

-17.2 文件描述符

--17.2 文件描述符

-17.3 目录、文件别名和文件系统种类

--17.3 目录、文件别名和文件系统种类

-17.4 虚拟文件系统

--17.4 虚拟文件系统

-17.5 文件缓存和打开文件

--17.5 文件缓存和打开文件

-17.6 文件分配

--17.6 文件分配

-17.7 空闲空间管理和冗余磁盘阵列RAID

--17.7 空闲空间管理和冗余磁盘阵列RAID

第十八讲 文件系统实例

-18.1 FAT文件系统

--18.1 FAT文件系统

-18.2.1 EXT4文件系统-历史

--18.2.1 EXT4文件系统-历史

-18.2.2 EXT4文件系统-支持大容量存储

--18.2.2 EXT4文件系统-支持大容量存储

-18.2.3 EXT4文件系统-支持恢复异常

--18.2.3 EXT4文件系统-支持恢复异常

-18.3 ZFS文件系统

--18.3 ZFS文件系统

第十九讲 I/O子系统

-19.1 I/O特点

--19.1 I/O特点

-19.2 I/O结构

--19.2 I/O结构

-19.3 I/O数据传输

--19.3 I/O数据传输

-19.4 磁盘调度

--19.4 磁盘调度

-19.5 Linux I/O子系统

--19.5 Linux I/O子系统

第二十讲 内核与程序设计语言

-20.1 Linux内核错误分析

--20.1 Linux内核错误分析

-20.2.1 用rust写操作系统-系统编程语言rust

--20.2.1 用rust写操作系统-系统编程语言rust

-20.2.2 用rust写操作系统-rust与操作系统开发

--20.2.2 用rust写操作系统-rust与操作系统开发

第二十一讲 异步编程 (Asynchronous Programming)

-21.1 Background

--21.1 Background

-21.2 Futures in Rust

--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

--21.5 Waker and Reactor

第二十二讲 Virtual Machine Monitor

-22.1 Overview

--22.1 Overview

-22.2.1 How VMM works - CPU

--22.2.1 How VMM works - CPU

-22.2.2 How VMM works - memory & I/O

--22.2.2 How VMM works - memory & I/O

19.2 I/O结构笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。