页表是如何完成VPN到PFN的转换的,要知道这个问题就得清楚页表的基本内容,即页表记录了什么信息。...当然额外的内存访问本身是分页机制相对分段机制的缺陷,一级页表映射也存在这样的缺陷,只是多级页表映射将这个缺点再次放大。...TLB要实现这个替换,其需要实现的基本工作原理是: 从虚拟地址中提取页号(VPN),检查TLB是否有该VPN的转换映射。...“young”位的模拟方法与“dirty”位类似,也是利用了两套PTE页表模拟,一套用于Linux,一套用于ARM硬件。 ARMv7页表如何下发到硬件?...当使用64KB页大小时,ARMv8使用三级页表;当使用4KB和16KB页大小时,ARMv8使用四级页表。正如下图所示。
对页表进行"自操作" 在 x86 系统中,内存管理中的分页机制是非常重要的,在Linux操作系统相关的各种书籍中,这部分内容也是重笔浓彩。...如果你看过 Linux 内核相关书籍,一定对下面这张图又熟悉、又恐惧: 这是 Linux 系统中,页处理单元的多级页表查询方式。...这篇文章,我们继续通过图片+实例的方式,一起来研究一下内核代码一般都是如何来进行这些“自操作”的。 把这里面的操作机制研究透彻之后,再去看 Linux 内核代码时,就不会晕头转向了。...例如本文开头的第一张图中,Linux 使用了4级表格来查找,并且中间的两个表格还可以省略不用。 如何跨过中间的这两个表格,Linux 内核代码中的代码更复杂一些,但是策略都是一样的。...对页表进行寻址 既然已经弄明白了操作系统是如何操作页目录的,那么对页表的操作就不是什么大问题了。
1 linux的分页机制 1.1 四级分页机制 前面我们提到Linux内核仅使用了较少的分段机制,但是却对分页机制的依赖性很强,其使用一种适合32位和64位结构的通用分页模型,该模型使用四级分页机制,即...1.2 不同架构的分页机制 对于不同的体系结构,Linux采用的四级页表目录的大小有所不同:对于i386而言,仅采用二级页表,即页上层目录和页中层目录长度为0;对于启用PAE的i386,采用了三级页表...1.3 为什么linux热衷:分页>分段 那么,为什么Linux是如此地热衷使用分页技术而对分段机制表现得那么地冷淡呢,因为Linux的进程处理很大程度上依赖于分页。...在两级或三级分页系统中,该宏产生 pgd ,即一个页全局目录项的地址 pud_page(pud) 通过页上级目录项 pud 产生相应的页中间目录的线性地址。...在两级或三级分页系统中,该宏产生 pgd ,即一个页全局目录项的地址 pmd_offset 根据通过pgd_offset获取的pgd 项和虚拟地址,获取相关的pmd项(即pte表的起始地址) pte_offset
为了同时支持适用于32位和64位的系统, Linux采用了通用的分页模型. 在Linux-2.6.10版本中, Linux采用了三级分页模型. 而从2.6.11开始普遍采用了四级分页模型....其他内容请参照博主的另外两篇博客, 我就不罗嗦了 深入理解计算机系统-之-内存寻址(五)–页式存储管理, 详细讲解了传统的页式存储管理机制 深入理解计算机系统-之-内存寻址(六)–linux中的分页机制..., 详细的讲解了Linux内核分页机制的实现机制 3 Linux分页机制的演变 3.1 Linux的页表实现 由于程序存在局部化特征, 这意味着在特定的时间内只有部分内存会被频繁访问,具体点,进程空间中的...3.3 Linux的三级页表 当X86引入物理地址扩展(Pisycal Addrress Extension, PAE)后,可以支持大于4G的物理内存(36位),但虚拟地址依然是32位,原先的页表项不适用...这样,就把Linux内核的3级列表扩充为4级列表。这系列PATCH工作得不错,不久被纳入Andrew Morton的-mm树接受测试。 不出意外的话,它将在v2.6.11版本中释出。
Linux物理内存三级架构 对于内存管理,Linux采用了与具体体系架构不相关的设计模型,实现了良好的可伸缩性。它主要由内存节点node、内存区域zone和物理页框page三级架构组成。...又如,由于Linux内核采用 • 物理页框page 2....Linux虚拟内存三级页表 Linux虚拟内存三级管理由以下三级组成: • PGD: Page Global Directory (页目录) • PMD: Page Middle...PTE的保护和状态位如下图所示: 2.3 如何通过3级页表访问物理内存 为了通过PGD、PMD和PTE访问物理内存,其相关宏在asm/pgtable.h中定义。...mm_struct获取pgd项的宏定义如下: • pmd_offset 根据通过pgd_offset获取的pgd 项和虚拟地址,获取相关的pmd项(即pte表的起始地址
对于不同的体系结构,Linux采用的四级页表目录的大小有所不同:对于i386而言,仅采用二级页表,即页上层目录和页中层目录长度为0;对于启用PAE的i386,采用了三级页表,即页上层目录长度为0;对于...64位体系结构,可以采用三级或四级页表,具体选择由硬件决定。...对于没有启用物理地址扩展的32位系统,两级页表已经足够了。从本质上说Linux通过使“页上级目录”位和“页中间目录”位全为0,彻底取消了页上级目录和页中间目录字段。...内核为页上级目录和页中间目录保留了一个位置,这是通过把它们的页目录项数设置为1,并把这两个目录项映射到页全局目录的一个合适的目录项而实现的。 启用了物理地址扩展的32 位系统使用了三级页表。...Linux 的页全局目录对应80x86 的页目录指针表(PDPT),取消了页上级目录,页中间目录对应80x86的页目录,Linux的页表对应80x86的页表。
Linux 中的段: Linux 内核的设计并没有全部采用 Intel 所提供的段方案,仅仅有限度地使用了一下分段机制。...这样 Linux 巧妙地绕过了逻辑地址到线性地址的映射 分页机制 分页机制在段机制之后进行,以完成线性—物理地址的转换过程。 分页机制由 CR0 中的 PG 位启用。...有些书上也把页面高速缓存叫做 “联想存储器” 或 “转换旁路缓冲器(TLB)” Linux 中的分页机制 Linux 主要采用分页机制来实现虚拟存储器管理,原因如下: Linux 设计目标之一就是能够把自己移植到绝大多数流行的处理器平台...Linux 的分段机制使得所有的进程都使用相同的段寄存器值 为了保持可移植性,Linux 采用三级分页模式而不是两级,为此,Linux定义了 3 种类型的页表: 总目录 PGD(Page Global...Directory) 中间目录 PMD(Page Middle Derectory) 页表 PT(Page Table) 尽管 Linux 采用的是三级分页模式,但我们的讨论还是以 Intel 奔腾处理器的两级分页模式为主
只是简单说说可能体现不出来分页管理的优势,让我们思考下,除了分页管理之外,简单的内存管理该如何做呢?...每当为一个虚拟页面寻找到一个物理页面后,就在页表里面增加一个记录来保留该虚拟页面到物理页面的映射关系,随着虚拟页面进出物理内存,页表的内容页不断发生变化。...对于32位寻址的虚拟地址,如果页面大小为4KB,则虚拟页面数最多可以达到2的20次方,即1048576个虚拟页面,那么页表的记录条数就为1048576条。这样就占用较多空间,如何减少页表空间呢?...这时可以使用多级页,表页表根据存放的内容可分为:顶级页表、一级页表、二级页表、三级页表等。...例如,Linux使用的是三级页表,按照常理来说,这将使得系统的执行效率大大降低,但许多人并没有感觉到Linux特别慢,这就是因为Linux的TLB命中率高,据称其命中率达98%。
;两级页表就是对页表再进行分页,第一级称为页目录,其中存放关于页表的信息;4MB的页表再次分页,可以分为1K个4KB大小的页。...Linux为什么主要采用分页机制来实现虚拟存储管理?它为什么采用三级分页模式而不是两级?...64位结构;Linux定义了三种类型的页表:页目录(PGD)、中间目录(PMD)和页表(PT)。...Q2.Linux是如何实现“请求调页”的?...Linux是如何分配中断向量的?
我们知道LINUX的内存管理系统中有”反向映射“这一说,目的是为了快速去查找出一个特定的物理页在哪些进程中被映射到了什么地址,这样如果我们想把这一页换出(SWAP),或是迁移(Migrate)的时候,就能相应该更改所有相关进程的页表来达到这个目的...1、为什么要使用反向映射 物理内存的分页机制,一个PTE(Page Table Entry)对应一个物理页,但一个物理页可以由多个PTE与之相对应,当该页要被回收时,Linux2.4的做法是遍历每个进程的所有...2、Linux2.6中是如何实现反向映射 2.1 与RM(Reverse Mapping)相关的结构 page, address_space, vm_area_struct, mm_struct, anon_vma...Linux采用三级页表: PGD:顶级页表,由pgd_t项组成的数组,其中第一项指向一个二级页表。...PMD:二级页表,由pmd_t项组成的数组,其中第一项指向一个三级页表(两级处理器没有物理的PMD)。 PTE:是一个页对齐的数组,第一项称为一个页表项,由pte_t类型表示。
那么它是如何工作的呢?...5.缓存中的通写和回写机制。 ?...,并看该设备是否完成了工作。...,它会先去找这歌进程的“task struct”,并装载页表(page table)[记录着线性地址到物理内存的映射关系,每一个对应关系叫做一个页表项。]...就必须经过MMU运算,这样导致效率很低,因此他们有引进了一个缓存,用于存放频繁访问的数据,这样就可以提高效率,不用MMU进行计算,直接拿到数据去处理就OK了,这个缓存器我们称之为:TLB:转换后援缓冲器(缓存页表的查询结果
5、linux中的段机制 从2.2 版开始,Linux 让所有的进程(或叫任务)都使用相同的逻辑地址空间,因此就没有必要使用局部描述符表LDT。...看来,Linux 巧妙地把段机制给绕过去了,它只把段分为两种:用户态(RPL=3)的段和内核态(RPL=0)的段,而完全利用了分页机制。...当访问一个操作单元时,如何由分段结构确定的32 位线性地址通过分页操作转化成32位物理地址呢?...8、linux 中的分页机制 Linux 的分段机制使得所有的进程都使用相同的段寄存器值,这就使得内存管理变得简单,也就是说,所有的进程都使用同样的线性地址空间(0~4GB)。...Linux 采用三级分页模式而不是两级。如图2.28 所示为三级分页模式,为此,Linux定义了3 种类型的表。
分页机制也类似,有着一张页表:通过页号、页内偏移量,来对应最终的物理地址。...多级页表 多级页表的设计有点像一棵查找的分段树:首先通过 0 级页表找到你在 1 级页表的位置,然后在 1 级页表中找到你在 2 级页表中的位置… 以此类推,最终在 3 级页表中找到最终的实际物理地址。...如何更快的找到物理地址 你想,原来如果只有一个表,那么查询的速度肯定很快,找到 key 就能找到对应的 value,但是有了多级页表之后,那么查询的速度自然就受到影响了。...Linux 中叫 KSM(Kernel Same-page Merging) 内存压缩:当内存不足时,还会触发压缩的机制,Linux 中的 zswap,将数据压缩后节省资源,避免频繁的磁盘操作 透明大页...故使用大页的情况下能大幅度减少页的数量,从而增加 TLB 的命中情况,Linux 提供了透明大页的支持,能够将连续的内存页合并成大页,提高命中的同时还可以减少页表的级数。
但是且慢,其实我们早就已经在跟类似反置页表的机制打交道了,那就是 CPU高速缓存 。你可以质疑反置页表的实现尚有缺陷,但是质疑反置页表的本质,便无遗是在质疑CPU高速缓存机制本身。...这便就是反置页表要解决的问题。完全一致啊! 下面的问题是,如何把CPU高速缓存的那套实现机制,借鉴给反置页表。...另外还有一个Tip就是, 反置页表不能使用高速缓存的组相联机制,但是却非常类似全相联 ,Why?...以Linux内核的伙伴系统为例,它就是为此而准备的,而局部性问题则由伙伴系统上层的slab/slub机制来保证。...再说说反置页表的实现,几乎可以肯定不能用CPU高速缓存的实现方案,因为地址空间差异太大,过于昂贵。如果纯软件化,那效率又过于低下,如何来权衡? 这里不谈TLB,那是另一个话题。
而在Linux中存储虚拟地址到物理地址转化的关系的表称为页表。 目前最新的linux内核已经支持了5级页表。下图是一个4级页表的转化关系图。 ?...Table Entry) 页表 如果是5级页表的话,会在PGD和PUD之间增加一个level叫P4D。...LINUX目前是支持5级页表,当然也可以通过config(CONFIG_PAGE_LEVELS)去配置的,目前手上的模拟板使用的是三级页表,如果使用三级页表的话,PUD等于PMD。...前期条件是目前配置的是3级页表。 目前此地址是线性地址,转化关系比较简单。...PMD_SHIFT ==> 页中级目录索引的偏移 PAGE_SHIFT ==> 页表内的偏移 当前模拟板是只有三级页表,则就没有P4D和PUD,这样的话PGD=PMD了。
选择一个良好的战场才有利于军队打胜仗,实现一个完善的内存管理机制才能让进程多快好省地运行。如何更好地实现内存管理一直是操作系统发展的一大主题。...在x86 32上,分段机制和分页机制是并存的,系统可以选择只使用分段机制或者两种机制都使用。Linux的选择是使用分页机制,并在逻辑上屏蔽分段机制,因为分段机制是不能禁用的。...此处讲的内存模型是Linux对物理内存地址空间连续性的抽象,用来表示物理内存的地址空间是否有空洞以及该如何处理空洞,因此这个概念也被叫做内存连续性模型。...物理内存分配最底层的是页帧分配。页帧分配的分配单元是区域,分配粒度是页面。如何进行页帧分配呢?Linux采取的算法叫做伙伴系统(buddy system)。...目前绝大部分的操作系统采用的内存管理模式都是以分页内存为基础的虚拟内存机制。虚拟内存机制的中心是MMU和页表,MMU是需要硬件提供的,页表是需要软件来操作的。
——不过Linux并没有完全享受这种福利,它的页表目录和与已分配页面相关的页表都是常驻内存的。...前面说了i386的二级页管理架构,不过有些CPU,还有三级,甚至四级架构,Linux为了在更高层次提供抽像,为每个CPU提供统一的界面。...提供了一个四层页管理架构,来兼容这些二级、三级、四级管理架构的CPU。...——不过Linux并没有完全享受这种福利,它的页表目录和与已分配页面相关的页表都是常驻内存的。...前面说了i386的二级页管理架构,不过有些CPU,还有三级,甚至四级架构,Linux为了在更高层次提供抽像,为每个CPU提供统一的界面。
内核为页上级目录和页中间目录保留了一个位置,这是通过把它们的页目录项数设置为1,并把这两个目录项映射到页全局目录的一个合适的目录项而实现的。 启用了物理地址扩展的32 位系统使用了三级页表。...Linux的页全局目录对应80×86 的页目录指针表(PDPT),取消了页上级目录,页中间目录对应80×86的页目录,Linux的页表对应80×86的页表。...最后,64位系统使用三级还是四级分页取决于硬件对线性地址的位的划分。 总结 这里我们不讨论代码实现,只关注原理。从上面的讨论可以看到分页机制主要依赖硬件的实现。...Linux采用的四级页表只是为了最大化兼容不同的硬件实现,单就IA32架构的CPU来说,就有多种分页实现,常规分页机制,PAE机制等。...例如说:Linux在32位CPU上,它的四级页表结构就会兼容到硬件的两级页表结构。可见,Linux在软件层面上做了一层抽象,用四级页表的方式兼容32位和64位CPU内存寻址的不同硬件实现。
我们可以研究下内核是如何建立内核页表的映射。...= end); return 0; } Linux内核中实现了4级页表,对于ARM32来说,它是如何跳过中间两级页表的呢?...这个宏产生页上级目录中目录项 addr 对应的线性地址。在两级或三级分页系统中,该宏产生 pgd ,即一个页全局目录项的地址。...pfn得到pte *pte_mkspecial()设置软件的PTE_SPECIAL标志位(三级页表才会用该标志位) *set_pte_at() 把pte设置到硬件页表中...Linux内核的内存管理已经适配了X86的页表项,我们可以通过软件适配的办法来解决这个问题。因此,ARM公司在移植该方案时提出了两套页表的方案。
领取专属 10元无门槛券
手把手带您无忧上云