前言:
《深入理解操作系统》个人用学习笔记。
Ⅰ. 计算机系统
0x00 计算机系统无处不在
0x01 拆解 PS5
硬件: CPU、GPU、内存、磁盘等。
0x02 系统软件
用于计算机硬件运作或管理运行应用软件的一种软件。
- 操作系统
- 设备驱动程序
- 编译器、链接器和调试器
由硬件和系统软件组成,用于运行应用程序。
计算机系统影响程序员程序的正确性和性能。
你将学习: 如何避免由数字表示系统引起的奇怪的数字错误 - 如何优化你的C语言代码 - 过程调用如何实现并避免安全漏洞 - 如何编写你自己的Unix shell,自己的网络服务器等。
Ⅱ. 操作系统之旅
0x00 通过 HelloWorld 程序来探索
💬 hello.c
#include <stdio.h> int main() { printf("hello, world\n"); }
💬 转换为 ASCII 码表示:
所有信息都以一堆 bits 来表示:
- 磁盘文件、程序、用户数据、网络上传输的数据
- 不同的背景 - 相同的字节序列
- 整数、浮点、字符串或机器指令
0x01 ASCII(美国信息交换标准代码)
0x02 编译系统
将高级C语言程序翻译成处理器读取和操作的二进制代码。
0x03 汇编概览
0x04 可执行目标程序
一个准备装入内存并由计算机系统执行的程序:
0x05 系统的硬件组成
BUS(总线)
一组电线,携带信息字节并负责在各个部件值间传递。
a collection of electrical wires that carry bytes of information back and forth between the components.
IO devices(IO 设备)
IO 设备是系统与外界联系的通道。比如,显示器,鼠标,磁盘和网络适配器。
the system’s connection to the external world. ex: display, mouse, disk, and network adapter.
Main memory(主存)
主存是一个临时存储设备,在处理器执行程序时,他被用来存放程序和程序处理的数据。
a temporary storage device that holds both a program and the data it manipulates while the processor is executing the program
Processor or central processing unit (处理器)
中央处理单元(CPU)简称处理器,是解释或执行存储在主存中指令的引擎。
寄存器文件(register file):小型存储器
算数逻辑元(ALU):计算单元
程序计数器(PC):线路指示器
an engine that interprets or executes program instructions stored in main memory.
• Register file: small storage
• Arithmetic/logic unit: computing unit
• Program counter: line indicator
CPU:中央处理单元
ALU:算数/逻辑单员
PC:程序计数器
USB: 通用串行总线
Ⅲ. 跑一下 "hello" 程序
1. 在shell程序中获得一个执行 "hello "程序的命令。
2. 操作系统将存储在磁盘中的 "hello "可执行程序加载到内存中并开始运行该程序。
3. 一个处理器执行加载的 "hello "程序的指令。
4. 终止后,切换回shell程序
0x00 Shell Program
基于文本的用户界面
- 基于命令行的解释器
- 直接运行命令
- 探索文件系统
- 删除和创建文件
- 浏览路径
- 运行程序
- 打印文本
0x01 从键盘上读取 hello 指令
我们在键盘上输入字符串 ./hello 后,shell 程序就逐一读取字符到寄存器,再把它存放到寄存器中。当我们在键盘上敲回车键时,shell就知道我们已经输完了,然后 shell 会执行一系列指令,这些指令将 hello 目标文件中大哥代码和数据从磁盘拷贝到主存,从而加载 hello 文件。数据包括最终会被输出的字符串 "hello, world\n" 。
0x02 从磁盘加载可执行文件到主存(Loading executable from disk into memory)
这里利用了 DMA技术 (直接存储器存器),使得数据可以不通过处理器,直接从磁盘到达主存。
0x03 将可执行文件从磁盘加载到内存中(Loading executable from disk into memory)
0x04 将 "hello, world" 从内存中写到显示器上(Writing “hello, world” from memory to display)
hello 目标文件中的代码和数据被加载到了处理器后,处理器就开始执行 hello 程序的主程序中的机器语言指令,这些指令将 "hello,world\n" 串中的字节从存储器中拷贝到寄存器文件,再从寄存器中 文件拷贝到 显示设备,最终显示在屏幕上。
0x04 缓存问题(Caches matters)
处理器内存差距不断增大
几百字节的寄存器文件/数百万字节的主内存(但比主内存快100倍)。
为了解决处理器与主存之间的差异,系统设计者采用了更小更快的存储设备 —— 高速缓存存储器(cache memories)。
程序员可以利用缓存来提高其程序的性能。
0x05 存储器层次结构(Memory hierarchy)
就像程序员可以运用 L1 和 L2 的知识来提高程序性能一样,程序员同样可以利用对整个存储器层次模型的理解来提高程序性能。
0x06 操作系统管理硬件(The operating system manages the hardware)
❓ 谁来访问键盘、显示器、磁盘?
操作系统:保护和硬件接口
操作系统为应用软件提供抽象的/假想的硬件环境,以消除硬件细节,并将硬件依赖性与应用软件解耦。应用软件使用这些假想的系统特性(虚拟内存、I/O设备),而操作系统则将这些特性解释为真实的硬件特性。
进程(后来的线程):
操作系统对正在运行的程序的抽象
多个进程可以在同一个系统上同时运行
每个进程似乎都有对硬件的独家使用权
虚拟存储器(Virtual memory):Linux 中的进程虚拟地址空间
文件(Files):字节序列,每个I/O设备都被建模为文件键盘、网络等。 读/写。
0x07 利用网络系统和其他系统通信(Systems communicate with other systems using net works)
网络也是一种 I/O 设备。
参考资料:
Computer Systems: A Programmer's Perspective (3rd Edition)