程序的编译处理过程
预处理阶段——编译阶段——汇编阶段——链接阶段
预处理:(修改原始程序,插入一些引用库)
修改原始c程序,如读取stdio.h的内容,插入到程序文本,得到另一个c程序,以.i结尾
编译:(编译成汇编语言)
将.i翻译成.s,包含一个汇编语言程序,汇编语言中的每条语句都是都以一种标准的文本格式确切描述一条低级机器语言指令。汇编语言为不同高级语言的不同编译器提供了通用的输出语言。
汇编:(将汇编语言翻译成机器语言)
汇编器将.s翻译成机器语言。并把这些语言指令打包成一种可重定位的目标语言。并将结果保持在.o程序。这次就是二进制文件了。它的字节编码是机器指令而不是字符。打开将看到乱码
链接:(连接,合并,变成可执行文件)
链接到引用的预编译好的函数库。并合并到hello.o中。最后变成可执行目标文件,加载到内存,系统就可以运行了。
编译器先把源文件转换成汇编文件,再调用汇编器和连接器生成可执行文件
汇编语言:一种以计算机指令为基础的低级语言
汇编器:将汇编文本翻译为机器语言(machine code,二进制文件)
链接器:处理合并,链接(link),将有关的目标文件彼此连接生成二进制的可加载,可执行的程序。它的核心工作是符号表的解析和重定位。
典型计算机硬件模型
存储器结构的主要思想就是上一级的存储器作为低一级存储器的高速缓存。
操作系统:应用程序与硬件之间插入的一层软件。
OS基本功能:1.防止硬件被失控的软件滥用 2.向应用程序提供简单一致的机制来控制复杂而又通常大相径庭的低级硬件设备(底层硬件设备,并不低级)
进程:
操作系统对一个正在运行的程序的抽象。实现进程这抽象概念需要低一级的硬件和os通力合作。进程的切换就是系统上下文切换。
线程:
一个进程可以由多个称之为线程的执行单元组成。每个线程都运行在进程的上下文中,并共享同样的代码和全局数据。
线程是非常重要的编程模型,因为多线程之间比多进程之间更容易共享数据,线程更加高效。
虚拟存储器:
抽线概念,为每个进程提供假象。它的运作需要硬件和os的精密复杂交互,包括对处理器生成的每个地址的硬件翻译。
基本思想是把一个进程虚拟存储器的内容存储到磁盘上,然后用主存(dram)做磁盘(disk)的告诉缓存。
地址从下往上是增大的。
文件:
文件就是字节序列。每个IO设备都可视为文件。文件这个概念简单而精致,因为它向应用程序提供一个统一的视角,来看待系统中各式各样的I/O设备。
Linux:
一个完整的,符合posix(unix标准,消除unix版本差异)标准的unix os的版本。
everything is file,不仅是一种技术,而是一种文化现象。
SIMD单指令多数据:一条指令并行执行多个数据操作。