首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux内核页表管理-那些鲜为人知的秘密

1.开场白 环境: 处理器架构:arm64 内核源码:linux-5.11 ubuntu版本:20.04.1 代码阅读工具:vim+ctags+cscope 通用操作系统,通常都会开启mmu来支持虚拟内存管理...,而页表管理是在虚拟内存管理中尤为重要,本文主要以回答几个页表管理中关键性问题来解析Linux内核页表管理,看一看页表管理中那些鲜为人知的秘密。...Linux内核为何使用多级页表?...2)Linux内核 填写页表,将页表基地址告诉mmu 内核初始化建立内核页表,实现缺页异常等机制为用户任务按需分配并映射页表。 当然,内核也可以遍历页表,如缺页异常时遍历进程页表。 10....12.页表遍历过程 下面以arm64处理器架构多级页表遍历作为结束(使用4级页表,页大小为4K): Linux内核中 可以将页表扩展到5级,分别是页全局目录(Page Global Directory,

1.9K22
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Linux-3.14.12内存管理笔记【建立内核页表(1)】

    前面已经分析过了Intel的内存映射和linux的基本使用情况,已知head_32.S仅是建立临时页表,内核还是要建立内核页表,做到全面映射的。...建立内核页表前奏,了解两个很关键的变量: max_pfn:最大物理内存页面帧号; max_low_pfn:低端内存区(直接映射空间区的内存)的最大可用页帧号; max_pfn 的值来自setup_arch...Linux是一个支持多硬件平台的操作系统,各种硬件芯片的分页并非固定的2级(页全局目录和页表),仅仅Intel处理器而言,就存在3级的情况(页全局目录、页中间目录和页表),而到了64位系统的时候就成了4...所以Linux为了保持良好的兼容性和移植性,系统设计成了以下的4级分页模型,根据平台环境和配置的情况,通过将页上级目录和页中间目录的索引位设置为0,从而隐藏了页三级目录和页中间目录的存在。...此外还有一个准备操作,在setup_arch()函数中调用的页表缓冲区申请操作: early_alloc_pgt_buf(): 【file:/arch/x86/mm/init.c】 void __init

    1.9K41

    内核知识第八讲,PDE,PTE,页目录表,页表的内存管理

    内核知识第八讲,PDE,PTE,页目录表,页表的内存管理 一丶查看GDT表....详情请看 https://www.cnblogs.com/hongfei/archive/2013/06/18/3142162.html 转载 三丶分页管理机制 讲解分页管理机制之前,我们要明白以下几个关键词的意思...我们说过,操作系统为了隔离内存.采用了分页管理.而我们线性地址转化到物理地址的时候. 则需要查表. 那么我们觉着这个表应该怎么做?...首先我们的CR3寄存器保存了表的首地址. 这里有一个页目录表,还有页表的关键词. 页目录表: 也称为PDE,而页表称之为PTE....PDE表的大小:   页目录表,存储在一个4K字节的物理页中,其中每一项是4个字节.保存了页表的地址.   而最大是1M个页. PTE表的大小.   PTE的大小也和PDE一样的.

    1.8K10

    【内存管理】页表映射基础知识

    中间的8个bit位叫做L2索引,在Linux内核中叫做PT,页表。最低的12位叫做页索引。 在ARM处理器中,TTBRx寄存器存放着页表基地址,我们这里的一级页表有4096个页表项。...MMU访问页表是硬件实现的,但页表的创建和填充需要Linux内核来填充。通常,一级页表和二级页表存放在主存储器中。 ARM32 一级页表的页表项 下面这张图来自ARMV7的手册。...Linux内核关于页表的函数 Linux内核中页表操作的宏定义 Linux内核中封装了很多宏来处理页表 #define pgd_offset_k(addr) pgd_offset(&init_mm,addr...Linux内核的内存管理已经适配了X86的页表项,我们可以通过软件适配的办法来解决这个问题。因此,ARM公司在移植该方案时提出了两套页表的方案。...一套页表是为了迎合ARM硬件的真实页表,另一套页表是为了迎合Linux真实的页表。 对于PTE页表来说,一下子就多出了一套页表,一套页表256表项,每个表项占用4字节。

    38110

    系统内存管理:虚拟内存、内存分段与分页、页表缓存TLB以及Linux内存管理

    内存分页内存分页是将整个虚拟和物理内存空间划分为固定大小的连续内存块,称为页(Page)。在Linux下,每一页的大小通常为4KB。...虚拟地址与物理地址之间通过页表进行映射,页表存储在CPU的内存管理单元(MMU)中,从而CPU可以直接通过MMU找到实际访问的物理内存地址。...这是因为程序执行过程中,访问的页表项相对固定。通过利用TLB,可以大大提高地址转换的速度,加快程序的执行效率。Linux内存管理Linux内存管理涉及逻辑地址和线性地址的转换。...逻辑地址是程序使用的地址,而线性地址是通过段式内存管理映射的地址,也称为虚拟地址。Linux的虚拟地址空间分为内核空间和用户空间两部分。...页表缓存TLB能够加快虚拟地址到物理地址的转换速度。Linux的内存管理涉及逻辑地址和线性地址的转换,将虚拟地址空间分为内核空间和用户空间,方便进程访问内核空间内存。

    83180

    【Linux 内核 内存管理】内存管理架构 ③ ( Linux 内核中的内存管理模块 | 页分配器 | 不连续页分配器 | 内存控制组 | 硬件设备内存管理 | MMU | 页表缓存 | 高速缓存 )

    文章目录 一、Linux 内核中的内存管理模块 二、硬件设备内存管理 一、Linux 内核中的内存管理模块 ---- Linux 内核还需要处理如下内容 : ① 页错误异常处理 ② 页表管理 ③ 引导内存分配器...: 页分配器 , 块分配器 , 不连续页分配器 , 连续内存分配器 , 每处理器内存分配器 ; " 页分配器 " 负责分配 内存物理页 , 使用的是 " 伙伴分配器 " ; " 不连续页分配器 " 提供了...: 控制管理 被 进程 占用的 内存 ; 碎片整理 : 如果 " 内存碎片化 " 严重 , 没有连续物理页 , 需要通过 整理内存碎片 并迁移数据 得到 连续的 物理页 ; 内存回收 : 内存不足时 ,...回收内存 ; ⑦ 页回收处理 二、硬件设备内存管理 ---- 硬件设备内存管理 : ① CPU 处理器 中的 " 内存管理单元 " ( MMU ) 和 高速缓存 ; ② 物理内存 在 " 内存管理单元..." ( MMU ) 中 , 还有一个 " 页表缓存 " ; 页表缓存 中缓存了 最近使用的 " 页表映射 “ , 该映射的作用是 将 ” 物理地址 " 映射为 " 虚拟地址 " ; CPU 处理器

    1.5K40

    页表与三级页表介绍

    在操作系统与计组学习中,我们会学习到页表这个概念,可以说,如今计算机的函数内存调用有很大一部分都离不开页表的调用,本文旨在详解页表的概念应用以及操作系统中的三级页表,三级页表对于节省空间起了至关重要的作用...: 程序执行过程中,CPU会通过MMU(内存管理单元,每个CPU都有,负责将虚拟地址转换为物理地址),将当前的VA(虚拟地址)转换为PA(物理地址),之后到相应的内存单元执行 页表条目 页表条目构成如下图...: 物理地址(56位) = 底层页表PPN(44位) + 虚拟地址offset(12位) 在三级页表的基础上,假设只使用了几个页面,那么中间层页表只需要加载0号页表即可,底层页表只需要加载要使用的几个页表项即可...,中间层页表省了511个页面,底层页表省下了511*512个页面 简单理解,其实单级页表就是用长宽高之积来描述长方体,而三级页表就是用长、宽、高三个坐标来描述长方体,这样做的目的就是大大节省了加载页表所需要的空间...至此,有关于页表与三级页表的介绍就到这里了,页表的存在对于内核区与用户区加载代码起了至关重要的作用,真正理解页表的转换机制有助于我们对操作系统的虚拟内存有更深刻的认识

    24210

    一文看懂影子页表和扩展页表

    后引入页表机制,把虚拟地址送往MMU,MMU查TLB不中的情况下,依次查页表就可以找到对应的物理地址。...二.影子页表 (Shadow page table) 影子页表我用一句话来描述就是:VMM把Guest和Host中的页表合并成一个页表,称为影子页表,来实现GVA->HPA映射。...4, 把GVA -> HPA,这一路的映射关系记录到页表中,这个页表就是影子页表。...虚拟机页表和影子页表通过一个哈希表建立关联(当然也有其他的关联方式),客户机操作系统把当前进程的页表基址载入PDBR时而VMM将会截获这一特权指令,将进程的影子页表基址载入客户机PDBR,使客户机在恢复运行时...硬件层面引入EPTP寄存器,来指向EPT页表基地址。Guest运行时,Guest页表被载入PDBR,而 EPT 页表被载入专门的EPT 页表指针寄存器 EPTP。

    2.4K20

    内核页表调试

    一、配置内核 首先配置内核,使其支持导出内核页表到debugfs下面: Kernel hacking ---> ---> [*] Export kernel pagetable layout to...内核用page结构体管理所有物理内存,每一页大小为PAGE_SIZE对于arm64,可能是4K,16K,64K。...地址空间port属性说明 第一列 当前页表的映射范围地址 第二列 代表此映射范围大小 PMD PUD PTE 当标识为PMD PUD表示当前映射为block映射,如当前页表为4K,则pud的block映射一次性可映射...当标识为PTE表示为页表映射即PAGE_SIZE大小4K。 USR AP标记,用于标识当前范围是否在用户空间还是内核空间可读可写或者仅读。...x表述当前范围特权级别模式可执行,就是内核的可执行代码段,在内核中这段一般指向内核的text*段 SHD 表示可共享属性,在arm64上表述为多核之间可共享其页表可见 AF 访问标志,当首次映射页表时,

    20610

    深入理解Linux内核页表映射分页机制原理

    前言 操作系统用于处理内存访问异常的入口操作系统的核心任务是对系统资源的管理,而重中之重的是对CPU和内存的管理。...对于物理地址空间,物理内存被抽象成固定大小的单元,每个单元称为页帧(frame)。通过分页管理内存可以避免分段带来的内存外碎片问题。分页管理内存的核心问题是虚拟地址页到物理地址页帧的映射关系。...1.5 多级页表的缺点 多级页表带来了好处,降低了操作系统进程管理,内存管理对内存空间的占用。当然计算机领域总是没有那么完美的方案,多级分页也逃避不了这个宿命,获得了空间的优势,也带来时间上的损失。...3.2 ARMv7 4KB Paging页表长啥样? ARMv7 4KB分页机制采用二级页表管理,其一级页表属性如下图所示。...ARMv7页表属性的定义分为Linux版本的页表和ARMv7硬件的页表。 Linux版本的PTE页表属性定义加入前缀L_,如下所示: /* * "Linux" PTE definitions.

    3.7K11

    【Linux 内核 内存管理】物理页释放 ( 物理页释放 __free_pages 函数 )

    文章目录 一、物理页释放 __free_pages 函数 一、物理页释放 __free_pages 函数 ---- 页分配器 提供了 释放 物理页的 函数 __free_pages , 该函数定义在 Linux...内核源码的 linux-4.12\mm\page_alloc.c#4083 位置 ; __free_pages 函数参数分析 : struct page *page 参数 表示 要释放的 物理页 page...的 虚拟空间地址 ; unsigned int order 参数 表示 要释放的 物理页 的 " 阶数 " , 也就是 要释放的物理页大小 ; 阶 ( Order ) : 物理页 的 数量单位 ,...n 阶页块 指的是 2^n 个 连续的 " 物理页 " ; 参考 【Linux 内核 内存管理】伙伴分配器 ① ( 伙伴分配器引入 | 页块、阶 | 伙伴 ) __free_pages 函数源码...order == 0) free_hot_cold_page(page, false); else __free_pages_ok(page, order); } } 源码路径 : linux

    12.7K20

    Linux从头学16:操作系统-如何把【页目录和页表】当做普通物理页进行操作的?

    对页表进行"自操作" 在 x86 系统中,内存管理中的分页机制是非常重要的,在Linux操作系统相关的各种书籍中,这部分内容也是重笔浓彩。...如果你看过 Linux 内核相关书籍,一定对下面这张图又熟悉、又恐惧: 这是 Linux 系统中,页处理单元的多级页表查询方式。...文章链接在此:Linux从头学15:【页目录和页表】-理论 + 实例 + 图文的最完全、最接地气详解!,但是其中有一个环节被特意忽略过去了。...那就是:在操作系统构造页目录和页表的时候,如何对它们自身进行寻址和操作? 这部分内容,也是内存管理中比较复杂的地方,就好比一名医生给病人做手术,但是病人却是“医生自己”。...详细的讨论过程,请参考上一篇文章:Linux从头学15:【页目录和页表】-理论 + 实例 + 图文的最完全、最接地气详解!。

    1.7K20

    多级页表的好处

    ,如果只使用了一个页表,一个表项的大小为4byte,32位系统有4GB的物理空间(一个进程看到是4GB大小的虚拟空间),每一个表项对应着物理空间的第xxx页(4KB大小的页),那么应该有4GB/4KB=...如果是二级页表,规则就会改变,让二级页表对应到物理内存上的4KB大小的页,一级页表此时变成映射为物理地址的4MB(这样子是无法定位到具体的页(4KB)的,所以二级页表再去找),这样先找到一级页表,一级页表再和二级页表进行结合...,二级页表相当于一级页表4MB分成了1024个(1KB个)4KB,找完后二级页表充当了offset的角色,此时定位到具体的4KB的页面,再用一级页表的offset一结合定位到具体物理地址。...这样一个进程浪费掉的空间是一级页表占用的:(4GB/4MB)*4byte=4KB,二级页表浪费掉的是1kb(1个一级页表占用这么多)*1kb(此时有1kb(4GB/4MB)个一级页表)=4MB,加起来是...4MB+4KB,比光用一级页表要多4KB,但是2级页表是可以不存在的,比如此时程序只用了%20的页,那么4MB就需要乘以%20,这样一下子就比只有一级页表时少了。

    1.7K30

    页式存储管理

    一个进程的逻辑地址空间分成若干个大小相等的片,称为页面或页,并为各页加以编号,从0开始,如第0页、第1页等。把内存空间分成与页面相同大小的若干个存储块,称为(物理)块或页框,同样进行编号。...在为进程分配内存时,以块为单位将进程中的若干个页分别装入到多个可以不相邻接的物理块中。 为了标识中哪些块空闲,哪些块占用,可用一张位示图指示。位示图是由若干主存单元构成,如图4-1所示。...---- 首先我们构造页面类,代码如下: package 页式存储; public class Page { private int PageNumber;...System.out.print(this.PageNumber+" "+this.BlockNumber); } } 之后进行设计位示图算法,代码如下: package 页式存储

    90910

    DPDK巨页地址管理Linux内核内存管理内存映射pagemaprdma内存注册

    DPDK巨页地址管理/Linux内核内存管理/内存映射/pagemap/rdma内存/注册术语PFN: 物理地址对应的页帧号:pfn = pte_pfn(*pte)INFINIBAND_USER_MEM...总共 8 GB(4096个SD * 2MB = 8GB) 专用内存地址空间是使用完全填充的段描述符表导出的,该表指向保存 2M PD 的 4096 个 4KB 主机页。...请阅读有关大页的 Linux 内核文档,以获取有关如何保留大页的更多信息。...mp.weixin.qq.com/s/OJJE-Up-U0C9uGHRCEuz6wlinux pagemap 是内核中的一组新接口(自 2.6.25 起),允许用户空间程序通过读取“/proc”中的文件来检查页表和相关信息检查进程页表.../man-pages/man2/mmap.2.htmldpdk内存管理/原理/大页管理及申请/使用: https://blog.csdn.net/qq_20679687/article/details/

    88110

    【进程 进程表】页表通常存在PCB中

    通俗解释进程-科学家做蛋糕 科学家做蛋糕 然后女儿被蜜蜂蛰了 进程表–在内核 内存管理 经典 老式 管理方法: 基址寄存器(程序开始的地方) + 界限寄存器(程序长度) 空闲内存管理...空闲内存管理 分页 书一样 分成大小固定的页面----------页框 什么是分页存储 将内存空间分为一个个大小相等的分区(比如:每个分区4KB),每个分区就是一个“页框”(页框=页帧=内存块=物理块...每个页框有一个编号,即“页框号”(页框号=页帧号=内存块号=物理块号=物理页号),页框号从0开始 将进程的逻辑地址空间也分为与页框大小相等的一个个部分,每个部分称为一个“页”或“页面”。...重要的数据结构——页表 为了能知道进程的每个页面在内存中存放的位置,操作系统要为每个进程建立一张页表。...注:页表通常存在PCB中 一个进程对应一张页表 进程的每个页面对应一个页表项 每个页表项由“页号”和“块号”组成 页表记录进程页面和实际存放的内存块之间的映射关系

    1.6K20

    扫码

    添加站长 进交流群

    领取专属 10元无门槛券

    手把手带您无忧上云

    扫码加入开发者社群

    相关资讯

    热门标签

    活动推荐

      运营活动

      活动名称
      广告关闭
      领券