《趣谈Linux》总结二:系统初始化

4 x86架构

对于linux来说,如果下面的硬件环境千差万别,就会很难集中精力做出让用户易用的产品;
毕竟天天适配不同的平台,就已经够辛苦了;
x86 架构就是这样一个开放的平台。

4.1 计算机的工作模式

在这里插入图片描述
对于一个计算机来讲,最核心的就是CPU(Central Processing Unit,中央处理器)。这是这台计算机的大脑,所有的设备都围绕它展开。

CPU 和其他设备连接,要靠一种叫作总线(Bus)的东西,其实就是主板上密密麻麻的集成电路,这些东西组成了 CPU 和其他设备的高速通道。

在这些设备中,最重要的是内存(Memory)。
原因:因为单靠 CPU 是没办法完成计算任务的,很多复杂的计算任务都需要将中间结果保存下来,然后基于中间结果进行进一步的计算;CPU 本身没办法保存这么多中间结果,这就要依赖内存了。

还有一些其他设备,例如显卡会连接显示器、磁盘控制器会连接硬盘、USB 控制器会连接键盘和鼠标等等。

CPU 和内存是完成计算任务的核心组件,所以这里重点介绍一下CPU 和内存是如何配合工作的:

  • CPU和内存的配合

CPU 其实也不是单纯的一块,它包括三个部分,运算单元(算)、数据单元(存)和控制单元(指挥);

运算单元只管算,例如做加法、做位移等等;
但是,它不知道应该算哪些数据,运算结果应该放在哪里。

运算单元计算的数据如果每次都要经过总线,到内存里面现拿,这样就太慢了,所以就有了数据单元
数据单元包括 CPU 内部的缓存和寄存器组,空间很小,但是速度飞快,可以暂时存放数据和运算结果。

有了放数据的地方,也有了算的地方,还需要有个指挥到底做什么运算的地方,这就是控制单元
控制单元是一个统一的指挥中心,它可以获得下一条指令,然后执行这条指令;
这个指令会指导运算单元取出数据单元中的某几个数据,计算出个结果,然后放在数据单元的某个地方。


每个进程都有一个程序放在硬盘上,是二进制的,再里面就是一行行的指令,会操作一些数据。

进程一旦运行,比如图中两个进程 A 和 B,会有独立的内存空间,互相隔离;
程序会分别加载到进程 A 和进程 B 的内存空间里面,形成各自的代码段。(真实情况更复杂)

程序运行的过程中要操作的数据和产生的计算结果,都会放在数据段里面:

  • CPU 怎么执行这些程序,操作这些数据,产生一些结果,并写入回内存呢?

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

指令分两部分:
第一部分是做什么操作,例如是加法还是位移;
二一部分是操作哪些数据。

如何执行指令:把第一部分交给运算单元,第二部分交给数据单元。

数据单元根据数据的地址,从数据段里读到数据寄存器里,就可以参与运算了;
运算单元做完运算,产生的结果会暂存在数据单元的数据寄存器里;
最终,会有指令将数据写回内存中的数据段。

CPU 里有两个寄存器,专门保存当前处理进程的代码段的起始地址,以及数据段的起始地址;(指令起始地址寄存器数据起始地址寄存器
这里面写的都是进程 A,那当前执行的就是进程 A 的指令,等切换成进程 B,就会执行 B 的指令了,这个过程叫作进程切换(Process Switch),这是多任务的基础
在这里插入图片描述

  • 总线

CPU 和内存来来回回传数据,靠的都是总线。

总线上主要有两类数据:
一个是地址数据,也就是我想拿内存中哪个位置的数据,这类总线叫地址总线(AddressBus);
另一类是真正的数据,这类总线叫数据总线(Data Bus)。

所以说,总线有点像连接 CPU 和内存这两个设备的高速公路,说总线到底是多少位,就类似
说高速公路有几个车道;

这两种总线的位数意义是不同的:
地址总线的位数,决定了能访问的地址范围到底有多广:例如只有两位,那 CPU 就只能认 00,01,10,11 四个位置,超过四个位置,就区分不出来了。位数越多,能够访问的位置就越多,能管理的内存的范围也就越广。
数据总线的位数,决定了一次能拿多少个数据进来:例如只有两位,那 CPU 一次只能从内存拿两位数;要想拿八位,就要拿四次。位数越多,一次拿的数据就越多,访问速度也就越快。

4.2 x86作用

CPU 数据总线和地址总线越来越宽,处理能力越来越强,但始终开放、统一、兼容:
在这里插入图片描述
“开放”,意味着有大量其他公司的软硬件是基于这个架构来实现的,不能为所欲为,想怎么改怎么改,一定要和原来的架构兼容,而且要一直兼容,这样大家才愿意跟着你这个开放平台一直玩下去。如果朝令夕改,那其他厂商就惨了。

4.2.1 8086处理器

CPU组件:
在这里插入图片描述

4.2.1.1 数据单元

为了暂存数据,8086 处理器内部有 8 个 16 位的通用寄存器,也就是刚才说的 CPU 内部的数据单元;
分别是AX、BX、CX、DX、SP、BP、SI、DI

这些寄存器主要用于在计算过程中暂存数据

这些寄存器比较灵活,其中 AX、BX、CX、DX 可以分成两个 8 位的寄存器来使用,分别是 AH、
AL、BH、BL、CH、CL、DH、DL,其中 H 就是 High(高位),L 就是 Low(低位)的意思;
这样,比较长的数据也能暂存,比较短的数据也能暂存;
在计算机刚刚起步的时代,16位就算很长了,所以要划分

4.2.1.2 控制单元
  • IP 寄存器

即指令指针寄存器(Instruction Pointer Register),指向代码段中下一条指令的位置;
CPU 会根据它来不断地将指令从内存的代码段中,加载到 CPU 的指令队列中,然后交给运算单元去执行。

  • 切换进程所需的寄存器

每个进程都分代码段和数据段,为了指向不同进程的地址空间,有四个 16位的段寄存器,分别是 CS、DS、SS、ES。

CS 是代码段寄存器(Code Segment Register):通过它可以找到代码在内存中的位置;
DS 是数据段的寄存器(Data Register):通过它可以找到数据在内存中的位置;
SS 是栈寄存器(Stack Register):栈是程序运行中一个特殊的数据结构,数据的存取只能从一
端进行,秉承后进先出的原则,push 就是入栈,pop 就是出栈
ES 是附加段寄存器(Extra Segment) :其他几个段寄存器不够用的时候,可以考虑使用 ES 段寄存器,

DS作用如果运算中需要加载内存中的数据,需要通过 DS 找到内存中的数据,加载到通用寄存器中。(交互)
如何加载?
对于一个段,有一个起始的地址,而段内的具体位置称之为偏移量(Offset);

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值