深入理解计算机系统
CSAPP 是 CMU 的一门课程 CMU CS15213 的缩写,同时也是这门课被誉为神书的教材的缩写,其全称为 Computer Systems: A Programmer’s Perspective。
教材 PDF:https://www.cs.sfu.ca/~ashriram/Courses/CS295/assets/books/CSAPP_2016.pdf
前言
- 课程特点
课程讲授如何从程序员的角度全面理解计算机系统,帮助程序员在充分理解计算机系统底层运行原理的基础上,写出正确性、可用性、运行性能更优的程序。
- 课程内容
课程聚焦于 C 语言程序是如何在使用 x86-64 机器码的 Linux 机器上执行的。
x86: CPU 指令集架构,根据 Intel CPU 系列产品线得名;
Linux: 操作系统内核,常见版本有 Ubuntu、Debian、CentOS,负责网络、进程调度、内存管理、文件系统等;
gcc: GNU(GNU’s Not Unix) 项目开发的编译器。
- 为什么我们需要了解计算机系统
- 因为有时候程序执行的结果会出乎我们的意料
(lldb) print 40000 * 40000
(int) 1600000000
(lldb) print 50000 * 50000
(int) -1794967296
(lldb) print 300*400*500
(int) 60000000
(lldb) print 300*400*500*600
(int) 1640261632
- 因为有一些事情我们容易忽视
例如:系统的存储不是无限的、不同的存储层级之间存在很大的性能差距。
Chapter 1: A Tour of Computer Systems
1. 从 Hello World 开始
我们需要尝试理解,一个最简单的程序从编写、执行再到终止的整个生命周期过程中,我们的计算机系统发生了哪些事情。
- Source Program
人类用高级语言编写的和可理解的 text file,通常用 ASCII 码表示。
-
编译的整个过程
-
包含 Preprocessing、Compilation、Assembly、Linking 四个步骤,把源代码转换成可执行程序。
-
Preprocessing
插入系统头文件的内容,得到 hello.i;
- Compilation
将源代码转换成文本格式的汇编语言,得到 hello.s;
- Assembly
将文本格式的汇编语言转换成二进制文件,得到 hello.o;
- Linking
融合被引用的方法实现,得到可执行文件 hello。
-