计算机程序的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的内存空间,还要分成多个段,每个段最大为64K32位处理器

在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

本文作者: zhongmingmao 本文链接: 不能说,否则就成广告了。

举报/反馈

linux传输系统架构,Linux后端程序成长关键技术——底层体系结构相关推荐

  1. linux性能架构,Linux性能及调优指南(翻译)之Linux内存架构

    Jmeter性能测试入门(转) 出处:http://www.cnblogs.com/by-dream/p/5611555.html Jmeter性能测试步骤 1. 添加线程组之后,先设置这两项: 2. ...

  2. linux常用架构,Linux常用到的一些命令-Go语言中文社区

    1.poweroff 关闭系统(1) 2.halt 关闭系统(2) 3.reboot 重启系统 4.pwd 查看当前所在目录的绝对路径 5.mkdir 文件名 创建一个目录文件 6.rm 文件名 删除 ...

  3. Linux 系统架构

    Linux 系统架构 Linux系统组成 Linux内核的整体架构 Linux系统启动过程 操作系统启动流程 加载BIOS 读取MBR GRUB引导 加载Kernel 设定Inittab运行等级 加载 ...

  4. 【Linux 内核】Linux 内核特性 ( 组织形式 | 进程调度 | 内核线程 | 多平台虚拟内存管理 | 虚拟文件系统 | 内核模块机制 | 定制系统调用 | 网络模块架构 )

    文章目录 一.Linux 内核特性 1.Linux 内核组织形式 2.Linux 进程调度 3.Linux 内核线程 4.Linux 内核多平台虚拟内存管理 5.Linux 虚拟文件系统 6.Linu ...

  5. THREE DAY | 网络安全之Linux(包含Linux常用命令,镜像下载,docker命令等内容)超详细!!!

    THREE DAY | 网络安全之Linux 一.Linux介绍 1.Linux系统简介 Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户.多任务.支持多 ...

  6. 数云融合丨《数字时代应用可持续性架构和验证白皮书》发布,转型关键技术看这里

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一.前言 二.什么是应用可持续性? 三.应用可持续性面临挑战 敏捷挑战 信创挑战 疫情挑战 四.应用可持续性架构和验证 五. ...

  7. 5G电力专网架构及关键技术

    [摘  要]随着5G网络的建设和关键技术的发展,5G专网和电力应用开始大规模融合,催生出能适应电力需求的5G电力专网.首先,梳理电力"发"."输"." ...

  8. 6G网络潜在关键技术研究综述

    [摘  要]当前6G的研究还处于初步阶段,标准化工作尚未正式开始,业界对6G展开了丰富的想象.首先简要介绍了移动网络演进历程,并对演进特点做了分析,然后介绍了当前业界对6G网络驱动力.愿景和新型业务场 ...

  9. 欧洲6G时间表、目标和关键技术(下篇)

    关注公众号回复"220216"下载 <European Vision for the 6G Network Ecosystem>原文 5GIA(5G基础设施协会)在20 ...

  10. 后端程序员必备的 Linux 基础知识+常见命令(近万字总结)

    大家好!我是 Guide 哥,Java 后端开发.一个会一点前端,喜欢烹饪的自由少年. 今天这篇文章中简单介绍一下一个 Java 程序员必知的 Linux 的一些概念以及常见命令. 如果文章有任何需要 ...

最新文章

  1. Windows下使用Tesseract进行OCR文字识别
  2. 推荐八款.Net优秀的开源CMS 内容管理系统
  3. MVC模式在Java Web应用程序中的实例分析
  4. Mongoose快速入门
  5. 有关Linux下request.getRealPath(/)获取路径的问题
  6. oracle10g启动顺序,oracle 10g rac维护:开机 关机顺序,流程
  7. 在FIREBUG控制台中输入 jQuery() 返回 []
  8. kibana4 分析和搜索仪表板 安装和配置
  9. Python安装学习
  10. 简单远程控制(仅传递鼠标和键盘消息)的实现
  11. CentOS 6.7下 Samba服务器的搭建与配置(share共享模式)
  12. 瑞萨RH850F1L用户手册(UM)LIN master接口章节 中文翻译(Section 6 Exceptions/Interrupts(异常/中断))
  13. HBase 下载地址
  14. 【ManageEngine】IP地址扫描的作用
  15. 怎么设置html禁止直接打开,如何禁止网页自动跳转
  16. ip查看服务器信息,如何查看服务器的出口ip地址
  17. SourceInsight基本使用
  18. 编程之美---数字之魅
  19. 把Maven本地仓库修改为阿里云仓库
  20. how2j离线资源,2018,12月26最新

热门文章

  1. Working with Qt maya2011
  2. 骨架法matlab,matlab中轴线算法骨架
  3. android 一种键盘不能调起的解决方法
  4. python和c 情侣网名_qq情侣网名个性网
  5. 一切皆是映射:浅谈操作系统内核的缺页异常(Page Fault)
  6. JedisClusterException: No way to dispatch this command to Redis Cluster because keys have different
  7. Redis一主二从Sentinel监控配置
  8. ArcGIS模拟3D洪水
  9. An Underwater Image Enhancement Benchmark Dataset and Beyong
  10. manjaro pacman 使用方法总结