操作系统篇-浅析分页机制

|| 版权声明:本文为博主原创文章,未经博主允许不得转载。

  一、前言

  在我们进行程序开发的时候,一般情况下,是不需要管理内存的,也不需要操心内存够不够用,其实,这就是分页机制给我们带来的好处。它是实现虚拟存储的关键,位于线性地址与物理地址之间,在使用这种内存分页管理方法时,每个执行中的进程(任务)可以使用比实际内存容量大得多的连续地址空间。而且当系统内存实际上被分成很多凌乱的块时,它可以建立一个大而连续的内存空间的映象,好让程序不用操心和管理这些分散的内存块。分页机制增强了分段机制的性能。页地址变换是建立在段变换基础之上的。因为,段管理机制对于Intel处理器来说是最基本的,任何时候都无法关闭。所以即使启用了页管理功能,分段机制依然是起作用的,段部件也依然工作。

  二、页表结构

  那么到底如何使用分页机制呢?通过设置cr0的PG位可以开启分页机制。页大小是4K,并且是4K对齐的。线性地址通过分页机制转换成物理地址的时候,可能某些线性地址是无效的。如果某个线性地址对应的页不存在,那么访问的时候将产生一个异常。

  两级页表结构

  内存分页管理的基本原理是将整个主内存区域划分成 4096 字节为一页的内存页面。程序申请使用内存时,就以内存页为单位进行分配。上面提到了线性地址经过分页机制的转换变成物理地址,但是没有提到如何转换。其实是通过两个表,一个是页目录表PDE,也叫一级目录,另一个是二级页表PTE。进程的虚拟地址需要首先通过其局部段描述符变换为 CPU 整个线性地址空间中的地址, 然后再使用页目录表 PDE(一级页表)和页表 PTE(二级页表)映射到实际物理地址页上。页表中,每项的大小是32b,其中20b用来存放页面的物理地址,12b用于存放属性信息。页表含有1M个表项,每项4B。第一级表是页目录,存放在1页4k页面中,含有1K个表项。第二级是页表,也是1K个表项。如下图所示:

  三、结构

  

PDE结构

PTE结构

  从上图中,可以看出PDE与PTE的结构其实是差不多的,其中属性位包含如下信息:
  P——bit0,存在位标志,表示当前条目所指向的页或页表是否在物理内存中;
  R/W——bit1,读写位标志,指定一个页或者一组页的读写权限。R/W=0表示只读,R/W=1可读可写;
  U/S——bit2,用户/超级用户标志,指定一个页或者一组页的特权级;
  PWT——bit3,用于控制对单个页或者页表的Write-back或者Write-through缓冲策略;

  PCD——bit4,用于控制对单个页或者页表的缓冲;  

  A——bit5,表示页或者页表是否被访问;
  D——bit6,表示页或者页表是否被写入;

  PS——bit7,决定页的大小;

  G——bit8,指示全局页;

  AVL——保留字段;

  保护模式是否开启,取决于cr0的第0位PG。一个页表或者页目录项大小是4B;而开启分页机制以后,存储单元变成了页(不存在说,一部分存储开启了分页机制,另外一部分没有开启分页机制(除非这部分不能通过操作系统访问到))。所以,一个页上含有1024个页表项;一个页目录,对应1K*4K=4M的空间;一个程序有4G的线性地址空间,正好需要1K个页目录来存储,它占用的页表是4M。
  另外,页表和页目录表都表项都是32b的,其中地址对应的是20b。处理器会将最近经常用到的页目录和页表项保存在TLB中。而TLB是什么呢?可以简单地理解,TLB就是页表的Cache,其中存储了当前最可能被访问到的页表项,其内容是部分页表项的一个副本。只有在TLB无法完成地址翻译任务时,才会到内存中查询页表,这样就减少了页表查询导致的处理器性能下降。
  当页目录或者页表项被修改的时候,对应TLB中的项目也就失效了;当cr3重新加载的时候,所有的TLB都失效了,除非页或页表条目的G位被设置。

  上图是CR3的结构,CR3又叫PDBR,就是页目录寄存器。它的高20位将是页目录表首地址的高20位,页目录表的低12位会是零,也就是说,页目录表会是4KB对齐。类似地,PDE中的页表基址以及PTE中的页基址也是用高20位来表示4KB对齐的页表和页。

  四、总结

  回顾上面讲到的内容不是很多,主要是这部分都是理解系统的基础,包括下面几点:

  1.分页的作用,高效率地利用内存,可以运行比物理内存空间更大的程序;

  2.分页机制的原理,利用两级页表将内存分割成4KB/页的大小,强制内存对齐提高效率;

  3.页表结构,PDE与PTE在内存中各个位的主要作用,表项与页之间的对应关系。

  前面几篇分享,都提到很多原理,废话特别多,下篇开始我们将用代码来逐渐说明,希望大家继续关注!!

时间: 2024-10-14 12:14:57

操作系统篇-浅析分页机制的相关文章

操作系统篇-分段机制与GDT|LDT

|| 版权声明:本文为博主原创文章,未经博主允许不得转载. 一.前言 在<操作系统篇-浅谈实模式与保护模式>中提到了两种模式,我们说在操作系统中,其实大部分时间是待在保护模式中的.因此若想理解操作系统程序中的启动相关的部分,必须要理解保护模式下的编程,而分段机制是保护模式编程下的基础.而且,由于实模式与保护模式的不同,对保护模式下的分段机制更需要注意. 二.线性地址 在保护模式下编程,访问内存时,需要在程序中给出段地址和偏移量,因为分段是保护模式的基本特征之一.传统上,段地址和偏移地址称为逻辑

操作系统实现之内存分页机制.虚拟空间

内存虚拟存储主要是为了将一个进程分为不同页.存储到不同物理页中.然而不同进程的虚拟地址是可以相同的.因为MMU把进程的虚拟地址映射到各个不同的物理地址中. 以下操作系统采用二级分页.一开始CS:IP寄存器.将CS的基地址跟IP的偏移地址进行相加.得到线性地址.接着.线性地址的高10位用于当作页目录表的索引.页目录表保存的是页表的物理地址.接着.线性地址的低10位用于当作页表的索引.页表保存的是4k大小的页块.线性地址低10位那就是页块的偏移地址.由此虚拟地址->物理地址转换结束.当然操作系统在创

操作系统学习(三)、分页机制

目录 1.分页机制介绍 2.页表结构 3.页表项格式 4.虚拟存储 5.直达底部 分页机制介绍 分页机制是 80x86 内存管理机制的第二部分.它在分段机制的基础上完成虚拟地址到物理地址的转换过程.分段机制把逻辑地址转换成线性地址,而分页机制则把线性地址转换成物理地址.分页机制可用于任何一种分段模型.处理器分页机制会把线性地址空间划分成页面,然后这些线性地址空间页面被映射到物理地址空间的页面上.分页机制的几种页面级保护措施,可和分段机制保护措施和用或替代分段机制的保护措施. 通过设置控制寄存器

操作系统实践(7)——分页机制

为什么分页,分页有什么好处? 从苦逼码农的角度,用一个租房的例子来说,原来分段机制,就好比房子整租,当租客不想租的时候,就整个房子退还给房东,房东再找其它人整租,这样有个缺点,在北京,整租一套房子,很贵,而且很多租客都是一个人或者两个人,用不着租那么大,于是一方面房东如果找不到租客,房子就空闲着,一方面要是租客咬咬牙租下整套房子,很多房间也是很浪费.于是,下面要讨论的分页机制,就是现在市场上各种单间出租了.单间出租的好处很明显,房子利用率很高,一个租客不租了,很快就能找到下一个租客.其实分页的好

Linux内存寻址之分页机制

http://blog.xiaohansong.com/2015/10/05/Linux内存寻址之分页机制/ 在上一篇文章Linux内存寻址之分段机制中,我们了解逻辑地址通过分段机制转换为线性地址的过程.下面,我们就来看看更加重要和复杂的分页机制. 分页机制在段机制之后进行,以完成线性-物理地址的转换过程.段机制把逻辑地址转换为线性地址,分页机制进一步把该线性地址再转换为物理地址. 硬件中的分页 分页机制由CR0中的PG位启用.如PG=1,启用分页机制,并使用本节要描述的机制,把线性地址转换为物

一个操作系统的实现(8)-进一步体会分页机制

上面的两篇文章中,我们对可用内存进行了统计,并且合理的分配了页表的大小.这节中,我们来看看分页的好处 在此之前不知道你有没有注意过一个细节,如果你写一个程序(在Linux或Windows下均可),并改个名复制一份,然后同时调试,你会发现,从变量地址到寄存器的值,几乎全部都是一样的!而这些"一样的"地址之间完全不会混淆起来,而是各自完成着自己的职责.这就是分页机制的功劳,下面我们就来模拟一下这个效果. 线性地址到物理地址的映射 先执行某个线性地址处的模块,然后通过改变cr3来转换地址映射

程序员的自我修养——操作系统篇(转)

也许,只需这一篇文章,便能让你全面的认识操作系统! 在阅读本文之前,推荐阅读“自己动手制作4位计算机”. 目录: 1. 进程的有哪几种状态,状态转换图,及导致转换的事件. 2. 进程与线程的区别. 3. 进程通信的几种方式. 4. 线程同步几种方式. 5. 线程的实现方式. (用户线程与内核线程的区别) 6. 用户态和核心态的区别. 7. 用户栈和内核栈的区别. 8. 内存池.进程池.线程池. 9. 死锁的概念,导致死锁的原因,导致死锁的四个必要条件,处理死锁的四个方式,预防死锁的方法.避免死锁

计算机考研复试面试常问问题 操作系统篇

计算机考研复试面试常问问题 操作系统篇 在复习过程中,我用心查阅并整理了在考研复试面试中可能问到的大部分问题,并分点整理了答案,可以直接理解背诵并加上自己的语言润色!极力推荐打印下来看,效率更高! 此系列一共有8篇:编程语言篇|数据结构篇|操作系统篇|组成原理篇|计算机网络篇|数据库篇|软件工程篇|计算机专业英语篇(还未全部完成,敬请期待,你们的支持和关注是我最大的动力!) 个人整理,不可用于商业用途,转载请注明出处. 作者各个平台请搜索:程序员宝藏.快来探索属于你的宝藏吧! 需要pdf直接打印

Linux的分段和分页机制

1 基于80x86的Linux分段机制 80386的两种工作模式:80386的工作模式包括实地址模式和虚地址模式(保护模式).Linux主要工作在保护模式下. 在保护模式下,80386虚地址空间可达16K个段,每段大小可变,最大达4GB.逻辑地址到线性地址的转换由80386分段机制管理.段寄存器CS.DS.ES.SS.FS或GS各标识一个段.这些段寄存器作为段选择器,用来选择该段的描述符. 分段逻辑地址到线性地址转换图: Linux对80386的分段机制使用得很有限,因为Linux的设计目标是支