软件工程实践 Blog1
2021SC@SDUSC
学习模块:计算机系统 —— 笔记 01
主要内容:储备系统原理的知识,自底向上的学习路线
001 程序的编译过程
以 gcc 编译 Hello, world 为例
对于上面的编译过程,也可以分步手动执行
// 预处理:加入头文件,替换宏
gcc HelloWorld.c -E -o HelloWorld.i
// 编译:包含预处理,将 C 程序转换为汇编程序
gcc HelloWorld.c -S -c -o HelloWorld.s
// 汇编:包含预处理和编译,将汇编转换为可链接的二进制程序
gcc HelloWorld.c -c -o HelloWorld.o
// 链接:包含以上所有操作,将可链接的二进制程序和其他库链接在一起,形成可执行的程序文件
gcc HelloWorld.c -o HelloWorld
CSAPP 1.2 节
hello.c --- cpp ---> hello.i --- ccl (编译器) ---> hello.s --- as(汇编器)
---> hello.o (从文本变为二进制文件) --- id(链接器) , 同时加入其他库文件
---> ./hello (生成可执行文件)
详细 链接 的原理部分在 本书 第七章 链接,主要介绍不同文件之间的连接技术
002 程序装载执行
图灵机模型:图灵机是一个抽象的模型,它是这样的:有一条无限长的纸带,纸带上有无限个小格子,小格子中写有相关的信息,纸带上有一个读头,读头能根据纸带小格子里的信息做相关的操作并能来回移动。
以 1+1=2 的计算例子表示:
一篇介绍图灵机的文章:https://zhuanlan.zhihu.com/p/125645744
图灵机终归知识理想模型,而后冯·诺伊曼就提出了电子计算机使用二进制数制系统和储存程序,并按照程序顺序执行的冯诺依曼体系结构。
冯诺依曼体系结构提出的几个要求
- 可以把程序和数据装入到计算机中
- 必须具有长期存储程序、数据的中间结果及最终运算结果
- 完成各种算术、逻辑运算和数据传送等数据加工处理
- 根据需要控制程序走向,并能根据指令控制机器的各部件协调操作
- 能够按照要求将处理的数据结果显示给用户
相应的形成了体系结构的中的五大部件:
- 装载数据和程序的输入设备
- 记住程序和数据的存储器
- 完成数据加工处理的运算器
- 控制程序执行的控制器
- 显示处理结果的输出设备
依据上述的构想,只需要将图灵机模型中的几个部件置换成电子设备,就可以构成一台最小单元的电子计算机。
而后尝试使用上述模型解读 hello.s 的汇编代码
以上图中,分成四列:第一列为地址;第二列为十六进制,表示真正装入机器中的代码数据;第三列是对应的汇编代码;第四列是相关代码的注释。这是 x86_64 体系的代码,由此可以看出 x86 CPU 是变长指令集。