虚拟地址与物理地址的转换

在虚拟地址空间那篇文章中我们简单地介绍了虚拟地址空间,知道了应用程序中使用的是虚拟地址,需要通过MMU转换成物理地址,本文将详细介绍虚拟地址如何转换成物理地址。

页、页框、页表

linux操作系统以页为单位管理虚拟内存,通常一页为4k,而物理内存是以块为单位管理的,物理内存被分成很多与页大小相同的块,被称为页框,每个页地址与页框对应,这种对应关系被记录在页表中,页表是MMU中的数据结构,下图是页表中较为常见的几个属性。
在这里插入图片描述
页框存在于物理内存上,而页可以放置在任意的页框中,这是能够进行地址转换的基础。

缺页异常

页表结构图中,p(存在位)表示虚拟地址对应的物理地址是否已经加载到内存中,如果虚拟地址没有被使用过,物理地址就不会加载到内存中,当需要使用虚拟地址时,操作系统先检查存在位,如果存在位为1则地址转换后可以直接访问,如果存在位为0,会引发缺页异常,操作系统将加载页框到内存中,然后继续访问。与普通中断不同的是,缺页异常返回后会再次执行陷入中断的那条指令,而普通中断会执行跳过该指令,执行下一条指令。

换页

操作系统通常使用页面缓存算法来管理已经加载的页,当操作系统通过缺页异常准备加载新页面时,如果缓存已满,就需要先删除一页,再加载新页,删除页时,需要检查D(脏位),如果D为1,说明该页被修改过,需要先写入磁盘,再删除。linux操作系统中,名为pdflush的守护进程会周期性地刷脏页。
换页时选择被删除的页通过页面缓存置换算法来实现,常见的算法包括先进先出算法(FIFO)、最佳置换算法(OPT)和最近最少使用算法(LRU)。linux使用LRU算法实现页面置换,这里提供一种LRU的简单实现。


//双向链表,也可以使用stl的list
struct linkedlist{
   
    linkedlist* prev;
    linkedlist* next;
    int value;
    int key;

    linkedlist():prev(nullptr),next(nullptr),key(0),value(0){
   };
    linkedlist(int p1,int p2):prev(nullptr),next(nullptr),key(p1)
  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值