|
|
51CTO旗下网站
|
|
移动端

Linux后端程序成长关键技术之底层体系结构

计算机程序的Bug千奇百怪,要想能顺利的解决疑难杂症,必须对计算机的底层原理非常熟悉。比如在实际生产中不光我们的应用会出问题,威廉希尔也可能有Bug,硬件也可能有Bug。

作者:itworld123来源:今日头条|2019-06-20 11:17
188bet uedbet 威廉希尔 明升 bwin 明升88 bodog bwin 明升m88.com 18luck 188bet unibet unibet Ladbrokes Ladbrokes casino m88明升 明升 明升 m88.com 188bet m88 明陞 uedbet赫塔菲官网 365bet官网 m88 help
188bet www.188bet.com bwin 平博 unibet 明升 188bet uk Ladbrokes 德赢vwin 188bet m88.com w88 平博88 uedbet体育 188bet 188bet 威廉希尔 明升体育app 平博88 M88 Games vwin德赢 uedbet官网 bodog fun88 188bet

计算机程序的Bug千奇百怪,要想能顺利的解决疑难杂症,必须对计算机的底层原理非常熟悉。比如在实际生产中不光我们的应用会出问题,威廉希尔也可能有Bug,硬件也可能有Bug。因此,只有更加深入的理解了原理,才能更加方便我们解决问题。

本文对计算机的体系结构底层原理进行简要的介绍。这些知识对于帮助我们解决疑难问题会有很大的帮助。做程序开发应该深入原理,不仅要知其然,还要知其所以然。

计算机的工作模式

Linux后端程序成长关键技术---底层体系结构
  1. 对于一个计算机来说,最核心的是CPU,CPU是计算机的大脑,所有设备都围绕其展开
  2. CPU通过总线(Bus)与其他设备连接,在这些设备中,最为重要的是内存(Memory)
  3. 单靠CPU是无法完成计算任务的,很多复杂的计算任务都需要将中间结果保存下来,然后基于中间结果进行下一步的计算
  4. CPU和内存是完成计算的核心组件

CPU本身无法保存这么多的中间结果,因此需要依赖于内存

CPU

  1. CPU包含三部分:运算单元、数据单元和控制单元
  2. 运算单元只管计算,但它不知道应该算哪些数据,运算结果应该放在哪里
  3. 运算单元计算的数据如果每次都要经过总线,直接到内存里面现拿,速度会很慢,因此出现了数据单元
  4. 数据单元包括CPU内部的缓存和寄存器组,空间很小,但速度很快
  5. 控制单元是一个统一的指挥中心,可以获得下一条指令,然后执行这条指令

这个指令会指导运算单元取出数据单元中的某几个数据,计算出结果,然后放在数据单元的某个地方

计算过程

1. 每个进程都有一个程序放在硬盘上,是二进制的,在里面存储的是一行一行的指令,这些指令会操作一些数据

2. 进程开始运行,会有独立的内存空间,相互隔离但不连续 - 程序会分别加载到进程A和进程B的内存空间里面,形成各自的代码段

3. 程序在运行过程中要操作的数据和产生的计算结果,都会放在数据段(内存)里

Linux后端程序成长关键技术---底层体系结构

4. 在CPU的控制单元里面,有一个指令指针寄存器,记录的是下一条指令在内存中的地址 - 控制单元会不停地将代码段的指令拿进来,先放入指令寄存器

5. 指令的组成部分:做什么操作 + 操作哪些数据 - 要执行指令,需要将第一部分交给运算单元,将第二部分交给数据单元

6. 数据单元根据数据的地址,从数据段里读取数据到数据寄存器,最终会有指令将数据写回到内存中的数据段

7. CPU里有两个寄存器,专门保存当前处理进程的代码段起始地址和数据段起始地址,图中的当前进程为进程A

8. CPU和内存通过总线传输数据,总线上有两类数据 - 地址总线(Address Bus):地址数据,位数决定了能访问的地址有多广 - 数据总线(Data Bus):真正的数据,位数决定了一次性能拿多少数据

x86架构

型号

Linux后端程序成长关键技术---底层体系结构

8086的原理

Linux后端程序成长关键技术---底层体系结构

通用寄存器

  1. 为了暂存数据,8086处理器内部有8个16位的通用寄存器,属于CPU内部的数据单元
  2. 分别是AX、BX、CX、DX、SP、BP、SI和DI
  3. 其中AX、BX、CX和DX可以分成两个8位的寄存器来使用,其中H就是High,L就是Low
  4. 这样,比较长的数据也能暂存,比较短的数据也能暂存

控制单元

  • IP寄存器(Instruction Pointer Register)即指令指针寄存器

- 指向代码段中下一条指令的位置

- CPU会根据IP寄存器不断地将指令从内存的代码段中,加载到CPU的指令队列中,然后交给运算单元去执行

  • 切换进程

- 每个进程都分为代码段和数据段

- 为了指向不同进程的地址空间,有4个16位的段寄存器,分别是CS、DS、SS和ES

  • CS(Code Segment Register)是代码段寄存器,通过它可以找到代码在内存中的位置
  • DS(Data Segment Register)是数据段寄存器,通过它可以找到数据在内存中的位置
  • SS(Stack Segment Register)是栈寄存器,但凡与函数调用相关的操作,都与栈紧密相关

- A调用B,B调用C

- 当A调用B的时候,要执行B函数的逻辑,因而A运行的相关信息会被push到栈里

- 当B调用C的时候,同理,B运行的相关信息会被push到栈里,然后才运行C函数的逻辑

- 当C运行完毕后,先pop出来的是B,B接着调用C函数之后的指令运行下去

- B运行完毕后,再pop出来的是A,A接着运行,直至结束

Linux后端程序成长关键技术---底层体系结构

加载内存数据

  1. 如果需要加载内存中的数据,可以通过DS找到内存中的数据,加载到通用寄存器
  2. 对于一个段,有一个起始地址,而段内的具体位置,称为偏移量
  3. CS和DS都存放着一个段的起始地址
  • 代码段的偏移量放在IP寄存器
  • 数据段的偏移量放在通用寄存器
  1. CS和DS都是16位的(起始地址),IP寄存器和通用寄存器也都是16位的(偏移量),但8086的地址总线是20位的
  • 凑20位:起始地址 << 4 + 偏移量
  1. 无论真正的内存有多大,对于只有20位地址总线的8086来说,能够区分的地址也就2^20=1M(寻址单位为Byte)
  • 如果想访问1M+X的地方,在总线上超过20位的部分根本发不出去,最后访问的还是1M内的X位置
  1. 偏移量只有16位的,所以一个段的最大大小为2^16=64K
  2. 因此对于8086的CPU来说,最多只能访问1M的内存空间,还要分成多个段,每个段最大为64K

32位处理器

  1. 在32位的CPU中,有32根地址总线,可以访问2^32=4G的内存
  2. x86架构是开放的,因此32位的CPU需要兼容原来的架构

兼容

Linux后端程序成长关键技术---底层体系结构

1. 通用寄存器 - 将8个16位的通用寄存器扩展到8个32位的通用寄存器,但依然保留16位和8位的使用方式 - 高16位不能分成两个8位使用,因为这是不兼容的

2. IP寄存器 - 指向下一条指令的指令指针寄存器IP,会扩展成32位的,同样兼容16位

3. 段寄存器(Segment Register) - CS、DS、SS和ES仍然是16位,但不再是段的起始地址,段的起始地址放在内存的某个地方(表格)

- 表格中的一项是段描述符(Segment Descriptor),里面才是段真正的起始地址 - 而段寄存器里面保存的是这个表格中的某一项,称为选择子(Selector)

- 获取段起始地址的流程:先间接地从段寄存器中找到表格中的一项,再从表格中的一项拿到段真正的起始地址

- 为了快速拿到段的起始地址,段寄存器会从内存中拿到CPU的描述符高速缓存器中

- 这种模式与8086的模式不兼容,但非常灵活,可以保持未来的兼容性

实模式 VS 保护模式

  1. 在32位的架构下,将前一种模式称为实模式(Real Pattern),后一种模式称为保护模式(Protected Pattern)
  2. 系统刚刚启动的时候,CPU处于实模式,此时和原来的模式是兼容的。即32位的CPU,也支持在原来的模式下运行,速度会快一点
  3. 当需要更多内存时,可以遵循一定的规则,进行一系列的操作,然后切换到保护模式,就能够用到32位CPU更强大的能力
  4. 如果不能无缝兼容,但通过切换模式兼容,也是可以接受的

系统交互

Linux后端程序成长关键技术---底层体系结构

常用汇编指令

mov, call, jmp, int, ret, add, or, xor, shl, shr, push, pop, inc, dec, sub, cmp

【编辑推荐】

  1. Linux应急响应之工具篇
  2. 如何用Linux帮助你拼写?
  3. 你的Linux服务器果真得到保护了吗?
  4. Neofetch:在终端中显示Linux系统信息
  5. 在AppImage、Flathub和Snapcraft平台上搜索Linux应用
【责任编辑:武晓燕 TEL:(010)68476606】

点赞 0
分享:
大家都在看
猜你喜欢

订阅专栏+更多

20个局域网建设改造案例

20个局域网建设改造案例

网络搭建技巧
共20章 | 捷哥CCIE

382人订阅学习

WOT2019全球人工智能技术峰会

WOT2019全球人工智能技术峰会

通用技术、应用领域、企业赋能三大章节,13大技术专场,60+国内外一线人工智能精英大咖站台,分享人工智能的平台工具、算法模型、语音视觉等技术主题,助力人工智能落地。
共50章 | WOT峰会

0人订阅学习

Spring Boot 爬虫搜索轻松游

Spring Boot 爬虫搜索轻松游

全栈式开发之旅
共4章 | 美码师

87人订阅学习

读 书 +更多

软件设计师考试全真模拟试题及解析

本书是按照全国计算机技术与软件专业技术资格(水平)考试《软件设计师考试大纲》的要求,参照《软件设计师教程》及近年来考试试题编写的,...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊

51CTO服务号

51CTO播客