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

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

对页表进行"自操作" 在 x86 系统中,内存管理中的分页机制是非常重要的,在Linux操作系统相关的各种书籍中,这部分内容也是重笔浓彩。...如果你看过 Linux 内核相关书籍,一定对下面这张图又熟悉、又恐惧: 这是 Linux 系统中,页处理单元的多级页表查询方式。...其中黄色背景部分:页上级目录索引 和 页中间目录索引,是 Linux 系统自己扩展的,在原本的 x86 处理器中是不存在的,这也是导致 Linux 中相关部分代码更加复杂的原因。...文章链接在此:Linux从头学15:【页目录和页表】-理论 + 实例 + 图文的最完全、最接地气详解!,但是其中有一个环节被特意忽略过去了。...详细的讨论过程,请参考上一篇文章:Linux从头学15:【页目录和页表】-理论 + 实例 + 图文的最完全、最接地气详解!。

1.7K20

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

内核知识第八讲,PDE,PTE,页目录表,页表的内存管理 一丶查看GDT表....首先我们的CR3寄存器保存了表的首地址. 这里有一个页目录表,还有页表的关键词. 页目录表: 也称为PDE,而页表称之为PTE....CPU会通过虚拟地址,当作下表.去页目录表中查询.然后查到的结果再去页表中查询.这样就查到对应的物理地址了....PDE表的大小:   页目录表,存储在一个4K字节的物理页中,其中每一项是4个字节.保存了页表的地址.   而最大是1M个页. PTE表的大小.   PTE的大小也和PDE一样的....但是通过两个表查询.可以映射4G内存.而上面的设计方法不行. 首先前边20位保存了页表或者物理地址的基地址. 比如我们的页目录表. 查到了第5项.那么从中取出千20位来,加上000就等于页表了.

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

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

    作 者:道哥,10+年嵌入式开发老兵,专注于:C/C++、嵌入式、Linux。...关注下方公众号,回复【书籍】,获取 Linux、嵌入式领域经典书籍;回复【PDF】,获取所有原创文章( PDF 格式)。...目录 页表的拆分过程 页目录结构 几个相关的寄存器 加载用户程序时: 页目录、页表的分配和填充过程 线性地址到物理地址的查找、计算实例 在x86系统中,为了能够更加充分、灵活的使用物理内存,把物理内存按照...表示这个物理页中的数据是否被写过; 页目录 现在,每一个物理页,都被一个页表中的一个表项来指向了,那么这1024个页表的地址,应该怎么来管理呢? 答案是:页目录表!...这个寄存器中,保存了当前正在执行的那个任务的页目录地址。 每个任务(程序)都有自己的页目录和页表,页目录表的地址被记录在任务的TSS段中。

    1.5K30

    页表与三级页表介绍

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

    24510

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

    Physical Address HVA:Host Virtual Address GPA:Guest Physical Address GVA:Guest Virtual Address PDBR:页目录表物理基地址寄存器...二.影子页表 (Shadow page table) 影子页表我用一句话来描述就是:VMM把Guest和Host中的页表合并成一个页表,称为影子页表,来实现GVA->HPA映射。...4, 把GVA -> HPA,这一路的映射关系记录到页表中,这个页表就是影子页表。...具体过程 当Guest中进程访问GVA时,CPU首先就要通过PDBR寄存器去找页目录,但是PDBR中存储的地址是GPA,所以要到EPT中进行GPA->HPA的转换,这个转换过程和物理MMU的工作流程相同...找到了页目录的HPA基地址,再通过GVA中的Directory offset段,就找到页表的VGA了,这个页表VGA再去EPT中进行GPA->HPA的转换,就找到页表VGA的HPA了。

    2.4K20

    内核页表调试

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

    20610

    Linux 标准大页和透明大页

    Huge pages ( 标准大页 ) 和 Transparent Huge pages( 透明大页 ) 在 Linux 中大页分为两种:Huge pages ( 标准大页 ) 和 Transparent...内存是以块即页的方式进行管理的,当前大部分系统默认的页大小为 4096 bytes 即 4K。1MB 内存等于 256 页;1GB 内存等于 256000 页。...CPU 拥有内置的内存管理单元,包含这些页面的列表,每个页面通过页表条目引用。当内存越来越大的时候, CPU 需要管理这些内存页的成本也就越高,这样会对操作系统的性能产生影响。...Huge Pages Huge pages 是从 Linux Kernel 2.6 后被引入的,目的是通过使用大页内存来取代传统的 4kb 内存页面, 以适应越来越大的系统内存,让操作系统可以支持现代硬件架构的大页面容量功能...Transparent Huge Pages Transparent Huge Pages 缩写 THP ,这个是 RHEL 6 开始引入的一个功能,在 Linux6 上透明大页是默认启用的。

    5.8K50

    Thymeleaf目录页原理 发布于

    简介 为Halo搭建的博客配上如同《新华字典》那样的目录是一个不错的主意,不仅能让分类更加清晰,还能帮助读者更轻松地查找和理解文章的内容。...在这篇文章中,《Thymeleaf目录页原理》将深入探讨如何实现这种目录结构的设计,从基本原理开始,逐步深入到实际操作。...问题背景 在给定如下的关于CategoryVo和PostVo的方法和关系中,选择最为合适的算法与方案来实现一个文章分类目录表。...category.status.visiblePostCount > 0}" 这里的th:each是由Thymeleaf提供的一种For循环标签(可以对比到Vue中的v-for) 第二层for循环,用来处理目录列分页...postFinder.listByCategory(i + 1, site.post.postPageSize, category.metadata.name)}这个方法获取了category.metadata.name分类中第{i + 1}页的

    31710

    多级页表的好处

    ,如果只使用了一个页表,一个表项的大小为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

    Linux:页表中PGD、PUD、PMD等概念介绍

    1、PGD: Page Global Directory Linux系统中每个进程对应用户空间的pgd是不一样的,但是linux内核 的pgd是一样的。...当创建一个新的进程时,都要为新进程创建一个新的页面目录PGD,并从内核的页面目录swapper_pg_dir中复制内核区间页面目录项至新建进程页面目录PGD的相应位置,具体过程如下:do_fork()...可以看出Linux系统中每个进程的页面目录的第二部分是相同的,所以从进程的角度来看,每个进程有4G字节的虚拟空间,较低的3G字节是自己的用户空间,最高的1G字节则为与所有进程以及内核共享的系统空间。...每个进程有它自己的PGD( Page Global Directory),它是一个物理页,并包含一个pgd_t数组。...每一个页表项指向一个页框,页框就是真正的物理内存页。

    3.6K30

    ARM32 页表映射

    在32bit中的Linux内核中一般采用3层映射模型,第1层是页面目录(PGD),第2层是页面中间目录(PMD),第3层才是页面映射表(PTE)。...我们从ARM linux内核建立具体内存区间的页表映射过程中来看页表映射是如何实现的。...,注意ARM Linux中实现了两份页表,硬件页表的地址r0+2048。...该函数的主要目的是根据Linux版本的页面表项内容来填充ARM硬件版本的页表项; 首先把linux内核版本的页表项内容写入linux版本的页表中,然后根据mem_type数据结构prot_pte的标志位来设置...linux内核最早基于x86体系结构设计的,所以linux内核关于页表的许多术语和设计都是针对x86体系的,而ARM Linux只能从软件架构上去跟随了,因此设计了两套页表。

    2.9K30

    linux中透明巨页与巨页的区别

    在Linux中,透明巨页(Transparent HugePage)和巨页(HugePage)是两种不同的内存管理技术。 透明巨页是Linux内核中的一项特性,旨在提高内存的利用率和性能。...它通过将内存分配为更大的巨页(通常为2MB或1GB),减少了对内存页表的访问次数,从而提高了内存访问的效率。透明巨页是透明的,应用程序无需进行任何修改即可受益于这种内存管理技术。...而巨页是指一种更大尺寸的内存页,在Linux中可以使用不同的页面大小,常见的巨页大小是2MB或1GB。...巨页可以提供更高的内存访问性能,因为它减少了页表的数量,降低了TLB(Translation Lookaside Buffer)缓存的压力,从而减少了内存访问的开销。...巨页需要应用程序进行适当的修改和配置才能使用。 因此,透明巨页和巨页都是通过增加内存页的尺寸来提高内存访问性能,但透明巨页不需要应用程序的修改,而巨页需要应用程序的支持和配置。

    43910

    Linux 透明大页 THP 和标准大页 HP

    CPU 拥有内置的内存管理单元,包含这些页面的列表,每个页面通过页表条目引用。当内存越来越大的时候,CPU 需要管理这些内存页的成本也就越高,这样会对操作系统的性能产生影响。...透明大页存在的问题: Oracle Linux team 在测试的过程中发现,如果 linux 开启透明大页 THP,则 I/O 读写性能降低 30%;如果关闭透明大页 THP,I/O 读写性能则恢复正常...3、由于页表数量的减少,使得 CPU 中的 TLB(可理解为CPU对页表的CACHE)的命中率大大提高。...4、针对 HugePages 的页表,在各进程之间可以共享,也降低了 PageTables 的大小。实际上这里可以反映出 Linux 在分页处理机制上的缺陷。...而其他操作系统,比如 AIX,对于共享内存段这样的内存,进程共享相同的页表,避免了 Linux 的这种问题。 5、提高 Oracle 性能,减少 SGA 的页交换。

    3.1K20

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

    ,而页表管理是在虚拟内存管理中尤为重要,本文主要以回答几个页表管理中关键性问题来解析Linux内核页表管理,看一看页表管理中那些鲜为人知的秘密。...Linux内核为何使用多级页表?...2)Linux内核 填写页表,将页表基地址告诉mmu 内核初始化建立内核页表,实现缺页异常等机制为用户任务按需分配并映射页表。 当然,内核也可以遍历页表,如缺页异常时遍历进程页表。 10....12.页表遍历过程 下面以arm64处理器架构多级页表遍历作为结束(使用4级页表,页大小为4K): Linux内核中 可以将页表扩展到5级,分别是页全局目录(Page Global Directory,...PGD), 页4级目录(Page 4th Directory, P4D), 页上级目录(Page Upper Directory, PUD),页中间目录(Page Middle Directory

    1.9K22

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

    ,是从页表缓冲空间中申请还是通过memblock算法申请页表内存。...回到page_table_range_init(),其中one_md_table_init()是用于当pgd入参为空时,申请新物理页作为页中间目录的,但是此次仅分析x86非PAE环境的情况,不存在页中间目录...,创建页表并使其指向被创建的页表。...,如果是,则把其pte页表的内容拷贝到page_table_range_init()申请的页表空间中,并将newpte新页表的地址设置到pmd中(32bit系统实际上就是页全局目录),然后调用__flush_tlb_all...为了避免前期可能对固定映射区已经分配了页表项,基于临时内核映射区间要求页表连续性的保证,所以在此重新申请连续的页表空间将原页表内容拷贝至此。

    1.6K11
    领券