Linux下的地址映射

实地址模式:

Intel在8086寄存器采用实地址模式:
在CPU中设置四个“段寄存器” CS DS SS ES 分别用于可执行代码即指令,数据,堆栈和其他;
每个段寄存器都是16位,对应地址总线的高16位。
每条“访内指令”的内部地址都是16位。

访内代码的内部地址(16位)转化成实际地址(20位);
-->段寄存器中内基地址<<4+内部地址;
对于每一个由段寄存器的内容确定的“基地址”,一个进程总能访问从此开始的64K字节的连续地址空间,不能对访问一个进程的内容加以限制。一个CPU如果缺乏对内存访问的限制或者保护就谈不上什么内存管理;

保护地址模式:

段式内存管理机制
在原有寄存器的基础上增设了二个寄存器;一个是全局段描述表寄存器GDTR,另一个是局部性的段描述表寄存器LDTR。分别用来指向存储在内存中的一个段描述结构数组(段描述表)。


段寄存器不在存储基地址。最低的2位表示,特权级别(00内核态,11用户态),第3位表示使用GDTR/LDTR,高13位存储GDTR/LDTR的数组下标。
段描述表项的定义
通过段寄存器找到相应的段描述表项,B 表示基地址; L表示段长度及一些其他信息。



(1)根据指令性质确定使用哪一个段寄存器
(2)根据段寄存器内容,找到相应的“地址段描述结构”
(3)从地址段描述结构中得到基地址
(4)将指令中发出的地址为位移,与段描述结构中规定的段长度相比,看看是否越界。
(5)根据指令的性质和段描述符中的访问权限来确定是否越权。
(6)将指令中发出的地址为位移,与基地址相加而得到实际的“物理地址”。

80386CPU中的页式内存管理机制的具体实现(CR0寄存器中,最高位PG为1时,开启页式映射)

通过段寄存器找到段描述表寄存器,从而获得线性地址(段式映射中的物理地址)。


(1)从CR3中得到页面目录(PGD)的基地址。
(2)以线性地址中的dir位段(22-31位)为下标,在目录中取得相应页面表的基地址。
(3)以线性地址中的page位段(12-21位)为下标,在所得到的页面表中取得相应的页面描述项。
(4)将页面描述项中给出的页面基地址与线性基地址中的offset位段(0-11位)相加得到物理地址。

每个进程都有其自身的页面目录PGD,指向这个目录的指针保持在每个进程的mm_struct数据结构中。每当调度一个进程进入运行的时候,内核都要为即将运行的进程设置好控制寄存器CR3,而MMU的硬件则总是CR3中取得指向当前页面目录的指针。

一个页面表项或目录表项的大小为4个字节,1024(2^10)个表项正好也是4K字节;
段式存储管理机制的灵活性和效率都比较差。
80386把线性地址空间划分成4K字节的页面,每个页面可以被映射至物理存储空间中任意一块4K字节大小的区间(边界必须与4K字节对齐)。在页式存管中,连续的线性地址经过映射后在物理空间却不一定连续(灵活)。
当要将一部分物理空间的内容换出到磁盘上的时候,在段式存储管理中要将整个段(通常很大)都换出,而在页式存储管理中则是按页进行,效率更高。

目录项含有指向页面表的指针,页面表项中含有指向页面起始地址的指针。 由于页面表和页面的起始地址都总是在4K字节的边界上,这些指针的低12位都为0;目录项和页表项都只要20位用于指针就够了。而余下12位可以用于控制或其他目的。




第7位(在目录项中保留不用)为D(Dirty)标志,表示该页面已经被写过,所以已经“脏”了;当P为0,表示相应的页面或页面表不在内存上。

内核中有个全局量mem_map,是一个指针,指向一个page数据结构的数组。每个page数据结构代表一个物理页面,整个数组就代表着系统中的全部物理页面。因此,页面表项的高20位对于软件和MMU硬件有着不同的意义。对于软件,这是一个物理页面的序号,将这个序号用作下标就可以从mem_map找到代表这个物理页面的page数据结构。对于硬件,则(在低位补上12个0后)就是物理地址的起始地址。

在映射过程中,MMU首先检查的P标志位,它指示所映射的页面是否在内存中。只有在P标志位为1的时候,MMU才会完成映射的全过程;否则就会因不能完成映射而产生一次缺页异常。
对于软件来说,页面表项为0表示尚未为这个表项(所代表的虚存页面)建立映射,所以还是空白;而如果页面表项不为0,但P标志为0,则表示映射已经建立。但是所映射的物理页面不在内存中(已经换到交换设备上)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值