RISCV操作系统-CH01-计算机系统漫游
RISCV操作系统-CH01-计算机系统漫游
第1章 计算机系统漫游
循序渐进,学习开发一个RISC-V上的操作系统
目录
计算机的硬件组成
计算机系统的硬件组成主要包括中央处理单元(CPU)、存储器以及输入输出设备等部分。
计算机体系结构
计算机体系结构主要分为两种类型:
-
冯·诺依曼架构(Von Neumann architecture):又称普林斯顿架构(Princeton architecture)
- 特点:指令和数据不加区别地存储在存储器中,经由同一个总线传输
- 优点:总线开销小,控制逻辑实现更简单
- 缺点:执行效率较低(存在”冯·诺依曼瓶颈”)
-
哈佛架构(Harvard architecture):
- 特点:将程序指令和数据分开存储
- 优点:执行效率较高
- 缺点:总线开销更大,控制逻辑实现更复杂
处理器基本组成
中央处理单元(CPU)主要包含以下组件:
- 算术逻辑单元(Arithmetic Logical Unit, ALU):负责执行算术和逻辑运算
- 控制单元(Control Unit, CU):负责控制CPU的操作
- 寄存器(Registers):CPU内部的高速存储单元
- 程序计数器(Program Counter):存储下一条指令的地址
程序的存储与执行
程序执行基本过程
程序执行遵循指令周期,主要包括以下三个阶段:
- 取指(Fetch):从内存中读取指令
- 译码(Decode):解析指令的含义
- 执行(Execute):执行指令指定的操作
晶振(时钟)推动着计算机执行过程的前进
程序执行示例:Mini计算机模型
以8位mini计算机为例,该计算机只支持加法计算,其指令集设计如下:
操作描述 | 操作码(OPCODE) | 操作数(OPERANDS) | 指令格式 |
---|---|---|---|
将内存地址中的值加载到寄存器0 | LOAD: 01 | REGISTER_0: 00 ADDRESS: XXXX |
XXXX-00-01 |
将内存地址中的值加载到寄存器1 | LOAD: 01 | REGISTER_1: 01 ADDRESS: XXXX |
XXXX-01-01 |
寄存器0和寄存器1相加,结果存储在寄存器0 | ADD: 11 | REGISTER_0: 00 REGISTER_1: 01 |
NN-01-00-11 |
将寄存器0的值存储到内存地址 | STORE: 10 | REGISTER_0: 00 ADDRESS: XXXX |
XXXX-00-10 |
其中指令格式如下:
1
2
3
4
位位置: 7 6 5 4 3 2 1 0
+---+---+---+---+---+---+---+---+
| 地址 | 寄存器 | 操作码 |
+---+---+---+---+---+---+---+---+
或者对于ADD指令:
1
2
3
4
位位置: 7 6 5 4 3 2 1 0
+---+---+---+---+---+---+---+---+
| N/A | 寄存器1 | 寄存器0 | 操作码 |
+---+---+---+---+---+---+---+---+
指令执行示例
以下演示了mini计算机执行指令的过程:
- 程序计数器指向内存地址0,开始取指
- 从内存加载指令
01000001
(将地址4的值加载到寄存器0) - 执行指令,将值
00000001
加载到寄存器0 - 程序计数器增加,继续取指
- 从内存加载指令
01010101
(将地址5的值加载到寄存器1) - 执行指令,将值
00000010
加载到寄存器1 - 程序计数器增加,继续取指
- 从内存加载指令
00010011
(将寄存器0与寄存器1相加,结果存入寄存器0) - 执行指令,将
00000001 + 00000010 = 00000011
存入寄存器0 - 程序计数器增加,继续取指
- 从内存加载指令
01100010
(将寄存器0的值存储到地址6) - 执行指令,将值
00000011
存储到内存地址6
程序语言的设计和进化
程序语言的发展经历了多个阶段,逐步提高了抽象程度和开发效率:
机器语言
- 最底层的编程语言,由0和1组成
- 直接对应处理器指令,无需翻译
- 例如:
01000001
表示将内存地址4的值加载到寄存器0 - 优点:执行效率高
- 缺点:难以阅读和编写,可移植性差
汇编语言
- 使用助记符替代二进制指令
- 与机器指令一一对应
- 需要通过汇编器转换为机器语言
# 汇编语言示例
.global add # 定义入口
add:
load r0, 0x04 # 从地址0x04加载到r0
load r1, 0x05 # 从地址0x05加载到r1
add r0, r1 # r0和r1相加,结果存入r0
store r0, 0x06 # 将r0存储到地址0x06
array:
.byte 0x01 # 定义字节数据
.byte 0x02
.byte 0x00
.end # 文件结束
高级语言
- 接近自然语言,更加易于理解和编写
- 通过编译器或解释器转换为机器语言
- 提供更高级的抽象和更强大的功能
1
2
3
4
5
6
7
// 高级语言示例 (C语言)
#include <stdio.h>
int main()
{
printf("hello world!\n");
return 0;
}
1
2
3
4
5
6
7
8
9
// 高级语言示例 (JavaScript)
// Advanced Language
byte array[3] = {1, 2, 0};
function add()
{
byte a = array[0];
byte b = array[1];
array[2] = a + b;
}
存储设备的层次结构
计算机的存储系统采用层次化结构,不同层次的存储设备在速度、容量和成本上存在差异:
存储层次结构
从上到下依次为:
- 寄存器(Register)
- 速度:极快
- 容量:极小
- 成本:极高
- 高速缓存(Cache)
- 速度:很快
- 容量:小
- 成本:高
- 主存(Main Memory)
- 速度:中等
- 容量:中等
- 成本:中等
- 本地存储(磁盘)
- 速度:慢
- 容量:大
- 成本:低
- 远程存储(网盘)
- 速度:很慢
- 容量:很大
- 成本:很低
存储性能特征
存储设备的性能特征总结如下:
特征 | 上层存储(寄存器、缓存) | 下层存储(磁盘、网盘) |
---|---|---|
速度 | 快 | 慢 |
容量 | 小 | 大 |
成本 | 高 | 低 |
操作系统
操作系统是管理计算机硬件和软件资源的程序,提供各种服务给应用程序。
操作系统的主要功能
- 保护硬件被失控的软件应用程序滥用
- 提供隔离和保护机制
- 管理硬件资源的分配和回收
- 向应用程序提供简单一致的抽象接口来控制复杂的多种外设硬件
- 隐藏硬件的复杂性
- 提供标准化的接口
操作系统的分层结构
操作系统在硬件和应用程序之间起到中间层的作用:
1
2
3
4
5
6
7
8
+--------------------+
| 应用程序 | \
+--------------------+ \
| 操作系统 | > 软件
+--------------------+ /
| 处理器 | 主存 | 外设 | /
+--------------------+
硬件
- 系统调用(System Call):应用程序通过系统调用请求操作系统服务
- 指令集架构(ISA):操作系统通过指令集架构与硬件交互
This post is licensed under
CC BY 4.0
by the author.