1、CPU位数:CPU的计算能力,ALU数字逻辑单元一次性能计算的最长的整数,
ALU一次能处理的的数据宽度
数据总线的条数。
2、CPU的数据位数和地址位数不对等
8080、8085 :8位芯片,地址总线都是16条,寻址2^16=64K
====================================================
从8086开始,cpu增加了CS DS SS ES 四个(16位)寄存器
IP寄存器:16位,IP寄存器放偏移量:(偏移量,偏移地址,逻辑地址,一个内存段上的偏移量)
X86体系
8086、80186:16位芯片,地址总线是20位,寻址2^20=1M
80286、80386:32位芯片,地址总线为
====================================================
3、8086芯片时,操作系统不存在,不存在权限控制,访问模式为实模式,直接访问物理地址
【****8086*****】===访问模式: 实地址模式 , 实模式
段寄存器用来放内存起始地址的高16位 (段基址)
为了将20位地址存放到16位的段寄存器,规定每个内存段起始地址都是16的倍数,即低四位全为0。所以段寄存器用来存内存起始地址的高16位
寻址方式:首先指令译码器翻译指令确定需要访问的段寄存器
CS DS SS ES 四个(16位)寄存器
实模式地址映射:(内存分段的地址映射)
段寄存器 <<4 + IP寄存器 ===》 物理地址
(内存段的起始地址 (一个内存段上的偏移量
放到地址总线 逻辑地址)
段基址)
4、保护模式应该记录
内存段的起始地址、内存段的大小、内存的访问权限
【****80386*****】
段寄存器用来存段描述符表的下标
GDTR用来存全局段描述符表GDT的起始地址
保护模式下内存分段的地址映射
GDT[段寄存器>>3].BaseAddr + (IP,Length) ==》 线性地址
(IP偏移量与Length比较
防止访问越界
逻辑地址)
得到线性地址后,检测内核是否开启内存分页机制(CR0 PG位),
未开启(CR0 PG位为0):线性地址就是物理地址
开启(CR0 PG位为1):线性地址(虚拟地址)=》页面多级映射=》物理地址
保护模式下内存分页的地址映射
线性地址(虚拟地址)分为三部分:10 10 12
10位 10位 12位
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxxxx
页目录的下标 页表的下标 物理页面上的偏移量
PG PT 物理页面(物理页面的框号)
一个页面 4K 一个页表4K 2^12=4K
4*1024=4K 1024个页表
二级映射:
一个PG有1024项,一个PG项映射了1024个PT,1个PT映射4K的物理页面 1024*1024*4K=4G
二级页目录页表映射能映射4G的物理内存。把32位Linux内核下一个进程4G的地址空间全部映射完。
每个进程都有自己的页目录和页表。
(1)在页目录的一项中有4个字节,32位。因为所存的PT都是4K的整数倍,所以低12位都是0,不用存。所以在PG中用20位存PT的起始地址,多余的12位存权限。
(2)在PT的一项中有4个字节,32位。因为所存的物理页面都是4K的整数倍,所以低12位都是0,不用存。所以在PT中用20位存物理页面的地址0x00001,0x00002,0x00003,多余的12位存权限。其中最后一位是:
present位,0:页表项所对应的物理页面在交换分区中;
1:页面在物理内存当中
(1)物理页面还没分配过
(2)物理页面在交换分区中
(3)物理页面是一个活动页面
(3)在物理页面中,物理页面地址为32位,因为所存的物理页面的起始地址都是4K整数倍,所以低12位都为0,不用存。则地址都为0x00001,0x00002,0x00003
5、段页式虚拟地址映射
CPU内总线发出的地址,逻辑地址
软件:进程页目录,页表,CR3寄存器,全局段描述符表存在内存上
硬件计算:逻辑地址====MMU内存管理单元映射=====》物理地址