系统总线(完结)
Posted Roye_ack
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了系统总线(完结)相关的知识,希望对你有一定的参考价值。
本章参考王道考研相关课程:
【2019版】6.1.1 总线的概念与分类_哔哩哔哩_bilibili
【2019版】6.1.2 总线的性能指标_哔哩哔哩_bilibili
目录
一、总线的概述与分类
1、总线的定义
定义:总线是一组能为多个部件分时 共享的公共信息传送路线
为什么要用总线?
早期计算机外设多采用分散连接方式,不易实现随时增减外设
为了更好解决I/O设备和主机之间连接的灵活性问题,计算机结构从分散连接发展成总线连接
2、总线的特性
- 机械特性 :尺寸、形状、管脚数、排列顺序
- 电气特性:传输方向和有效的电平范围
- 功能特性:每根传输线的功能(地址、数据、控制)
- 时间特性:信号的时序关系
3、 总线的分类
1、串行总线和并行总线
串行总线 —— 将数据一个一个拆分传送
- 优点:只需要一条传输线,成本低,广泛应用于长距离传输,节省布线空间
- 缺点:在数据发送和接收时,要拆卸和装配,要考虑串行-并行转换问题
并行总线 —— 将数据每一位同时传送
- 优点:总线的逻辑时序比较简单,电路实现容易
- 缺点:信号线数量多,占用更多布线空间,远距离传送成本高,由于工作频率较高时,并行的信号线之间会产生严重干扰,因此无法持续提升工作效率
2、片内总线、系统总线、通信总线
片内总线 —— 芯片内部的总线
是CPU芯片内部寄存器与寄存器之间,寄存器与ALU之间的公共连接线
系统总线 —— 计算机系统内各功能部件之间连接的总线
按传输内容不同:数据总线、地址总线、控制总线
- 数据总线DB:传输数据信息,包括:指令和操作数,根数与机器字长和存储字长有关,双向
- 地址总线AB:传输地址信息,包括:主存单元或I/O端口的地址,根数与主存地址空间及设备数量有关,单向
- 控制总线CB:一根控制线传输一个信号,有入:CPU送出的控制命令,有出:主存或外设返回的CPU的反馈信号
通信总线 —— 计算机系统之间或计算机系统与其他系统信息传输的总线,也称“外部总线”
4、系统总线的结构
1、单总线结构
2、双总线结构
3、三总线结构
DMA:直接内存访问总线
二、总线的性能指标
1、总线的传输周期
- 一次总线操作所需的时间(包括申请阶段、寻址阶段、传输阶段、结束阶段),通常由若干个时钟周期组成
- 总线工作频率=1/总线传输周期
2、总线的时钟周期
- 总线时钟频率=1/总线时钟周期
3、总线宽度(总线位宽)
通常指数据总线的根数,用bit表示,如8位、16位、32位、64位(8根、16根、32根、64根)
4、总线带宽
- 总线的数据传输速率,即单位时间内总线上传输数据的位数,通常用每秒钟传输信息,单位B/s(字节/秒)
- 总线带宽=总线工作频率×(总线宽度/8)(B/s)
- 比如:总线工作频率为33MHz,总线宽度为32位(1B=8bit,即4B),则总线带宽=33*4=132MBps
- 总线带宽是指总线本身所能达到的最高传输速率
5、总线复用
一条信号线上分时传送不同的信息,可使用较少的线传输更多的信息,节省成本和空间
6、信号线数
地址总线、数据总线、控制总线三种总线数总和
三、总线标准
1、定义
- 国际上规定的互联各个模块的标准,把各种不同模块组成计算机系统时必须遵守的规范
- 按总线标准设计的接口可视为通用接口,可以为计算机接口的软硬件设计提供方便
2、流行的总线标准
(1)ISA总线
- 工作频率:8MHz
- 数据线:16位
- 最大传输速率:16MB/s
- 必须通过CPU或DMA(直接存储器存取)接口管理
- 不支持总线仲裁
- 传输速率过低、CPU占用率过高
(2)EISA总线
- 工作频率:8MHz
- 数据线:32位
- 最大传输速率:32MB/s
- 从CPU中分离出了总线控制权,支持多个总线总控器和突发传送
(3)PCI总线——独立与CPU的局部总线
- 工作频率:33/66MHz
- 数据线:32/64位
- 最大传输速率:528MB/s
- 主要特点:
- 高性能,是一种不依附于某个具体处理器的局部总线,支持突发传送
- 良好的兼容性
- 支持即插即用
- 支持多主设备能力
- 具有与处理器和存储器子系统完全并行操作的能力
- 提供数据和地址奇偶校验功能,保证数据的完整和正确
- 可扩充性好,可采用多层结构提高驱动能力
- 采用多路复用,减少总线引脚个数
- PCI-E是一种点对点串行连接的设备连接方式,支持热拔插
(4)AGP总线——显卡专用的局部总线
(5)VESA总线——视频局部总线
(6)USB总线——串行设备总线
- USB是设备总线,是设备与设备控制器间的接口
- 主要特点:
- 支持即插即用,热拔插
- 具有很强的连接能力,有很强扩充性
- 高速传输
- 标准统一
- 连接电缆轻巧,电源体积缩小
(7)RS-232C总线——串行通信总线
是应用于串行二进制交换的数据终端设备和数据通信设备直接的标准接口
四、总线仲裁
1、基本概念
(1)将总线上所连接的各类设备按其对总线的控制有无分为:
- 主设备:获得总线控制权的设备
- 从设备:被主设备访问,只能响应从主设备发来的各种总线命令,对总线无控制权
(2)总线仲裁定义:多个主设备同时竞争
主线控制权时,以某种方式选择一个主设备优先获得总线控制权
(3)集中仲裁方式
1、链式查询方式
- BG总线同意、BR总线请求、BS总线忙
- 总线同意信号BG是串行地从一个I/O接口送到另一个I/O接口,如果BG到达的接口有总线请求BR,BG信号就不接着往下传,意味着该设备获得总线使用权,建立总线忙信号BS,表示它占用总线
- 如果该设备使用完,则撤掉总线忙信号BS,总线寻找下一个有总线请求信号BR的设备,BG接着往下走
- 优点:链式查询方式优先级固定,离总线控制部件近的设备优先级高,只需要很少的线就能按一定优先次序实现总线控制,结构简单,容易扩充设备
- 缺点:对电路故障敏感,优先级低的设备很难获得请求
- 线数:3根
2、计数器定时查询
- 比链式查询方式多了一组设备地址线,少了一条BG总线同意线
- 总线控制部件接到总线请求信号BR后,在总线未被使用的情况下,总线控制部件中的计数器开始计数,并通过设备地址线向各设备发出计数值
- 如果某个请求占用的总线的设备地址与计数器值一致,则该设备获得总线控制权,停止计数查询
- 优点:计数器初始值可以改变优先次序
- 计数可以从0开始,设备优先次序按顺序排列,固定不变
- 计数可以从上一次终点开始,此时设备使用总线优先级相等
- 计数还可以由程序设置
- 缺点:对电路故障不如链式查询方式敏感,但增加了控制线数,控制较复杂
- 线数:log2n+2根线(n是允许接纳的最大设备数)
3、独立请求方式
- 每个设备均有一对总线请求线BR和总线同意线BG
- 总线控制部件有一排队电路,可根据优先次序确定响应哪一台设备的请求
- 优点:响应速度快,优先次序控制灵活(通过程序改变)
- 缺点:控制线数量多,总线控制复杂
- 线数:2n+1根线(n是允许接纳的最大设备数)
五、总线的操作和定时
1、总线传输的四个阶段
(1)申请分配阶段
由需要使用总线的主模块(主设备)提出申请,经总线仲裁机构决定下一传输周期的总线使用权授予某一申请者,细分为传输请求阶段和总线仲裁阶段
(2)寻址阶段
取得使用权的主模块通过总线发出本次要访问的从模块的地址及有关命令,启动参与本次传输的从模块
(3)传数阶段
主模块和从模块进行数据交换,数据由原模块发出,经数据总线流入目的模块
(4)结束阶段
主模块的有关信息均从系统总线上撤除,让出总线控制权
2、总线定时
定义:指总现在双方交换数据过程中需要时间上配合关系的控制,实质上是一种协议或规则
(1)同步通信(同步定时方式)
- 系统采用一个统一的时钟信号来协调发送和接收双方的传送定时关系
- 时钟产生相等的时间间隔,每个间隔构成一个总线周期
- 在一个总线周期中,发送方和接收方可以进行一次数据传送
- 优点:传送速度快,具有较高的传输速率,总线控制逻辑简单
- 缺点:主从设备属于强制性同步,不能及时进行数据通信的有效性检验,可靠性差
- 同步通信适用于总线长度较短及总线所接部件的存取时间比较接近的系统
(2)异步通信(异步定时方式)
- 没有统一的时钟,完全依靠传送双方互相制约的“握手”信号来实现定时控制
- 允许不同速度点模块协调工作
- 主设备提出交换信息的“请求”信号,经接口传送到从设备
- 从设备接到主设备的请求后,通过接口向主设备发出“回答”信号
根据“请求”和“回答”信号的撤销是否互锁,分为:
1、不互锁方式(互相不负责)
- 主设备发出“请求”信号后,不必等到接到从设备的“回答”信号,经过一段时间,撤销“请求”信号
- 从设备在接到“请求”信号后,发出“回答”信号,经过一段时间,自动撤销“回答”信号
- 双方不存在互锁关系
- 速度最快,可靠性最差
2、半互锁方式(主设备负责,从设备不负责)
- 主设备发出“请求”信号后,必须等到接到从设备的“回答”信号,才撤销“请求”信号
- 从设备在接到“请求”信号后,发出“回答”信号,但不必等到获知主设备的“请求”信号已撤销,隔一段时间自动撤销“回答”信号
- 主设备有互锁关系,从设备不存在互锁关系
3、全互锁方式(互相负责)
- 主设备发出“请求”信号后,必须等到接到从设备的“回答”信号,才撤销“请求”信号
- 从设备在接到“请求”信号后,发出“回答”信号,必须等到获知主设备的“请求”信号已撤销,再撤销“回答”信号
- 双方存在互锁关系
- 最可靠,速度最慢
- 优点:总线周期长度可变,能保证两个工作速度相差很大的部件或设备之间可靠地进行信息交换,自动适应时间的配合
- 缺点:比同步控制方式复杂,速度比同步定时方式慢
求数据传输率
(3)半同步通信
在统一时钟的基础上,增加一个“等待”响应信号WAIT
(4)分离式通信
分离式通信的一个总线传输周期:
- 子周期1:主模块申请占用总线,使用完后放弃总线的使用权
- 子周期2:从模块申请占用总线,将各种信息传到总线上
特点:
- 各模块均有权申请占用总线
- 采用同步方式通信,不等对方回答
- 各模块准备数据时不占用总线
- 总线利用率提高
Linux 0.11-操作系统启动完结篇-40
Linux 0.11-操作系统启动完结篇-40
操作系统启动完结篇
整个操作系统终于通过四个部分的讲解,完成了它的启动,达到了一个怠速状态,留下了一个 shell 程序等待用户指令的输入并执行。
具体来说。
通过 第一部分 | 进入内核前的苦力活 完成了执行 main 方法前的准备工作,如加载内核代码,开启保护模式,开启分页机制等工作,对应内核源码中 boot 文件夹里的三个汇编文件 bootsect.s setup.s head.s。
通过 第二部分 | 大战前期的初始化工作 完成了内核中各种管理结构的初始化,如内存管理结构初始化 mem_init,进程调度管理结构初始化 shed_init 等,对应 main 方法中的 xxx_init 系列方法。
通过 第三部分 | 一个新进程的诞生 讲述了 fork 函数的原理,也就是进程 0 创建进程 1 的过程,对应 main 方法中的 fork 函数。
通过 第四部分 | shell 程序的到来 讲述了从加载根文件系统到最终创建出与用户交互的 shell 进程的过程,对应 main 方法中的 init 函数。
至此操作系统启动完毕,达到怠速状态。
纵观整个操作系统的源码,前四部分对应的代码如下,这就是启动流程中的全部代码了。
--- 第一部分 进入内核前的苦力活 ---
bootsect.s
setup.s
head.s
main.c
void main(void)
--- 第二部分 大战前期的初始化工作 ---
mem_init(main_memory_start,memory_end);
trap_init();
blk_dev_init();
chr_dev_init();
tty_init();
time_init();
sched_init();
buffer_init(buffer_memory_end);
hd_init();
floppy_init();
sti();
--- 第三部分 一个新进程的诞生 ---
move_to_user_mode();
if (!fork())
--- 第四部分 shell程序的到来 ---
init();
for(;;) pause();
------
具体展开第四部分,我们首先通过 第31回 | 拿到硬盘信息 和 第32回 | 加载根文件系统 使得内核具有了以文件系统的形式管理硬盘中的数据的能力。
接下来 第33回 | 打开终端设备文件 使用刚刚建立好的文件系统能力,打开了 /dev/tty0 这个终端设备文件,此时内核便具有了与外设交互的能力,具体可以体现为调用 printf 函数可以往屏幕上打印字符串了。
再接下来,第34回 | 进程2的创建 利用刚刚建立好的文件系统,以及进程 1 的与外设交互的能力,创建出了进程 2,此时进程 2 与进程 1 一样也具有与外设交互的能力,这为后面 shell 程序的创建打好了基础。
然后,进程 2 此时摇身一变,在 第35回 | execve 加载并执行 shell 程序 利用 execve 函数使自己变成了 shell 程序,配合上一回 fork 的进程 2 的过程,这就是 Linux 里经典的 fork + execve 函数。
execve 函数摇身一变的关键,其实就是改变了栈空间中的 EIP 和 ESP 的值,使得中断返回后的地址被程序进行了魔改,改到了 shell 程序加载到的内存地址上。
此时,execve 系统调用的中断返回后,指向了 shell 程序所在的内存地址起始处,就要开始执行 shell 程序了。但此时 shell 程序还没有从硬盘中加载到内存呢,所以此时会触发缺页中断,将硬盘中的 shell 程序(除 exec 头部的其他部分)按需加载到内存,这就是 第36回 | 缺页中断 里讲述的过程。
这回,终于可以开始执行 shell 程序了,在 第37回 | shell 程序跑起来了 中我们以 xv6 源码中的超级简单的 shell 程序源码为例,讲解了 shell 程序的原理。
就是不断读取我们用户输入的命令,创建一个新的进程并执行刚刚读取到的命令,最后等待进程退出,再次进入读取下一条命令的循环中。
// xv6-public sh.c
int main(void)
static char buf[100];
// 读取命令
while(getcmd(buf, sizeof(buf)) >= 0)
// 创建新进程
if(fork() == 0)
// 执行命令
runcmd(parsecmd(buf));
// 等待进程退出
wait();
shell 程序是个死循环,我们再回过头来看操作系统的死循环。
在 第38回 | 操作系统启动完毕 中给出了整个操作系统启动代码的鸟瞰视角。
// main.c
void main()
// 初始化环境
...
// 外层操作系统大循环
while(1)
// 内层 shell 程序小循环
while(1)
// 读取命令 read
...
// 创建进程 fork
...
// 执行命令 execve
...
可以看出,不仅 shell 程序是个死循环,整个操作系统也是个死循环。
除此之外,这里所有的键盘输入、系统调用、进程调度,统统都需要中断来驱动,所以很久之前我说过,操作系统就是个中断驱动的死循环,就是这个道理。
OK!到此为止,操作系统终于启动完毕,达到了怠速的状态,它本身设置好了一堆中断处理程序,随时等待着中断的到来进行处理,同时它运行了一个 shell 程序用来接受我们普通用户的命令,以同人类友好的方式进行交互。
------
我们前四个部分,终于把整个操作系统的启动流程讲述清楚了,如果你头脑中已经有像过电影般把整个启动流程清晰地印在脑子里,相信你已经不再恐惧操作系统源码了。
但理解操作系统不单单是启动流程这个视角,还需要内存管理、文件系统、进程调度、设备管理、系统调用等操作系统提供的功能的视角看。
启动流程是一次性的,就这么来一下子,而这些功能是持续不断的,用户程序不断通过系统调用和操作系统提供的这些功能,完成自己想要让计算机帮忙做的事情。
所以接下来的第五部分,我打算用一条 shell 命令的执行过程,来把操作系统这些模块和所提供的功能讲述清楚。
因为一条 shell 命令的执行,包括了内存管理、文件系统、进程调度、设备管理、中断控制、特权级切换等等各方面的内容,实在是把它们都串起来的好办法。
那接下来就跟我一起,期待第五部分的到来吧!
欲知后事如何,且听下回分解。
转载
以上是关于系统总线(完结)的主要内容,如果未能解决你的问题,请参考以下文章