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

Linux 是否对页目录和页表使用自映射?

Linux 在某些情况下会对页目录和页表使用自映射,以下是具体说明:

  • x86 架构
    • 内核空间自映射:在 x86_64 架构下,Linux 内核会将物理内存的一部分直接映射到内核空间的虚拟地址上,这其中就可能涉及页目录和页表的自映射。例如,在 4 级分页下,线性地址空间布局中存在从物理内存到虚拟内存的直接映射区域,用于内核访问物理内存等操作。
    • 临时自映射:在系统启动初期,为了建立起初步的页表映射以便开启分页机制等操作,会设置临时的页表映射,可能包括页目录和页表的自映射。比如在将物理地址的 0 - 8m 映射到虚拟地址的 0 - 8m 以及 768m - 768m + 8m 时,就需要对页目录项进行特定的设置来实现这种映射,这可以看作一种自映射的应用。
  • ARM 架构
    • 早期初始化阶段:在 ARM 架构的 Linux 系统早期启动时,采用段映射等方式建立页表。在这个过程中,对于要映射的某块物理内存,指定其映射的虚拟地址,由于页表和代码起始段在同一个 1M 的空间内,所以页表地址也会被映射,这也可以理解为一种自映射的形式。

自映射的作用主要包括方便内核访问页目录和页表,提高地址转换效率,减少页表切换带来的开销等。并且在系统启动和内存管理初始化过程中,自映射有助于建立起初始的内存映射关系,为后续更复杂的内存管理和进程调度等操作奠定基础。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

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

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

1.7K20

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

前言 操作系统用于处理内存访问异常的入口操作系统的核心任务是对系统资源的管理,而重中之重的是对CPU和内存的管理。...大页表的好处: 省内存:可以解决分页机制占用内存的问题,取得和多级页表一样节省内存的效果; 对TLB友好:大页表意味着地址转换时需要更少的页表映射表项,页表映射表项少了意味着TLB缓存的表项少,这样就提高了...页表映射过程是MMU通过TTBRx和虚拟地址VA[31:20]索引到PGD一级页表,再由PGD一级页表和虚拟地址VA[19:12]索引到PTE页映射表,在由PTE页映射表和虚拟地址VA[11:0]索引到物理地址...而Linux有一个三层的页表结构,可以很容易地将其包装成适合两层的页表结构—只使用PGD和PTE。但是,Linux还要求每个页面有一个“PTE”表,而且至少要有一个“dirty”位。...当使用64KB页大小时,ARMv8使用三级页表;当使用4KB和16KB页大小时,ARMv8使用四级页表。正如下图所示。

3.7K11
  • Linux从头学15:【页目录和页表】-理论 + 实例 + 图文的最完全、最接地气详解

    目录 页表的拆分过程 页目录结构 几个相关的寄存器 加载用户程序时: 页目录、页表的分配和填充过程 线性地址到物理地址的查找、计算实例 在x86系统中,为了能够更加充分、灵活的使用物理内存,把物理内存按照...在 32 位系统中,它使用了多达4MB的物理内存空间(每个表项4个字节,一共有4G/4K个表项)。 为了解决这个问题,x86处理器使用了两级转换:页目录和页表。...表示这个物理页中的数据是否被写过; 页目录 现在,每一个物理页,都被一个页表中的一个表项来指向了,那么这1024个页表的地址,应该怎么来管理呢? 答案是:页目录表!...这个寄存器中,保存了当前正在执行的那个任务的页目录地址。 每个任务(程序)都有自己的页目录和页表,页目录表的地址被记录在任务的TSS段中。...; 分配一个空闲物理页,用作程序的页目录,页目录的地址会记录在稍后创建的 TSS 段中; 使用虚拟内存中的线性地址,分配一个物理页(4 KB),登记到页目录和页表中; 从硬盘上读取 8 个扇区的数据(每个扇区

    1.5K30

    宋宝华: ARM64 Linux内核页表的块映射

    以典型的4K页和48位虚拟地址为例,整个内核空间的虚拟地址分布如下: ?...我们看看这种情况下的页表,我们既可以用最终的【20:12】对应的PTE映射项,以4K为单位,进行虚拟地址到物理地址的映射;又可以以【29:21】对应的PMD映射项,以2M为单位,进行虚拟地址到物理地址的映射...我们把它们全部选中,这样我们可以得到一个debugfs接口: /sys/kernel/debug/kernel_page_tables 来获知内核态页表的情况。...如果我把这个kernel启动选项去掉,我得到的内核页表是完全不一样,线性映射区也全部是PTE映射: ?...最后,值得一提的是,不仅线性映射区可以使用PMD映射,vmemmap映射区也是在4K页面情况下,默认用PMD映射的: ?

    3.6K10

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

    页表的一些术语 现在Linux内核中支持四级页表的映射,我们先看下内核中关于页表的一些术语: 全局目录项,PGD(Page Global Directory) 上级目录项,PUD(Page Upper...例子1 内核页表的映射 前面我们介绍了很多关于内核的宏,函数,下面我们通过实际的例子学习如何使用这些宏 系统初始化时需要把kernel image区域和线性映射区建立页表映射,这个时候依次调用start_kernel...(3) 首先检查映射类型的prot_l1字段是否为0。prot_l1表示第一级页表(Level 1 Page Table)的保护位。如果prot_l1为0,表示无法使用页面进行映射。...增加mm_struct中匿名页的统计计数 对这个新页进行反向映射,主要工作是:设置此页的_mapcount = 0,说明此页正在使用,但是是非共享的(>0是共享)。...ARM32页表和Linux页表那些奇葩的地方 ARM32硬件页表中PGD页目录项PGD是从20位开始的,但是为何头文件定义是从21位开始?

    38110

    Linux内存寻址之分段机制及分页机制【转】

    第31~12位是20位物理页面地址,除第6位外第0~5位及9~11位的用途和页目录项一样,第6位是页面项独有的,当对涉及的页面进行写操作时,D位被置1。...对于没有启用物理地址扩展的32位系统,两级页表已经足够了。从本质上说Linux通过使“页上级目录”位和“页中间目录”位全为0,彻底取消了页上级目录和页中间目录字段。...不过,页上级目录和页中间目录在指针序列中的位置被保留,以便同样的代码在32位系统和64位系统下都能使用。...内核为页上级目录和页中间目录保留了一个位置,这是通过把它们的页目录项数设置为1,并把这两个目录项映射到页全局目录的一个合适的目录项而实现的。 启用了物理地址扩展的32 位系统使用了三级页表。...Linux的页全局目录对应80×86 的页目录指针表(PDPT),取消了页上级目录,页中间目录对应80×86的页目录,Linux的页表对应80×86的页表。

    3.5K50

    Linux分页机制之概述--Linux内存管理(六)

    1.1 为什么使用多级页表来完成映射 但是为什么要使用多级页表来完成映射呢?...用来将虚拟地址映射到物理地址的数据结构称为页表, 实现两个地址空间的关联最容易的方式是使用数组, 对虚拟地址空间中的每一页, 都分配一个数组项....第一步, 基于两级转换表(页目录表和页中间表), 最终查找到地址所在的页帧 第二步, 基于偏移, 在所在的页帧中查找到对应偏移的物理地址 使用这种二级页表可以有效的减少每个进程页表所需的RAM的数量....这样线性地址空间就剩下64-12=52位分配给页中间表Table和页目录表Directory....目前的内核的内存管理总是假定使用四级页表, 而不管底层处理器是否如此.

    5.7K20

    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,从而隐藏了页三级目录和页中间目录的存在。...由此管中窥豹,看到了Linux内存分页映射模型的存在和相关设计,暂且也就先了解这么多。 分析宏是一件很乏味的事情,不过以小见大却是一件很有意思的事情。

    1.9K41

    80386的分段机制、分页机制和物理地址的形成

    注:本分类下文章大多整理自《深入分析linux内核源代码》一书,另有参考其他一些资料如《linux内核完全剖析》、《linux c 编程一站式学习》等,只是为了更好地理清系统编程和网络编程中的一些概念性问题...内核不区分数据段和堆栈段,这也体现了Linux 内核尽量减少段的使用。...第4 位是PCD(Page Cache Disable)位,表示是否启用高速缓存,该位为1 表示启用高速缓存。 • 第5 位是访问位,当对页目录项进行访问时,A 位=1。...80386 的每个页目录项指向一个页表,存储在一个4K 字节的页面中,页表最多含有1024 个页面项,每项4 个字节,包含页面的起始地址和有关该页面的信息。...第31~12 位是20 位物理页面地址,除第6 位外第0~5 位及9~11 位的用途和页目录项一样,第6 位是页面项独有的,当对涉及的页面进行写操作时,D 位被置1。

    1.1K30

    80386的分段机制、分页机制和物理地址的形成

    注:本分类下文章大多整理自《深入分析linux内核源代码》一书,另有参考其他一些资料如《linux内核完全剖析》、《linux c 编程一站式学习》等,只是为了更好地理清系统编程和网络编程中的一些概念性问题...内核不区分数据段和堆栈段,这也体现了Linux 内核尽量减少段的使用。...第4 位是PCD(Page Cache Disable)位,表示是否启用高速缓存,该位为1 表示启用高速缓存。 • 第5 位是访问位,当对页目录项进行访问时,A 位=1。...80386 的每个页目录项指向一个页表,存储在一个4K 字节的页面中,页表最多含有1024 个页面项,每项4 个字节,包含页面的起始地址和有关该页面的信息。...第31~12 位是20 位物理页面地址,除第6 位外第0~5 位及9~11 位的用途和页目录项一样,第6 位是页面项独有的,当对涉及的页面进行写操作时,D 位被置1。

    1.3K50

    Linux虚拟存储管理分析

    自Linux诞生以来,发展迅猛,已经受到了全球开源社区和许多商业科技巨头的大力支持以及政府、教育机构、科研单位的重视。...两级表的第一级表称为页目录,存储在一个4K字节的页中,页目录表共有1K个表项,每个表项为4个字节,线性地址最高的10位(22-31位)用来产生第一级表索引,由该索引得到的表项中的内容定位了二级表中的一个表的地址...在创建过程中,每个进程(根据需要)创建并初始化新页目录,设置页目录基地址寄存器,在GDT中添加进程对应的TSS项和LDT项,创建并初始化该进程的LDT。...创建一个进程时页面分配的情况大致是这样的:进程控制块(1页),内存态堆栈(1页),页目录(1页),页表(需要的n页)。在进程以后执行的执行中,再根据需要逐渐分配更多的内存页面。...进程用了一个指向vm_area_struct链表的指针,来描述进程虚拟内存空间的一个区域,包括对该区域的起始和终止地址的描述。

    1.6K20

    ​Linux虚拟内存管理

    Linux操作系统采用了一种称为“分页”的技术来实现虚拟内存。每个进程都有其自己的页表,该页表将虚拟地址映射到物理地址。页的大小通常为4KB,但这可能会根据具体的系统配置有所不同。...二、Linux虚拟内存管理的实现在Linux内核中,虚拟内存的管理主要涉及以下几个部分:页表管理、页面分配与回收、页面置换算法以及内存映射。1....页表管理每个进程都有其自己的页表,这些页表存储在物理内存中,并由内核来管理。当进程需要访问某个虚拟地址时,内核会使用页表来将该虚拟地址映射到物理地址。这个过程称为“地址转换”。...在Linux内核中,页表的实现是非常复杂的。为了方便管理,内核使用了一种称为“页全局目录”(Page Global Directory, PGD)的数据结构来存储页表。...内存映射在Linux中,进程可以通过系统调用(如mmap)来创建新的内存映射。这些映射可以是文件的映射,也可以是匿名映射(即没有对应文件的映射)。映射的创建和管理涉及到虚拟地址空间的分配和页表的更新。

    51200

    深入理解虚拟 物理地址转换,页表--基于ARMV8

    页表转换寄存器描述符 1.1,页表/页目录结构 基于前言中的内核配置,内核采用39位虚拟地址,因此可寻址范围为2^39 = 512G,采用(linux 默认为五级页表,另外还有PUD,P4D,由于本文只配置三级.../页表都有29=512个页目录项/页表项,使用4k页面大小,212 = 4096,因此虚拟地址中offset字段占12位,每一个pte页表项可以映射4k个地址空间,共有512x512x512个pte页表项...,对这些宏控都会有清晰得理解!!...2.3 用户/内核PGD表基地址 基于之前的分析可知,用户虚拟地址和内核虚拟地址转换为物理地址的时候使用不同的页表基地址寄存器(TTBRx),因此他们的转换是基于不同的全局页目录表PGD。...: MMU在转换虚拟地址的时候遵循以下步骤(基于以上配置): 1,如果虚拟地址bit[63:40]都为1,则使用TTBR1作为第一级页目录表基地址,当bit[63:40]都为0时,使用TTBR0作为第一级页目录表基地址

    63500

    页框分配器【转】

    linux采用四级分页模型,这四种页表是:页全局目录(PGD)、页上级目录(PUD)、页中间目录(PMD)、页表(PTE)。这里的所有页全局目录、页上级目录、页中间目录、页表,它们的大小都是一个页。...linux下各个硬件上并不一定都是使用四级目录的,当使用于没有启动物理地址扩展(PAE)的32位系统上时,只使用二级页表,linux会把页上级目录和页中间目录置空。...而在启用了物理地址扩展的32位系统上时,linux使用的是三级页表,页上级目录被置空。而在64位系统上,linux根据硬件的情况会选择三级页表或者四级页表。...实际上,只有进程使用到的情况下系统才会分配给进程一条路径,比如我们要求访问一个线性地址,但是这个地址可能对应的页上级目录、页中间目录、页表和页都不存在的,这时系统会产生一个缺页异常,在缺页异常处理中再给进程的这个线性地址分配页上级目录...、页中间目录、页表和页所需的物理页框。

    71120

    一文聊透 Linux 缺页异常的处理 —— 图解 Page Faults

    mmap 映射的虚拟内存相关的各级页目录和页表项还都是空的。...虚拟内存之前被映射过,其在进程页表的各级页目录以及页表中均有对应的页目录项和页表项,但是其对应的物理内存被内核 swap out 到磁盘上了。...在内核中使用 pgd_offset 函数来定位虚拟内存地址在全局页目录表 PGD 中对应的页目录项 pgd_t,这个过程和访问数组一模一样,事实上整个 PGD 就是一个 pgd_t[PTRS_PER_PGD...笔者在之前的文章《一步一图带你构建 Linux 页表体系》 中介绍了页表项 pte 的比特位布局如下图所示: image.png 其中 pte 的第 0 个比特位表示该 pte 映射的物理内存页是否在内存中...image.png 比如,我们使用 mmap 进行私有文件映射之后,此时只是分配了虚拟内存,进程页表或者相关 pte 还是空的,这时对这块映射的虚拟内存进行访问的时候就会触发缺页中断,最后在之前介绍的

    3.7K22

    Linux分页机制之分页机制的实现详解--Linux内存管理(八)

    1 linux的分页机制 1.1 四级分页机制 前面我们提到Linux内核仅使用了较少的分段机制,但是却对分页机制的依赖性很强,其使用一种适合32位和64位结构的通用分页模型,该模型使用四级分页机制,即...对于没有启用物理地址扩展的32位系统,两级页表已经足够了。从本质上说Linux通过使“页上级目录”位和“页中间目录”位全为0,彻底取消了页上级目录和页中间目录字段。...内核为页上级目录和页中间目录保留了一个位置,这是通过把它们的页目录项数设置为1,并把这两个目录项映射到页全局目录的一个合适的目录项而实现的。 启用了物理地址扩展的32 位系统使用了三级页表。...2 linux中页表处理数据结构 2.1 页表类型定义pgd_t、pmd_t、pud_t和pte_t Linux分别采用pgd_t、pmd_t、pud_t和pte_t四种数据结构来表示页全局目录项、页上级目录项...如果页表被保存在高端存储器中,那么内核建立一个临时内核映射,并用 pte_unmap 对它进行释放。

    3.5K42

    操作系统内存换入-请求调页---14

    –13 此时并没有把子进程申请的页表对应的物理页面和用户进程的线性地址空间进行映射。...某一个物理页面和进程的线性地址空间映射是指,将这个页面的物理地址存入该进程线性地址空间所对应的页表的某个页表项当中,这样进程才有权限对该页面进行访问。...之所以说,并没有把页表对应的页面和用户进程的线性地址空间进行映射,是因为并没有把页表对应的物理地址放入这个页表的某个页表项当中。...总之,用户进程只能访问其线性地址空间所对应的页表(前10位找到页目录项,页目录项中的内容就是该线性地址所对应的页表的物理地址),中的页表项所指向的物理内存页面。...而不能访问内核管理进程所使用的页表本身,也就是用户进程读写不了页表的页表项,但可以读写页表项中指向的物理页面。

    67620

    Linux分页机制之分页机制的演变--Linux内存管理(七)

    分页机制解决了上面分段方法所存在的一个内存使用效率问题;其核心思想是系统为程序执行文件中的第x页分配了内存中的第y页,同时y页会添加到进程虚拟空间地址的映射表中(页表),这样程序就可以通过映射访问到内存页...因为PDPT存放在RAM的前4GB中, 并在32字节(2^5)的倍数上对其, 因此27位足以表示这种表的基地址 当把线性地址映射到4KB的页时(页目录项中的PS标准清0), 32位线性地址将按照如下方式解释...如果我们决定为两个字段个预留18位,那么每个进程的页目录和页表都含有2^18个项,即超过256000个项。 由于这个原因,所有64位处理器的硬件分页系统都使用了额外的分页级别。...第9~11位由操作系统专用,Linux也没有做特殊之用。 ? 80386的每个页目录项指向一个页表,页表最多含有1024个页面项,每项4个字节,包含页面的起始地址和有关该页面的信息。...第31~12位是20位物理页面地址,除第6位外第0~5位及9~11位的用途和页目录项一样,第6位是页面项独有的,当对涉及的页面进行写操作时,D位被置1. 4GB的内存只有一个页目录,它最多有1024个页目录项

    2K20

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

    1)地址转换 将虚拟地址转换为物理地址 2)权限管理 管理cpu对物理页的访问,如读写执行权限 3)隔离地址空间 隔离各个进程的地址空间,使其互不影响,提供系统的安全性 打开mmu后,对没有页表映射的虚拟内存访问或者有页表映射但是没有访问权限都会发生处理器异常...,而对使用虚拟地址的用户进程来说是透明的;通过页表,很容易实现内存共享,使得一份共享库很多进程都可以映射到自己地址空间使用;通过页表,可以小内存加载大应用程序运行,在运行时按需加载和映射... 3.页表的存放在哪...Linux内核为何使用多级页表?...页表填写/切换时机 1)内核页表填充 内核初始化过程: 物理地址 -> 恒等映射(建立恒等映射页表和粗粒度内核页表) ->打开mmu -> paging_init(建立细粒度的内核页表和内存线性映射...12.页表遍历过程 下面以arm64处理器架构多级页表遍历作为结束(使用4级页表,页大小为4K): Linux内核中 可以将页表扩展到5级,分别是页全局目录(Page Global Directory,

    1.9K22

    万字整理,肝翻Linux内存管理所有知识点

    (当页表内容有变化的时候,需要清除TLB,以防止地址映射出错。)...我们知道linux采用了分页机制,通常采用四级页表,页全局目录(PGD),页上级目录(PUD),页中间目录(PMD),页表(PTE)。...第三次读取内存得到pmd_t结构的目录项,从中取出页表的物理基地址。 从线性地址的第四部分中取出页表项的索引,与页表基址相加得到页表项的物理地址。...Linux页框分配器之内存碎片化整理 什么是内存碎片化 Linux物理内存碎片化包括两种:内部碎片化和外部碎片化。 内部碎片化: 指分配给用户的内存空间中未被使用的部分。...换入的过程如下: 查找swap cache中是否存在所查找的页面,如果存在,则根据swap cache引用的内存页,重新映射并更新页表;如果不存在,则分配新的内存页,并添加到swap cache的引用中

    1.8K14
    领券