x86架构

被刻印的时光 ゝ 提交于 2020-01-16 20:56:15

基础概念

cpu:命令的执行
内存:中间结果保存、进一步计算,cpu无法保存太多的中间结果
总线:连接cpu、内存、显卡、磁盘空盒子器、usb控制器
进程:可以理解为实例化的程序,程序是存在硬盘的,而进程是要讲程序加载到内存,不同进程的内存空间是隔离的。进程空间粗略的分有代码段和数据段。cpu包含两个寄存器,分别存放当前处理进程的代码段的起始地址和数据段的起始地址,进程切换会切换这两个寄存器存储的起始地址。

cpu

cpu包括三部分:

  • 运算单元
  • 数据单元
  • 控制单元

运算单元

做加法、移位等。

数据单元

包括cpu内部的缓存和寄存器组,空间小、速度快,展示存放数据和运算结果。
数据单元从数据段中读取数据。
8086处理器内部有8个16位通用寄存器:AX、BX、CX、DX、SP、BP、SI、DI。
其中AX、BX、CX、DX可以分成两个8位寄存器使用,分别为AH、BH、CH、DH、AL、BL、CL、DL。H是高位、L是低位。这样长短数据可以用不同大小的寄存器存放。

控制单元

统一指挥,获取下一条命令、执行,指令会指导运算单元获取数据单元数据,进行计算,结果存数据单元。
控制单元中的指令指针寄存器用于存放吓一条指令在内存中的地址,控制单元将代码段的指令放入指令寄存器进行后续执行。
指令分为操作数据,操作对应运算单元,数据对应数据单元。
控制单元通过指令将数据单元中的数据写会内存中的数据段。
8086处理器控制单元内部的IP寄存器是指令寄存器。
为了满足进程切换,需要下面几个寄存器的配合:

  • CS(代码段寄存器),存储代码段在内存中的起始地址,代码段的偏移量存储在IP寄存器
  • DS(数据段寄存器),存储数据段在内存中的起始地址,数据段的偏移量存储在通用寄存器
  • SS(栈寄存器)
    在x86处理器中,CS、DS、IP寄存器和通用寄存器都是16位,但是8086的地址总线是20位,直观上不匹配,所以8086的玩法是起始地址*16+偏移量,通过左移4位,弄出了20位的数据地址。所以8086的内存地址最多1M(2^20),一个段最大64k(2^16),

总线

总线分为:

  • 地址总线
  • 数据总线

地址总线

地址总线的位数,决定能访问的地址范围,位数越多表示能访问的内存范围越大。

数据总线

数据总线表示一次能获取多少的数据。

举例

型号 数据总线位宽 地址总线位宽 寻址空间
8086 16 20 2^20=1M
80386 32 32 2^32=4G

8086位处理器->32位处理器

32位处理器地址总线位数和数据总线的位数都是32,可访问2^32=4G内存。
通用寄存器的变化:从8个16位扩展到了8个32位,其低16位依然保留16位和8位的使用方式,高16位没法弄,不兼容。
IP寄存器变化:从16位扩展成32位。
段寄存器:8086的段寄存器地址是16位的,但是在计算内存地址时要左移4位的,但是在32位处理器下,如果段寄存器是32位的话,是完全能cover住4G的地址空间,所以进行了重新定义,CS、SS、DS、ES还是16位,但是数据的含义变了,首先,段的起始地址存放在内存中的一个表格中,表格的每一项是段描述符,这才是段起始地址。而段寄存器保存的是这个表的哪一项,成为选择子。
为了应对段寄存器的数据含义变化,32位系统架构有两个模式。

  • 实模式,系统启动时所处模式,兼容原模式,当需要更多内存,切换为保护模式
  • 保护模式,
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!