Intel,AMD,ARM 等企业各有又是,CPU 从 8 位发展到 16 位,再到 32 位,近几年发展到 64 位,当下的 CPU 体系被称为 x86-64 体系结构,主要是 Intel 和 AMD 两家的产品。
IA32 处理器体系结构是 32 位芯片。
当下的计算机大多是采用冯诺伊曼体系结构,计算机由存储器,运算器,控制器,输入设备,输出设备组成。
EAX:扩展累加寄存器。在乘法和除法指令中被自动使用;
ECX:循环计数器。
ESI和EDI:扩展源指针寄存器和扩展目的指针寄存器。用于内存数据的存取;
ESP:扩展堆栈指针寄存器。一般不用于算术运算和数据传送,而用于寻址堆栈上的数据。
EBP:扩展帧指针寄存器。用于引用堆栈上的函数参数和局部变量;
指令指针寄存器 EIP 也被称为程序计数器,Program Counter 也就是简称 PC。
PC 存放着下一条要执行的指令的地址,如果遇到了跳转,返回之类的指令,就会改变 PC 寄存器中存储的值,使之指向下一个目的地。
32 位的标志寄存器也就是 EFLAGS 寄存器,E 代表这个寄存器是 32 位的,FLAGS 代表里面存放的是有关程序状态的信息,有些指令将会改变这个状态信息,而有的指令则会根据这类状态信息执行不同的分支操作。
只允许在最高特权级别下的程序进行访问的寄存器(例如操作系统内核),除此以外禁止应用程序访问。
中断描述符表寄存器IDTR:保存中断描述符表的地址。
全局描述符表寄存器GDTR:保存全局描述符表的地址,全局段描述符表包含了任务状态段和局部描述符表的指针。
局部描述符表寄存器LDTR:保存当前正在运行的程序的代码段、数据段和堆栈段的指针。
任务寄存器:保存当前执行任务的任务状态段的地址。
调试寄存器:用于调试程序时设置断点(breakpoint)。
在实地址模式下,处理器可以使用 20 位的地址总线,因此就可以访问多达 \(2^{20}\) 大小的内存,也就是 1MB,而 8086 的 CPU 只有 16 位的地址总线,因而不能直接使用 20 位的内存地址,需要进行一种映射变换,让 20 位的地址映射到 16 位的地址空间上。
为了实现这种映射,我们可以先考虑将多出来的 4 位作为内存的分段数量,而分出来的每一段都代表一个 16 位的地址空间,这样只能控制 16 位物理内存的 8086CPU 也就可以处理高达 20 位的地址了,这是一种较为普遍而简单的做法。
其中的段首地址不一定是整数,也有可能是一个比较不那么凑整的数字。
\[08F1:0100 \\ 08F1*10H+0100H=09010H \]可见段首地址可以是任意的地址,这个段也就是以前汇编中学到的代码段,数据段等的地址。
将内存分割成4KB大小的页面,同时将程序段的地址空间按内存页的大小进行划分。
分页模式的基本思想:当任务运行时,当前活跃的执行代码保留在内存中,而程序中当前未使用的部分,将继续保存在磁盘上。当CPU需要执行的当前代码存储在磁盘上时,产生一个缺页错误(也就是缺页中断),引起所需页面的换进(从磁盘载入内存)。
通过分页以及页面的换进、换出,一台内存有限的计算机上可以同时运行多个大程序,让人感觉这台机器的内存无限大,因此称为虚拟内存。
在系统的内存金字塔中,所有的下层存储都是上层存储的缓存,下层的速度更慢,但是成本低廉所以容量较大,上层速度更快但是更加昂贵因此容量也相对下一层要小得多。使用缓存可以让跨层的数据读写更加快速,因为高层的时间往往更加宝贵,相同的时间堵塞,层次越高,性能影响越大。