Linux---地址映射

(一)实地址模式和保护地址模式

先了解几个概念:

总线:是计算机各种功能部件之间传送信息的公共通信干线,它是由导线组成的传输线束, 按照计算机所传输的信息种类,计算机的总线可以划分为数据总线、地址总线和控制总线,分别用来传输数据、数据地址和控制信号。

 CPU位数: CPU计算能力 ,ALU一次性能计算最长的整数的字节数,即ALU宽度(ALU从寄存器得到数据,寄存器从数据总线得到数据),所以数据总线的条数

芯片发展过程:

(1)实模式 

  • 1)8位芯片地址总线16条 ,寻址能力为2^16=64k 

由于位数不对等,此时的汇编指令中充斥了大量的16位汇编指令,比较晦涩难懂

  • 2)8086 : 16位芯片 - > 20 条数据总线,寻址能力为2^20=1M 

同样存在位数不对等的问题,此时的解决办法是增加了4 个寄存器(16位)分别为代码段(CS)、数据段(DS)、堆栈段(SS)、扩展段(ES),以及16位IP寄存器,存放偏移量。

此时的内存是物理内存,被划分成一段一段的,每一段的起始地址是16的倍数,所以其二进制后四位为0。每一段内存段范围在16 ~ 64k(16位偏移,2^16)之间,其起始地址写在相应的段寄存器中。但是此时的地址总线是20条,说明发出的地址是20位,其高16位存在段寄存器中(低4位为0,不用存)

  • 3)实模式下地址映射:

指令译码器区分数据还是指令,然后判定从哪个段寄存器中取地址,例如来的是数据,其地址映射就是:DS << 4 + IP ,此时得到的地址就是数据的物理地址。其中我们把DS << 4称为段基址,IP中的值称为偏移量、偏移地址、逻辑地址(一个内存段上的偏移量)。

(2)保护模式 

实地址模式即实模式,整个可寻址范围是2^20 = 1M(20根地址总线),此时无操作系统,没有任何权限的控制没有任何保护措施,可以任意修改任何数据,所以说实模式是十分不安全的。 值得注意的是,Linux下内核镜像从0x100000加载,因为CPU一上电强制进入实模式,占据了前1M内存,在前1M内放着一些显卡的缓存,软件的驱动代码等…

  • 1)从80386开始,操作系统存在。

实模式下访问内存是极其不安全的,我们访问内存时,不仅要知道内存段的起始地址,还需要知道内存段大小和访问权限。但是这些信息没有办法都存在16位的段寄存器中,从80386开始,有了保护模式,又增加了几个寄存器,为了解决信息没有办法都存在16位的段寄存器中的问题,CPU增加了两个寄存器:GDTR和LDTR。 

80386/486 微处理机用全局描述符表寄存器GDTR 、局部描述符表寄存器LDTR 和中断描述符表寄存器IDTR,来查找全局描述符表GDT、局部描述符表LDT 和中断描述符表IDT,

GDTR:(所有进程共享)指向了GDT 全局的段描述符表。GDTR存放GDT地址,

LDTR:(每个进程都有)指向了LDT局部的段描述符表。

“GDT”相当于一个数组,存放内存段的相关信息(内存的起始地址、内存段的大小、内存段的权限)如图: 

这时段寄存器不在用于存放地址的去掉后4位(因为之前内存段的起始地址总是4k整数倍,因此后四位都为0),而用于存放段描述表的索引,也就是下标。(其中8192个描述符中12项被系统预留下来了,因此8192 - 12 = 8180 个描述符)

  • 2)段描述符表项,每一项为8个字节 

  • 3)保护模式下内存分段的地址映射: 

GDT [ DS>>3 ]  . BaseAddr + IP(IP < 段大小比较) = 线性地址 

  • 4)是否开启保护机制和分页机制
  1. CR0 最高位PG位 0 未开启 
  2. CR2 发生缺页异常的虚拟地址 
  3. CR3 页目录起始地址 
  4. CR4 PAE位 物理地址扩展 0 未开启

  • 5)LDTR 与 段寄存器类似,前13位为其在GDT中的索引,0 (GDTR),两位权限位 

GDT[LDTR>>3] 即当前进程LDT的相关信息存储位置

(二)地址映射(用户空间在保护模式下并且开启了分页机制)

(1)此时,段寄存器的高十位存放的是全局的段描述符表项(GDT)的下标,GDT中存放的是段的起始地址,段的长度以及段的权限,从GDT中取出段起始地址再加上逻辑地址(也就是偏移量)即线性地址(虚拟地址)。

(2)如果CPU没有开启内存页映射(32位二级,36位三级,64位四级,此时CR0的PG位为0),线性地址即物理地址,否则线性地址还需要进行页面的多级映射才能得到物理地址。

(3)线性地址共32位,高10 位是页目录下标,次高十位是页表下标,最低的12位是物理页面的偏移量。 

(4)页目录表(PD)共1024项(2^10),下标由0开始,每一项存放指针,指向页表起始地址,大小为4k,页表(PT)同,只是每一项存放的是物理页面的起始地址。由于一个页表和一个物理页面大小都是4k,其地址均是4k的倍数,所以低12位均为0,所以只需要用高20位存储其地址即可,余下的8位存放的是相应的权限信息。 
PT最低位present=0,表示页面在交换分区中,=1,表示页面在物理内存中

(5)物理页面(struct page -> 重命名 m_map_t)称为物理页面的框号,就是因为其地址的高20位正好是由0开始的一串整数,类似于数组下标。 
内核启动时会对硬件自检,根据内存大小划定页面个数,用指针Mem_map(m_map_t*)指向 ,所以物理页面在内存中是以数组管理的,其下标就在PT中存储。

(6)多级页表映射过程: 
**CR3(当前进程页目录起始地址) + 页目录下标*4 -> 页表起始地址 
页表起始地址 + 页表下标*4 -> 物理页面起始地址 
物理页面起始地址 + 物理页面的偏移量 -> 相应的物理地址** 
(7)注意内核空间的映射过程与用户空间并不相同:物理地址 + 0xc000000 –> 虚拟地址

(三)地址映射图解

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值