x86作为一个开放的平台,让所有的硬件厂商进行适配,那么其内部基本实现就是本章的讲解重点
计算机的整体工作模式和硬件息息相关
整体上工作逻辑图如下
CPU是所有工作的开端,是整个计算机的大脑,所有的设备都围绕展开
CPU和其他的设备相连接,就需要一种叫做总线的东西,就是主板上的集成电路
其中和内存的联系是最为密切的,因为CPU擅长于计算,但是计算任务中往往存在中间结果,而CPU自身没法保存这些中间结果,就需要依赖于内存
内存相当于办公室,需要每个程序自身去申请注册
还有其他的总线和总线上的其他的设备,常见的 显卡 – 显示器, USB – 键盘 鼠标
这里我们主要介绍了解的是CPU和内存的配合工作
CPU也不是单纯的一块,包含了三个部分,运算单元 数据单元 控制单元
运算单元,负责加减法 位移运算,但不关心数据的存放
数据单元,内部有自己的缓存和寄存器组,空间小,但是速度快,存放数据和计算结果
控制单元,统一的控制中心,获取下一个指令然后执行这个指令
整体的结构图如上
每个项目都有一个项目执行计划书,里面是一行行的项目执行指令,都是放在档案库里的,每个进程都是将自己的程序放在硬盘
运行的时候,读入内存,在自己的内存空间中,彼此隔离,形成代码段和数据段
CPU利用这两个段进行相关的计算
CPU中如何执行这些程序,操作这些数据,产生结果呢?
里面利用指令指针寄存器,里面存放的是下一条指令在内存的地址,不断的将代码段的指令拿进来,放入指令寄存器
执行指令,将指令中负责运算的操作交给运算单元,操作数据的交给数据单元
数据单元根据数据地址,从数据段中读到数据寄存器,参与运算,运算根据数据算完,获取结果存到数据单元的数据寄存器中,最后写回内存
最后,CPU还涉及到了进程切换,就是从进程A的运算切换到进程B,执行B的指令,接下来会有一章说道
CPU和内存的数据传输,靠的是总线,总线上有两个数据,一是地址数据,地址数据哪个内存位置的数据,这就是地址总线
还有就是数据总线,根据地址总线拿到真正的数据
那么地址总线的位数,决定了访问的地址范围有多广,只有两位,那么CPU只能认识 00 01 10 11四个位置,位数越多,管理的内存范围越大
数据总线的位数,决定了一次性能拿多少数据,比如2位,那么CPU想要拿八位的数据,需要拿四次
那么CPU中这类总线有没有一个标准呢?
没有标准,就没有通用的运算逻辑,于是x86出现了,将整体做了一个开放,统一,兼容的方式
IBM一开始呢,对于PC的架构规定为 英特尔的8086系列作为CPU,故称为x86架构
我们利用8086来说x86相关特性
CPU的组件和特性基本如下
从上图不好看具体的结构
但里面存在数据单元,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是高位 L是低位
控制单元中存在IP寄存器中,也就是指令指针寄存器
指向下一条指令的位置,利用其从内存中读取代码,加载到CPU指令对立中
如果切换进程,每个进程都有自己的代码和数据段,指向不同的地址空间,也就是四个段寄存器
CS是代码段寄存器 DS是数据段寄存器
SS负责栈寄存器,负责先入先出
基本的栈操作就不说了
设计程序执行,都和栈息息相关
那么运算过程中,如果需要加载内存的数据,需要找到对应的内存数据
我们找到内存中具体的位置,称为偏移量
CS和DS中都存放一个段的其实位置,代码偏移量放在了IP寄存器中,数据偏移量放在了通用寄存器中
但是8086的总线地址为20位,如何凑齐20位呢?就是起始地址 *16 + 偏移量
而且,无论内存多大,20位总线的8086处理器来说,只能区分 2^20次方
也就是1M,而一个段的最大就是16的,就是64k的
后来伴随着科技的发展
32位处理器中总线越来越宽, 32位处理器中,可以访问 2^32=4G的内存,原来模式需要改进
如何改进呢?
我们改进通用寄存器,将8个16位的扩展到8个32位的,保留16位和8位的使用方式
将IP寄存器,扩展为32位的,同时兼容16位的
改动较大的,就是段寄存器
原来的模式不伦不类,因为没有把16位当成一个段的起始地址,而是20位的地址
所以我们改了一段,我们将CS SS中不存其实地址,存一个表格,表格一项就是段描述符,这里面是段的真正其实地址,保存着选择子,也就是表格中的哪一项
直接从段寄存器拿到段起始地址,改为了间接的从段寄存器中找到表格中的项,然后拿到对应的起始地址
但是这种模式和早期模式不兼容
于是我们做了一个切换设置,前一种16位模式称为实模式,后一种32位称为保护模式
系统刚刚启动的时候,CPU处于实模式,和原来模式兼容
后来需要更多的内存的时候,切换为保护模式,用到32位CPU更强大的能力
最后说一下常见的汇编命令
move a b b赋值给a
call ret call调用子程序
jmp 跳转
int 中断
add a b 相加
or 或运算
xor 异或运算
shl 算术左移
ahr 算术右移
push xxx 压入栈
pop xxx 出栈
inc 加一
dec 坚毅
sub a b a = a-b
cmp 减法比较