x86汇编与逆向工程:软件破解与防护的艺术
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.3.1 计算机架构

一般来说,我们认为普通程序员不需要深入了解计算机的工作原理。当用过程式语言编写程序时,操作系统会处理所有的低级操作。程序显示为一个进程,该进程在需要处理器、内存和文件系统时随时可以访问它们。进程似乎有自己连续的内存空间,文件只是一系列可读写的字节。

然而,实际上这些都不是真的,操作系统一直在为你抽象这些真实情况(以便使编程更简单)。深入理解计算机架构实际运作方式对于逆向工程师来说至关重要。图1.3展示了构成计算机的主要组件,包括中央处理器、桥接器、内存和外设。

图1.3 计算机架构

1.中央处理器

中央处理器(Central Processing Unit,CPU)是计算机进行处理的地方。CPU内部包含以下组件:

• 算术逻辑单元(Arithmetic Logic Unit,ALU):ALU负责在计算机中执行数学运算,比如加法和乘法。

• 寄存器:寄存器负责进行临时数据存储,并被用作x86指令的主要输入和输出。寄存器提供对单字数据的极速访问,并通常通过名称进行访问。

• 控制单元:控制单元负责执行代码。这包括读取指令和协调计算机内其他元件的操作。

2.桥接器和外设

CPU通过系统总线(bus)连接到桥接器(bridge)。桥接器的主要目的是将CPU与系统的其他组件(包括内存和I/O总线)连接起来,I/O总线是外设(如键盘、鼠标和扬声器)与系统相连接的地方。当信息在总线上流动时,桥接器负责控制这种信息流并确保流入一个总线的流量被正确地路由到适当的总线上。

外设通过I/O总线连接,使得计算机能够与外部世界进行通信。这包括从显卡、键盘、鼠标、扬声器和其他系统发送和接收数据。

3.内存和寄存器

顾名思义,内存是计算机上存储数据的地方。数据以线性字节序列的形式存储,可以通过它们的地址访问。这种设计允许系统对存储的数据以相对较快的速度进行访问。

当程序想要访问内存中的数据时,CPU会通过总线发送一个请求给桥接器,然后桥接器会将这个请求转发给内存,在那里,指定地址的数据会被访问。然后,请求的数据需要沿着原路返回到CPU,才能被程序使用。相比之下,寄存器位于CPU内部,这使得它更易于访问。

寄存器是位于CPU内部的存储设备,不同于内存,它并不是线性字节序列。寄存器有特定的名称,并与每个寄存器有一定的大小关联。

寄存器和内存有同样的功能:它们都用来存储数据。然而,它们各有所长(就质量和数量而言)。寄存器数量稀少且昂贵,但数据访问速度极快。内存便宜且大量存在,但访问速度较慢。

程序关联的大部分数据(包括代码本身和其数据)将存储在内存中。在程序运行期间,会将小块的数据复制到寄存器进行处理。