精华内容
下载资源
问答
  • task_struct中有一个成员mm_struct,mm_struct有一个成员pgd,每次要进行进程切换的时候,通过pgd来修改cr3寄存器中的值,将它修改为进程的一级页表的物理地址。每张页表在物理内存上是连续的,所以获得这个地址之后...

    困惑了很久的问题。

    task_struct中有一个成员mm_struct,mm_struct有一个成员pgd,每次要进行进程切换的时候,通过pgd来修改cr3寄存器中的值,将它修改为进程的一级页表的物理地址每张页表在物理内存上是连续的,所以获得这个地址之后,就可以访问一级页表中的每一项了。

    pgd是一个指针,指向的是一级页表。但是它并不是物理地址,而是虚拟地址。所以在修改寄存器cr3的时候,需要先转换为物理地址:

    #define cpu_switch_mm(pgd,mm) cpu_do_switch_mm(virt_to_phys(pgd),mm) // 注意virt_to_phys
    

    内核怎么把pgd从虚拟地址转换为物理地址呢?

    由于一级页表存在于内核空间,并且不是高端内存,所以一级页表的虚拟地址和物理地址是线性映射。所以可以很容易地进行转换。(很有可能它们就是一样的,这个网页有这样的例子

    展开全文
  • 本文从单级页表存在的问题引出两级页表,以及两级页表如何实现地址的变换。1单级页表存在的问题假设某计算机系统按字节寻址,支持32位逻辑地址,采用分页存储管理,页面大小为4KB,页表项长度为4B。4KB = 212B,因此...

    本文是在基本分页存储管理的基础上对分页管理的优化。在上篇文章中说到,操作系统会为每个进程建立一张页表,实现页号和内存块号之间的对应关系。本文从单级页表存在的问题引出两级页表,以及两级页表如何实现地址的变换。

    1单级页表存在的问题

    51c2286a6268

    假设某计算机系统按字节寻址,支持32位逻辑地址,采用分页存储管理,页面大小为4KB,页表项长度为4B。

    4KB = 212B,因此页内地址要用12位表示,剩余20位表示页号。——上篇文章 第三节的结论。

    因此,该系统中用户进程最多有220页。相应的,一个进程的页表中,最多会有220个页表项,所以一个页表最大需要220 * 4B = 222B。一个页框(内存块)大小为4B,所以需要222/212 = 210个页框存储该页表。而页表的存储是需要连续存储的,因为根据页号查询页表的方法:K号页对应的页表项的位置 = 页表起始地址 + K * 4B(页表项长度),所以这就要求页表的存储必须是连续的。

    回想一下,当初为什么使用页表,就是要将进程划分为一个个页面可以不用连续的存放在内存中,但是此时页表就需要1024个连续的页框,似乎和当时的目标有点背道而驰了....

    此外,根据局部性原理可知,很多时候,进程在一段时间内只需要访问某几个页面就可以正常运行了。因此也没有必要让整个页面都常驻内存。

    所以,单级页表存在以上两个问题。

    2 两级页表

    如何解决页表过大需要连续存储的问题呢?这个问题可以参考进程太大需要连续存储的答案。因为页表必须连续存放,所以可以将页表再分页。

    解决方案:可以将长长的页表进行分组,使每个页面中刚好可以放下一个分组(如上面的例子中,页面的大小4KB),每个页表项4B,所以每个页面中可以存放1K个(1024)个页表项,因此每1K个连续的页表项为一组,每组刚好占一个页面,再讲各组离散的放在各个内存块中)。这样就需要为离散的页表再建立一张页表,称为页目录表,或外层页表,或顶层页表。

    还是面的例子,32位的逻辑地址空间,页表项大小为4B,页面大小4KB,则页内地址占12位,单级页表结构逻辑结构图如下图所示

    51c2286a6268

    使用单级页表的情况

    51c2286a6268

    将页表分为分为1024个表,每个表中包含1024个页表项,形成二级页表。二级页表结构的逻辑地址结构如下图

    51c2286a6268

    两级页表如何实现地址转换:

    (1) 按照地址结构将逻辑地址拆成三个部分。

    (2) 从PCB中读取页目录起始地址,再根据一级页号查页目录表,找到下一级页表在内存中存放位置。

    (3) 根据二级页号查表,找到最终想要访问的内存块号。

    (4) 结合页内偏移量得到物理地址。

    下面以一个逻辑地址为例。将逻辑地址(0000000000,0000000001,11111111111)转换为物理地址的过程。

    51c2286a6268

    3 虚拟存储技术

    再解决了页必须连续存放的问题后,再看如何第二个问题:没有必要让整个页表常驻内存,因为进程一段时间内可能只需要访问某几个特定的页面。

    解决方案:可以在需要访问页面时才把页面调入内存——虚拟存储技术(后面再说)。可以在页表中增加一个标示位,用于表示该页表是否已经调入内存。

    51c2286a6268

    4 几个问题

    (1) 若采用多级页表机制,则各级页表的大小不能超过一个页面。

    举例说明,某系统按字节编址,采用40位逻辑地址,页面大小为4KB,页表项大小为4B,假设采用纯页式存储,则要采用()级页表,页内偏移量为()位?

    页面大小 = 4KB,按字节编址,因此页内偏移量为12位。

    页号 = 40 - 12 = 28位。

    页面大小 = 4KB,页表项大小 = 4B,则每个页面可存放1024个页表项。因此各级页表最多包含1024个页表项,需要10个二进制位才能映射到1024个页表项,因此每级页表对应的页号应为10位二进制。共28位的页号至少要分为3级。

    51c2286a6268

    (2) 两级页表的访问次数分析(假设没有页表):

    (1) 第一次访问:访问内存中的页目录表。

    (2) 访问内存中的二级目录。

    (3) 访问目标内存单元。

    从上面可以看出,两级页表虽然解决了页表需要连续存储的问题,但是同时也增加了内存的访问次数。

    4 小结

    51c2286a6268

    展开全文
  • 一页大小为4KB,这样一来,4GB地址空间被划分成4GB/4KB=1M个页,也就是4GB空间中可以容纳1048576个页,页表中自然也要有1048576个页表项,这就是我们要说的一级页表一级页表如图: 这是一级页表模型,由于页大小...

    接上,页是地址空间的计量单位,并不是专属物理地址或线性地址,只要是4KB的地址空间都可以称为一页,所以线性地址的一页也要对应物理地址的一页。一页大小为4KB,这样一来,4GB地址空间被划分成4GB/4KB=1M个页,也就是4GB空间中可以容纳1048576个页,页表中自然也要有1048576个页表项,这就是我们要说的一级页表。一级页表如图:

    这是一级页表模型,由于页大小是4KB,所以页表项中的物理地址都是4k的整数倍,故用16进制表示的地址,低3位都是0。就拿第3个页表项来说,其值为0x3000,表示该页对应的物理地址是0x3000。

    可能,您心里一直有个疑问:页表如何使用呢?也就是如何将线性地址转换成物理地址呢?

    还是用图5-10帮助理解,滑块正落到在32位地址的第12位。右边11~0位用来表示页的大小,也就是这12位可以做为页内寻址。左边31~12位用来表示页的数量,同样这20位也用来索引一个页(索引范围0~0xfffff),表示第几个页,对吧。

    其实也可以这样理解:任意一个地址最终会落到某一个物理页中。32位地址空间共有1M(1048756)个物理页,首先要做的是定位到某个具体物理页,然后给出物理页内的偏移量就可以访问到任意1字节的内存啦。所以,用20位二进制就可以表示全部物理页啦。标准页都是4KB,12位二进制便可以表达4KB之内的任意地址。

    在32位保护模式下任何地址都是用32位二进制表示,包括虚拟地址也是。经以上分析,虚拟地址的高20位可用来定位一个物理页,低12位可用来在该物理页内寻址。这是如何实现的呢?物理地址是写在页表的页表项中,段部件输出的只是线性地址,所以问题就变成了:怎样用线性地址找到页表中对应的页表项

    在此之前,大家要知道两件事:

    1. 分页机制打开前要将页表地址加载到控制寄存器cr3中,这是启用分页机制的先决条件之一,在介绍二级页表时会细说。所以,在打开分页机制前加载到寄存器cr3中的是页表的物理地址,页表中页表项的地址自然也是物理地址了。
    2. 虽然内存分页机制的作用是将虚拟地址转换成物理地址,但其转换过程相当于在关闭分页机制下进行,过程中所涉及到的页表及页表项的寻址,它们的地址都被cpu当做最终的物理地址(本来也是物理地址)直接送上地址总线,不会被分页机制再次转换(否则会递归转换下去)。

    刚才说过啦,如何通过线性地址找到其对应的页表项才是转换的关键。既然页表是位于内存中,所以只要提供页表项的物理地址便能够访问到页表项。页表本身属于线性表结构,相当于页表项数组,访问其中任意页表项成员,只要知道该表页项的索引(下标)就够了。

    分析过后,地址转换过程原理如下:

    一个页表项对应一个页,所以,用线性地址的高20位做为页表项的索引,每个页表项要占用4字节大小,所以这高20位的索引乘以4后才是该页表项相对于页表物理地址的字节偏移量。用cr3寄存器中的页表物理地址加上此偏移量便是该页表项的物理地址,从该页表项中得到映射的物理页地址,然后用线性地址的低12位与该物理页地址相加,所得的地址之和便是最终要访问的物理地址。

    曾经有同学对地址转换过程感到迷惑,误以为启用分页后,页表项地址也是虚拟地址,还需要被转换,转换过程无限递归下去,这显然是不对的。

    以上所说的转换步骤多少都有点麻烦,既然地址转换算法已经是固定的了,何不使其在硬件一级自动完成呢。有道理,所以cpu中集成了专门用来干这项工作的硬件模块,我们把该模块称为页部件。当程序中给出一个线性地址时,页部件分析线性地址,按照以上算法,自动在页表中检索到物理地址。

    总结一下页部件的工作:用线性地址的高20位在页表中索引页表项,用线性地址的低12位与页表项中的物理地址相加,所求的和便是最终线性地址对应的物理地址。

    咱们还是通过例子来理解转换过程吧。拿mov ax,[0x1234]来说,其地址转换完整过程如图:

    假设咱们是在平坦模型下工作,不管段选择子值是多少,其所指向的段基址都是0,指令mov ax,[0x1234]中的0x1234称为有效地址,它做为“段基址:段内偏移地址”中的段内偏移地址。这样段基址为0,段内偏移地址为0x1234,经过段部件处理后,输出的线性地址是0x1234。由于咱们是演示分页机制,必须假定系统已经打开了分页机制,所以线性地址0x1234被送入了页部件。页部件分析0x1234的高20位,用16进制表示高20位是0x00001。将此项做为页表项索引,再将该索引乘以4后加上cr3寄存器中页表的物理地址,这样便得到索引所指代的页表项的物理地址,从该物理地址处(页表项中)读取所映射的物理页地址:0x9000。线性地址的低12位是0x234,它做为物理页的页内偏移地址与物理页地址0x9000相加,和为0x9234,这就是线性地址0x1234最终转换成的物理地址。

    一级页表说了这么多,完全是为了讲述页表原理,这样就能更好的理解下面要讲的二级页表,它们在原理上一脉相承。因为目前现代操作系统一般都是用二级页表,咱们的系统也采用二级页表,下一节咱们再见啦。

    展开全文
  • 级页表

    2020-11-21 12:40:36
    级页表单级页表存在的问题两级页表原理、地址结构如何实现地址变换几个要注意的细节总结 单级页表存在的问题 问题: 页表必须连续存放,因此当页表很大时,需要占用很多个连续的页框 解决: 可将长长的页表进行...

    知识总览

    单级页表存在的问题

    问题一: 页表必须连续存放,因此当页表很大时,需要占用很多个连续的页框

    解决:
    可将长长的页表进行分组,使每个内存块刚好可以放入一个分组(比如上个例子中,页面大小4KB,每个页表项4B,每个页面可存放1K个页表项,因此每1K个连续的页表项为一组,每组刚好占一个内存块,再讲各组离散地放到各个内存块中)
    另外,要为离散分配的页表再建立一张页表,称为页目录表,或称外层页表,或称顶层页表

    两级页表原理、地址结构

    在这里插入图片描述

    两级页表

    如何实现地址变换

    例题

    在这里插入图片描述


    问题二: 根据局部性原理可知,没有必要让整个页表常驻内存,因为进程在一段时间内可能只需要访问某几个特定的页面。

    解决:
    可以在需要访问页面时才把页面调入内存(虚拟存储技术)。可以在页表项中增标志位,用于表示该页面是否已经调入内存

    在这里插入图片描述

    几个要注意的细节

    1.若采用多级页表机制,则各级页表的大小不能超过一个页面

    例: 某系统按字节编址,采用40位逻辑地址,页面大小为4KB,页表项大小为4B,假设采用纯页式存储,则要采用()级页表,页内偏移量为()位?


    解答
    在这里插入图片描述

    2.两级页表的访存次数分析(假设没有快表机构)
    第一次访存:访问内存中的页目录表
    第二次访存:访问内存中的二级页表
    第三次访存:访问目标内存单元

    总结

    在这里插入图片描述

    展开全文
  • 级页表

    千次阅读 2018-06-09 20:28:45
    一级页表:比如对于4G的空间,4K页那需要2^20 == 1M个页标项(无论用不用都需要,系统不知道哪个地址是否会被访问)1M * 4 == 4M每个进程都需要4M的内存(每个进程最小需要4M的内存)二级页表:每个进程最多需要...
  • 【操作系统-2014年清华秋季-陈渝老师】 【Linux内核分析与应用-陈莉君老师】 【C/C++笔记汇总】
  • 虚拟内存映射的分页机制:使用一级页表 提前熟悉 核心 关键词 的含义: 内存 内存页面 虚拟地址 物理地址 页面页码 页偏移 页表数组 高位,低位 总结: 目的: 通过给的虚拟地址(一个32位数字) 来求出 物理地址...
  • 前面讲述了页表的原理,并以一级页表做为原型讲述了地址转换过程。既然有了一级页表,为什么还要搞个二级页表呢?理由如下: 一级页表中最多可容纳1M(1048576)个页表项,每个页表项是4字节,如果页表项全满的话,...
  • 接上节,分页机制是建立在分段机制之上,与其脱离不了干系,即使在分页机制下的进程也要先经过逻辑上的分段才行,每加载个进程,操作系统按照进程中各段的起始范围,在进程自己的4GB虚拟地址空间中寻找可有空间...
  • 三十二、两级页表

    2021-02-13 21:10:00
    、知识总览 二、单级页表存在的问题 ...2.两级页表的访存次数分析(假如没有快表机构) 第次访存:访问内存中的页目录表 第二次访存:访问内存中的二级页表 第三次访存:访问目标内存单元 四、总结 ...
  • 为了给大家说清楚分页机制,我们先在宏观上说下cpu地址变换过程,先让大家有个直观的印象,如果有不明白的...由于有了线性地址到真实物理地址的这层映射,故经过段部件输出的线性地址便有了另外个名字,虚拟地址。
  • 级页表分页存储需要目录页表数形象解释

    千次阅读 多人点赞 2020-02-18 15:50:39
    某计算机采用二级页表的分页存储管理方式,按字节编址,页面大小为1024B,每个页表项占2B,若逻辑地址空间的大小为 64K 个页面,则表示整个逻辑地址空间的页目录表中包含的表项的个数至 少为__128_____ 在解决这个...
  • Linux是几级页表

    千次阅读 2019-06-19 16:02:02
    Linux是几级页表? 先看下系统的页表大小: root@hw2:~# getconf PAGE_SIZE 4096 Linux的页表分配是根据cpu来设计的,不同平台(cpu)分页不同,这里考虑x86平台: 平台 linux页表 地址分配 可表示大小 x86 二...
  • linux四级页表及其原理

    千次阅读 2019-11-26 17:35:22
    description: linux四级页表及其原理 .多级页表的概念   介绍页表之前,我们先来回顾个操作系统里的基本概念,虚拟内存。 1.1 虚拟内存   在用户的视角里,每个进程都有自己独立的地址空间,A进程的4GB和B...
  • 内存管理之二级页表详解

    万次阅读 多人点赞 2019-08-08 13:11:39
    一级页表相当于把一本书缩小成几页的目录,通过目录来找书的内容。 但有个问题,如果书非常非常厚,有两本康熙字典那么大,目录也非常多,有一本高中教材那么厚。 那自然而然的,继续分呗,把高中教材那么厚的一级...
  • 3.1.9 OS之二级页表的原理和地址结构

    千次阅读 2020-05-05 14:41:55
    2.二级页表的原理和地址结构3.如何实现二级页表的地址变换?4.几个小细节 0.思维导图 1.为什么引入二级页表? 因为单级页表存在一些问题,所以引入二级页表和多级页表,有两个问题: 上面提到了这两个问题,那么...
  • mips中的三级页表

    2020-11-10 16:40:27
    1)64 位 MIPS 处理器大多使用三级页表,包括顶级的 PGD(页全局目录)、次级的 PMD(页中间目录)和最后一级 PTE(页表) 2)遍历三级页表 pgd 基址 + pgd 偏移 = pgd 表项(存 pmd 基址) pmd 基址 + pmd 偏移 = ...
  • 级页表理解与计算

    千次阅读 2020-11-12 10:25:57
    级页表 为什么要二级页表? 1.页表必须连续存放,因此当页表很大时,需要占用很多个连续的页框2.没有必要让整个页表常驻内存,因为进程在段时间内可能只需要访问某几个特定的页面。 页表项的大小如何计算?...
  • 操作系统二级页表

    2021-04-15 09:57:52
    计算机采用二级页表的分页存储管理方式,按字节编址,页面大小为1024B,每个页表项占2B, 逻辑地址结构为:  若逻辑地址空间的大小为 64K 个页面,则表示整个逻辑地址空间的页目录表中包含的表项的个数至 少为____...
  • 3.1_9_两级页表

    2020-08-17 15:41:55
    重新建立起对一级页表的页表,页目录表 将逻辑地址进程拆分成一级页号和二级页号 地址转换的流程 根据一级页号在页目录表中的位置,找到二级页表所在的内存块号 根据所得的内存块号和二级页号,找到真正的物理块号 ...
  • ARM 全局页表与二级页表转换调试

    千次阅读 2016-08-19 20:33:03
    最近在看ARM的内存管理,刚好看到全局页表swapper_pg_dir,看了很久细想能否直接通过查看内存方式查看swapper_pg_dir的内存: 幸好之前弄过/dev/mem,知道可以把物理内存映射出来。 先贴工具代码: #include #...
  • 级页表

    千次阅读 2014-09-19 12:02:19
    所有页,都是4k对其的页,因此,表达个4k页地址,只需要20位(12-31)。 表达个4M页地址,只需要10位。 CR3--> Address of page directory (12-31)  PD entry --> Address of page table (12-31) ...
  • 浅谈五级页表

    2019-06-28 21:45:47
    远在 2005 年年初的时候,在 2.6.10 的基础上合入四级页表补丁的工作是次基于(当时)新的内核开发模式的早期尝试。它表明在社区的合作努力下完全有能力针对一些核心模块进行快速修改并发布给用户,而这在 2.6.0 ...
  • 、单级页表存在的问题 二、两级页表及其逻辑地址结构
  • 基本页表和二级页表的思路和比较

    千次阅读 2020-08-01 10:44:20
    基本页表 默认块号大小为4KB。 (页表项由 页号 和 块号 组成) 页号是进程的,块号是内存的。 块号 -> 物理地址 内存的块号是唯一的,通过它能得到内存内的物理地址。...我们得到个逻辑地址如何算出
  • 次方=4G,一个页表描述符(页表项)对应1M的虚拟内存空间,则4G对应4096个一级页表项,一个页表项又占用4字节,需要4096×4=16K的物理内存用于存放一级页表。但bootloader没有必要完整的构造4096个页表项,只要够用...
  • 级页表如何节省内存

    千次阅读 2015-04-16 12:58:24
    :如果使用简单的一级页表,如果进程使用全部4G线性地址空间,那么将需要高达2^20表项(总共地址线是32位,每页大小为4kb,则页偏移量需要低12位,高20位当作页表地址)来保存表示每个进程的页表,若每项4B,则需要4...
  • 2020年二级页表大题

    千次阅读 2020-05-10 13:38:10
    某32位系统采用基于二级页表的请求分页存储管理方式,按字节编址,页目录项和页表项均为4字节,虚拟地址结构如下: 页目录号(10位) 页号(10位) 页内偏移量(12位) 某C程序中...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 22,136
精华内容 8,854
关键字:

一级页表