操作系统基础知识概览
操作系统作为计算机科学的基础课程,需要多多了解学习
0x00 计算机硬件结构
+------------------+
| ======CPU======= |
+--------+---------+
|
+------------+--------------+
+-----+ | | +------+
| AGP +--------+ MCH(Memory Controller Hub)+----+Memory|
+--+--+ | | +------+
| +------------+--------------+
+------+-------+ |
| | +------------+--------------+ +-----+
| Display | | | | |
| | | ICH(I/O Controller Hub) +-----+ -->
+--------------+ | | | PCI |
+---+--------+-------+----+-+ | -->
| | | | | |
+----------+ | +----+---+ | +-+-----+ | -->
+---+ USB +-+ | ATA | | |Network| | |
| +-------+--+ +----+---+ | +-------+ | -->
| | | | | |
+---+---+ +----+---+ +------+--+ +--+--------+ | -->
| Mouse | |Keyboard| |Hard Disk| | Flash BIOS| | |
+-------+ +--------+ +---------+ +-----------+ +-----+
计算机体系架构需要知道以下内容:
- CPU 负责指令执行与控制;
- MCH - Memory Controller Hub 芯片连接高速部件,如内存、显卡;
- Memory 内存通过地址总线直接与 CPU 相连,并受控于它,通过数据总线与其传输数据;
- ICH - I/O Controller Hub 芯片连接各种外部低速输入输出设备,如鼠标、键盘、硬盘、 PCI 外部互连总线扩展设备。
整个体系架构中,CPU 在最上面,也是速度最快的(主频基本都是 GHz 级别),其次是通过 MCH(内存控制芯片)连接的内存和显卡,MCH 又被称为北桥芯片(上北下南),再下面连接的是南桥芯片 ICH(IO 控制芯片),ICH 芯片与各种低速设备连接。
对于 CPU 来说,所有连接的设备都属于 IO 设备,指令需要从内存中输入,处理得到的数据可以写入内存、硬盘,或者输出到显卡,以此来输出到显示器上。
0x01 指令集
3086 是 16 位的 CPU,一共可以寻址 65536 字节(64k),但是其实当时设计的是寻址 1M,所以需要 20 位寻址空间,一个 16 位的寄存器不够,那就用两个,采用分段寻址方式实现 20 位寻址空间。段寄存器 CS(代码段)、DS(数据段)、ES(扩展段)、SS(栈段),通用寄存器 AX、BX、CX、DX,其他控制寄存器 IP(指令指针寄存器)、SP(栈顶指针寄存器)、BP(栈基址寄存器)、SI、DI、FLAG 30386 是 32 位的 CPU
CPU 的指令集也很多,但是基本可以分为两类,它们差别主要体现在指令与数据处理上:
- CISC - Complex Instruction Set Computer 复杂指令集,具有大量的指令和数据寻址方式;
- RISC - Reduced Instruction Set Computer 精简指令集,仅处理寄存器中的数据;
PC 结构与 CPU 架构对比,分为以下两种情况,基本属于一一对应关系:
-
冯·诺依曼体系结构,对应 CISC 指令系统,如 x86、x86-64、Atom,常用于台式机或服务器:
- 数据与指令都存储在同一存储区中,取指令与取数据利用同一数据总线。
- 被早期大多数计算机所采用。
- ARM7 是冯诺依曼体系结构简单,但速度较慢,取指不能同时取数据。
-
哈佛体系结构,对应 RISC 指令系统,如嵌入式中流行的 ARM、PowerPC、MIPS、Sparc、Alpha,常用于工控、移动设备:
- 程序存储器与数据存储器分开。
- 提供了较大的存储器带宽,各自有自己的总线。
- 适合于数字信号处理。
- 大多数 DSP 都是哈佛结构。
- ARM9 是哈佛结构,取指和取数在同一周期进行,提高速度,改进哈佛体系结构分成三个存储区:指令区、数据区、共用区。
0x02 汇编语言
CPU 只能执行二进制指令,早期人们编程就是手写二进制指令,二进制指令不方便人类记忆和使用,所以就诞生了汇编语言,使用英文字符表示二进制指令,英文字符和二进制指令是一一对应的。
所以针对不同的 CPU,有不同的指令集,那么相对应的汇编语言指令名称也就不尽相同。
0x03 寄存器
CPU 只负责运算,不存储数据,那么从哪里获取数据,答案就是寄存器(而不是内存,内存相对 CPU 来说太慢了)。寄存器不需要寻址
步骤,按名称来区分,比如 x86 的 ESP 寄存器用来存储栈的地址,CPU 直接取 ESP 的值就能拿到数据,不需要寻址。
我们平时说的 16 位、32 位、64 位 CPU,指的就是寄存器的大小。
8086 如何确定下一条指令的地址?
使用代码段寄存器和指令指针寄存器:CS+IP
例如:CS=0xF000,IP=0x390A
那么下一条指令的执行地址就是:(CS«4) + IP = 0xF390A
0x04 内存模型
内存与 CPU 使用地址总线、数据总线、控制总线相连。
8086 的 1M 内存空间如下所示:
+------------------+ <- 0x00100000 (1MB)
| BIOS ROM |
+------------------+ <- 0x000F0000 (960KB)
| 16-bit devices, |
| expansion ROMs |
+------------------+ <- 0x000C0000 (768KB)
| VGA Display |
+------------------+ <- 0x000A0000 (640KB)
| |
| Low Memory |
| |
+------------------+ <- 0x00000000
如果想在屏幕上显示字符串,直接在 VGA 的内存(0xA0000-0xC0000)内写入数据即可。
BIOS 则是机器上电以后最先执行的代码,固定的内存地址为 0xF0000-0xFFFFF。为什么要固定,因为不固定,BIOS 系统找不到该执行哪块代码。BIOS 代码一般是机器厂商出厂时固化写死的。
0xff 参考
文档
工具
- QEMU Emulator:模拟器,可真实模拟出你的硬件环境,用于调试操作系统等底层系统
- GDB:GNU 项目的调试工具,用于查看一个程序内部活动
- GCC:编译器工具集,用于将高级语言编译成二进制可执行程序
- SPIM 模拟器:一个指令集的模拟器,可以模拟简单指令集,如 MIPS 指令集。QtSpim 是带有图形界面的版本。软件可以直接打开汇编代码。