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

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

计算机的工作模式

对于一个计算机来说,最核心的是CPU,CPU是计算机的大脑,所有设备都围绕其展开

CPU通过总线(Bus)与其他设备连接,在这些设备中,最为重要的是内存(Memory)

单靠CPU是无法完成计算任务的,很多复杂的计算任务都需要将中间结果保存下来,然后基于中间结果进行下一步的计算

CPU和内存是完成计算的核心组件

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

CPU

CPU包含三部分:运算单元、数据单元和控制单元

运算单元只管计算,但它不知道应该算哪些数据,运算结果应该放在哪里

运算单元计算的数据如果每次都要经过总线,直接到内存里面现拿,速度会很慢,因此出现了数据单元

数据单元包括CPU内部的缓存和寄存器组,空间很小,但速度很快

控制单元是一个统一的指挥中心,可以获得下一条指令,然后执行这条指令

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

计算过程

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

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

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

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

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

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

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

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

x86架构

型号

8086的原理

通用寄存器

为了暂存数据,8086处理器内部有8个16位的通用寄存器,属于CPU内部的数据单元

分别是AX、BX、CX、DX、SP、BP、SI和DI

其中AX、BX、CX和DX可以分成两个8位的寄存器来使用,其中H就是High,L就是Low

这样,比较长的数据也能暂存,比较短的数据也能暂存

控制单元

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接着运行,直至结束

加载内存数据

如果需要加载内存中的数据,可以通过DS找到内存中的数据,加载到通用寄存器

对于一个段,有一个起始地址,而段内的具体位置,称为偏移量

CS和DS都存放着一个段的起始地址

代码段的偏移量放在IP寄存器

数据段的偏移量放在通用寄存器

CS和DS都是16位的(起始地址),IP寄存器和通用寄存器也都是16位的(偏移量),但8086的地址总线是20位的

凑20位:起始地址 << 4 + 偏移量

无论真正的内存有多大,对于只有20位地址总线的8086来说,能够区分的地址也就2^20=1M(寻址单位为Byte)

如果想访问1M+X的地方,在总线上超过20位的部分根本发不出去,***访问的还是1M内的X位置

偏移量只有16位的,所以一个段的***大小为2^16=64K

因此对于8086的CPU来说,最多只能访问1M的内存空间,还要分成多个段,每个段***为64K

32位处理器

在32位的CPU中,有32根地址总线,可以访问2^32=4G的内存

x86架构是开放的,因此32位的CPU需要兼容原来的架构

兼容

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 保护模式

在32位的架构下,将前一种模式称为实模式(Real Pattern),后一种模式称为保护模式(Protected Pattern)

系统刚刚启动的时候,CPU处于实模式,此时和原来的模式是兼容的。即32位的CPU,也支持在原来的模式下运行,速度会快一点

当需要更多内存时,可以遵循一定的规则,进行一系列的操作,然后切换到保护模式,就能够用到32位CPU更强大的能力

如果不能无缝兼容,但通过切换模式兼容,也是可以接受的

系统交互

常用汇编指令

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

【编辑推荐】

【责任编辑:武晓燕 TEL:(010)68476606】

点赞 0

linux底层技术,Linux后端程序成长关键技术之底层体系结构相关推荐

  1. k8s 偏向运维技术 ,后端程序员为什么要学习k8s?

    k8s 偏向运维技术 ,后端程序员为什么要学习k8s?? 1.以前项目开发:开发,运维是密不可分 - 上线 运维,开发密不可分     2.开发&运维 结合更紧密 - DevOps - 流水线 ...

  2. 图像视频编码新纪元,体验升级技术变革,AR及其关键技术......

    图像视频编码&机器智能 Topic <图像视频编码新纪元 -- 面向机器智能> 虞露  浙江大学 求是特聘教授 在数字经济社会,智能机器正在广泛领域取代人类"观看&quo ...

  3. (转自阿里技术)如何快速成长为技术大牛?阿里资深技术专家的总结亮了

    如何快速成长为技术大牛?阿里资深技术专家的总结亮了 李运华 阿里技术 3月29日 阿里妹导读:你是否有类似这样的问题--"天天写业务代码的程序员,怎么成为技术大牛,开始写技术代码?" ...

  4. ajax技术怎么应用程序,利用AJAX技术开发应用程序.pdf

    维普资讯 2008年6月 电 脑 学 习 第3期 利用AJAX技术开发应用程序 蔡燕敏' 摘 要:介绍了AJAx技术的概念.工作原理及使用AJAX技术的基本原则.讨论了AJAx技术在应用程序的开发过 ...

  5. 【算力网络】算力网络的技术创新——绿色与安全关键技术

    本人就职于国际知名终端厂商,负责modem芯片研发. 在5G早期负责终端数据业务层.核心网相关的开发工作,目前牵头6G算力网络技术标准研究. 博客内容主要围绕:        5G协议讲解       ...

  6. 【算力网络】算力网络的技术创新——算网一体关键技术

    本人就职于国际知名终端厂商,负责modem芯片研发. 在5G早期负责终端数据业务层.核心网相关的开发工作,目前牵头6G算力网络技术标准研究. 博客内容主要围绕:        5G协议讲解       ...

  7. JVET H.266编码技术amp;JEM编码平台关键技术整理分析

    也是很久没有写博客了,也不能说因为时间太忙,可能就是有些顾不太过来更新,同时自己项目和学习的进展也比较有限吧. 这篇博客是上一周,给导师做的<JVET H.266编码技术调研>.其实基本没 ...

  8. 计算机视觉关键技术论文,视觉显著性检测关键技术研究

    作者姓名导师姓名文献出处论文摘要随着互联网技术和多媒体技术的飞速发展,数字媒体信息呈现出以几何级数增长的态势.海量的数字媒体为人们的娱乐.教育和商业带来便利的同时,也为视觉信息处理技术提出了新的挑战. ...

  9. 物联网技术的发展历史及关键技术

    文章目录 1 物联网技术的发展历史及基本概念 1.1 物联网技术的发展历史 1.2 物联网技术的基本概念 2 物联网的核心技术 2.1 传感器技术 2.2 组网技术 2.3 嵌入式技术 2.4 云计算 ...

  10. Linux 系统licence,Linux系统中软件简单License的实现

    概述 目前,很多商用应用系统是运行在Linux系统之上的,为了维护开发者利益,有必要为软件添加license功能,防止软件被盗用和挪用.本文探讨如何在Linux软件中添加license功能,用到的算法 ...

最新文章

  1. LSTM之父:吐槽了两年,来划划重点:“这5篇最高引论文都源于我们。”
  2. java jtable 添加数据库_java-将jTable中的数据插入数据库
  3. 日历,日期类(copy)
  4. python概念与术语,python之基础篇(四)
  5. C语言面向对象编程(四):面向接口编程
  6. 使用athens部署企业内部Gitlab go mod包的Go私服代理
  7. java jlable添加gif,Java动画GIF而不使用JLabel
  8. 计算机硬件:关于CPU的12个硬核干货!
  9. dump分析工具_Java应用CPU过高,如何排查?参考解决思路和常用工具总结
  10. 分布式系统的面试题1
  11. 诺基亚7P可刷华为鸿蒙系统,今日热闻 | 鸿蒙OS 2.0发布、EMUI 11发布、iPhone 12或配备7P镜头...
  12. 83)PHP,配置文件功能
  13. win10、win8/8.1、win7系统激活工具-----也可激活Office各版本
  14. 微信小程序长按识别二维码
  15. 22条创业军规,让你5分钟读完《创业维艰》
  16. 软考中级网络工程师学习笔记(知识点汇总)详细版本
  17. IOS AES加密/解密
  18. Java基础学习笔记:补充内容1 计算机字符编码
  19. 用HTML+CSS+JS做一个漂亮的个人网页
  20. Sailfish OS 2.0之初体验

热门文章

  1. 乐高大颗粒作品24:金蟾
  2. C语言绘图示例-繁花图案
  3. Google SketchUp SDK
  4. 安徽农业大学计算机考研分数线,安徽农业大学2019年考研复试分数线已公布
  5. 采样频率和带宽的关系_示波器的采样率及存储深度
  6. Linux Shell发邮件笔记
  7. python3 print和format函数
  8. Apifox测试Excel文件上传
  9. tf 矩阵行和列交换_tf矩阵基础
  10. 学计算机i58300够用嘛,酷睿i58300h处理器怎么样