计算机程序中的错误非常奇怪,为了顺利解决难题,您必须非常熟悉计算机的基本原理。例如,在实际生产中,我们的应用程序不仅会出现问题,操作系统可能会出现错误,而且硬件可能存在错误。因此,只有更深入地了解原理才能使我们更容易解决问题。
本文简要介绍了计算机体系结构的基本原理。这些知识将有助于我们解决困难问题。进行程序开发应该深入到原则中,不仅要知道它,还要知道原因。
电脑工作模式
Linux后端程序增长的关键技术---底层架构
对于计算机,核心是CPU,CPU是计算机的大脑,所有设备都围绕它部署。
CPU通过总线连接到其他设备。在这些设备中,最重要的是存储器。
单独的CPU无法完成计算任务,许多复杂的计算任务需要保存中间结果,然后根据中间结果进行下一次计算
CPU和内存是计算的核心组件
CPU本身无法保存这么多中间结果,因此需要依赖内存。
中央处理器
CPU由三部分组成:算术单元,数据单元和控制单元。
算术单元仅计算计算,但不知道应计算哪些数据,以及应放置操作结果的位置。
算术单元计算出的数据每次都会通过总线,并直接进入存储器。速度将非常慢,因此数据单元出现。
数据单元包括CPU的内部高速缓存和寄存器组。空间小而快。
控制单元是统一的命令中心,可以获得下一条指令,然后执行指令。
该指令将指示算术单元取出数据单元中的一些数据,计算结果,然后将其放在数据单元中的某个位置。
计算过程
1.每个进程在硬盘上都有一个程序,它是二进制的。它逐行存储指令。这些命令将操作一些数据。
2.进程开始运行,将有独立的内存空间,隔离但不连续 - 程序将分别加载到进程A和进程B的内存空间,形成自己的代码段。
3.在运行过程中由程序操作的数据和计算结果放在数据段(存储器)中。Linux后端程序增长的关键技术---底层架构
4.在CPU的控制单元中,有一个指令指针寄存器,用于记录存储器中下一条指令的地址 - 控制单元将继续执行代码段的指令并首先将其放入指令寄存器。
5.指令的组成部分:做什么+操作什么数据 - 执行指令,需要将第一部分传递给算术单元,第二部分传递给数据单元
6.数据单元根据数据的地址从数据段读取数据到数据寄存器,最后将有一条指令将数据写回存储器中的数据段。
7. CPU中有两个寄存器,专门保存当前处理过程的代码段起始地址和数据段起始地址。图中的当前过程是过程A.
8. CPU和内存通过总线传输数据,总线上有两种类型的数据 - 地址总线:地址数据,位数决定了地址可以访问的宽度 - 数据总线:实数据,位数确定一次性能中采集的数据量。
X86架构
模型
Linux后端程序增长的关键技术---底层架构
8086的原则
Linux后端程序增长的关键技术---底层架构
通用寄存器
为了临时存储数据,8086处理器有8个16位通用寄存器,属于CPU的内部数据单元。
AX,BX,CX,DX,SP,BP,SI和DI
其中AX,BX,CX和DX可分为两个8位寄存器,其中H为高,L为低。
以这种方式,可以临时存储相对长的数据,并且可以临时存储相对短的数据。
控制单元
指令指针寄存器
- 指向代码段中下一条指令的位置
- CPU将根据IP寄存器将指令从存储器的代码段连续加载到CPU的指令队列中,然后将其传送到算术单元执行。
切换过程
- 每个过程分为代码段和数据段
- 为了指向不同进程的地址空间,有四个16位段寄存器,分别是CS,DS,SS和ES。
CS(代码段寄存器)是一个代码段寄存器,通过它您可以在内存中找到代码的位置。
DS(数据段寄存器)是一个数据段寄存器,通过它您可以在内存中找到数据的位置。
SS(堆栈段寄存器)是堆栈寄存器,但与函数调用相关的所有操作都与堆栈密切相关。
- 呼叫B,B呼叫C - 当A调用B时,执行B函数的逻辑,因此有关A操作的信息被压入堆栈。
- 当B调用C时,相同的信息,B相关信息将被推送到堆栈,然后运行C函数的逻辑。
- 当C运行时,第一个弹出是B,B然后调用C函数然后运行。
- B运行后,弹出为A,然后A运行直到结束
Linux后端程序增长的关键技术---底层架构
加载内存数据
如果需要在内存中加载数据,可以通过DS在内存中找到数据,并将其加载到通用寄存器中。
对于段,存在起始地址,并且段内的特定位置称为偏移。
CS和DS都存储段的起始地址
代码段的偏移量放在IP寄存器中
数据段的偏移量放在通用寄存器中
CS和DS都是16位(起始地址),IP寄存器和通用寄存器也是16位(偏移),但8086地址总线是20位。
制作20:起始地址