计算机组成 -- First Draft
|Word Count:61|Reading Time:1mins
从输入设备读取输入信息,通过运算器和控制器来执行存储在存储器里的程序,最终把结果输出到输出设备中
参考资料
Author: zhongmingmao
Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
Related Articles

2020-01-30
计算机组成 -- IO设备
接口 + 设备 – 适配器模式 大部分的输入输出设备,都有两个组成部分,一个是接口,另一个是实际的IO设备 硬件设备并不是直接接入到总线上和CPU通信的,而是通过接口,用接口连接到总线上,再通过总线和CPU通信 串行接口、USB接口等都是计算机主板上内置的各个接口,实际使用的硬件设备,都需要插入到这些接口上,才能和CPU通信 接口本身是一块电路板,CPU不需要和实际的硬件设备打交道,只需要和这个接口电路板打交道 设备里面的三类寄存器(状态寄存器、命令寄存器、数据寄存器),都在接口电路上,而不在实际的设备上 除了内置在主板上的接口外,有些接口可以集成在设备上 – IDE(Integrated Device Electronics)硬盘 设备的接口电路直接在设备上,只需要通过一个线缆,把集成了接口的设备连接到主板上即可 接口和设备分离:各种输入输出设备的制造商,根据接口的控制协议,来设计各种外设 Windows设备管理器 Devices:着重实际的IO设备本身 Controllers:着重输入输出设备接口里面的控制电路 Adaptors:着重接口作为一个适配器后面可以插上不同的实际设备 C...

2020-01-09
计算机组成 -- 段 + 页
程序装载 背景 通过链接器,把多个目标文件合并成一个最终可执行文件 运行可执行文件时,其实是通过一个装载器,解析ELF或者PE格式的可执行文件 装载器会把对应的指令和数据加载到内存里面,让CPU去执行 装载器需要满足两个条件 可执行程序加载后占用的内存空间应该是连续的 执行程序时,程序计数器是顺序地一条一条指令执行下去 需要同时加载很多个程序,并且不能让程序自己规定在内存中加载的位置 内存地址 虚拟内存地址:指令里用到的内存地址 物理内存地址:内存硬件里的空间地址 一个思路 在物理内存里面找一段连续的内存空间,分配给装载的程序 然后把这段连续的内存空间地址和整个程序指令里指定的内存地址做一个映射 程序里有指令和各种内存地址,而我们只需要关心虚拟内存地址即可 对任何一个程序来说,它所看到的都是同样的内存地址 维护一个虚拟内存到物理内存的映射表 实际程序指令执行的时候,会通过虚拟内存地址,找到对应的物理内存地址,然后执行 因为是连续的内存地址空间,只需要维护映射关系的起始地址和对应的空间大小即可 内存分段 分段(Segmentation):找出一段连续的物理内存和虚拟内...

2020-01-21
计算机组成 -- 异常
异常 异常是一个硬件和软件组合在一起的处理过程 异常的发生和捕捉,是在硬件层面完成的 异常的处理,是在软件层面完成的 计算机会为每一种可能发生的异常,分配一个异常代码(Exception Number),别称中断向量(Interrupt Vector) 异常发生的时候,通常是CPU检测到一个特殊的信号 在组成原理里面,一般叫作发生了一个事件(Event),CPU在检测到事件的时候,就已经拿到了对应的异常代码 异常代码 IO发出的信号的异常代码,是由操作系统来分配,即由软件来设定 像加法溢出这样的异常代码,是由CPU预分配的,即由硬件来设定 拿到异常代码后,CPU会触发异常处理流程 计算机在内存里,会保留一个异常表(Exception Table),别称中断向量表(Interrupt Vector Table) 存放的是不同的异常代码对应的异常处理程序所在的地址 CPU拿到异常代码后,会先把当前程序的执行现场(CPU当前运行程序用到的所有寄存器),保存到程序栈里面 然后根据异常代码查询,找到对应的异常处理程序,最后把后续指令执行的指挥权,交给这个异常处理程序 异常可以由硬件触发,也可以由软...

2020-01-18
计算机组成 -- 冒险
冒险 流水线架构的CPU,是主动进行的冒险选择,期望通过冒险带来更高的回报 对于各种冒险可能造成的问题,都准备好了应对方案 分类 结构冒险(Structural Hazard) 数据冒险(Data Hazard) 控制冒险(Control Hazard) 结构冒险 结构冒险,本质上是一个硬件层面的资源竞争问题 CPU在同一个时钟周期,同时在运行两条计算机指令的不同阶段,但这两个不同的阶段可能会用到同样的硬件电路 内存的数据访问 第1条指令执行到访存(MEM)阶段的时候,流水线的第4条指令,在执行取指令(Fetch)操作 访存和取指令,都是要进行内存数据的读取,而内存只有一个地址译码器,只能在一个时钟周期内读取一条数据 无法同时执行第1条指令的读取内存数据和第4条指令的读取指令代码 解决方案 解决方案:增加资源 哈佛架构 把内存分成两部分,它们有各自的地址译码器,这两部分分别是存放指令的程序内存和存放数据的数据内存 缺点:无法根据实际情况去动态调整 普林斯顿架构 – 冯.诺依曼体系架构 今天使用的CPU,仍然是冯.诺依曼体系架构,并没有把内存拆成程序内存和数据内存两部分 ...

2020-01-15
计算机组成 -- 定点数 + 浮点数
浮点数的不精确性12>>> 0.3 + 0.60.8999999999999999 32bit是无法表达所有实数的,只能表达2^32次方不同的数字,差不多40亿 40亿个数字比起无限多的实数集合只是沧海一粟,应该让这40亿个数映射到实数集合上的哪些数字,在实际应用中才最划算 定点数 用4个bit表示0~9的整数,那么32个bit就可以表示8个这样的整数 然后把最右边的2个0~9的整数,当成小数部分;把最左边6个0~9的整数,当成整数部分 这样用32bit可以表示0.00~999999.99这1亿个实数 这种用二进制表示十进制的编码方式,称为BCD编码(Binary-Coded Decimal) 应用非常广泛:超市、银行 缺点 浪费 本来32bit可以表示40亿个不同的数字,但在BCD编码下,只能表示1亿个数 如果精确到分,能够表达的最大金额为100W,非常有限 无法同时表示很大的数字和很小的数字 浮点数 浮点数的科学计数法的表示,有一个IEEE的标准,定义了两个基本的格式 一个是用32bit表示单精度的浮点数,即float 一个是用64bit表示双精度的浮点数,即do...

2020-01-04
计算机组成 -- 指令
CPU + 计算机指令 硬件的角度 CPU是一个超大规模集成电路,通过电路实现了加法、乘法乃至各种各样的处理逻辑 软件工程师的角度 CPU就是一个执行各种计算机指令的逻辑机器 计算机指令是一门CPU能听懂的语言,也称为机器语言 不同的CPU能够听懂的语言不太一样,两种CPU各自支持的语言,就是两组不同的计算机指令集 计算机程序平时是存储在存储器中,这种程序指令存储在存储器里面的计算机,叫作存储程序型计算机 代码 -> 机器码(编译 -> 汇编)1234567// test.cint main(){ int a = 1; int b = 2; a = a + b;} 编译(Compile)成汇编代码:把整个程序翻译成一个汇编语言(ASM,Assembly Language)的程序 汇编:针对汇编代码,用汇编器(Assembler)翻译成机器码(Machine Code) 机器码由0和1组成的机器语言表示,一串串的16进制数字,就是CPU能够真正认识的计算机指令 汇编代码 + 机器码12345678910$ gcc --help-c ...
Announcement
Things are always unexpected!





