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

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

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

1.8K10

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

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

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

    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个页面 简单理解,其实单级页表就是用长宽高之积来描述长方体,而三级页表就是用长、宽、高三个坐标来描述长方体,这样做的目的就是大大节省了加载页表所需要的空间...至此,有关于页表与三级页表的介绍就到这里了,页表的存在对于内核区与用户区加载代码起了至关重要的作用,真正理解页表的转换机制有助于我们对操作系统的虚拟内存有更深刻的认识

    24210

    文件、目录_文件目录表

    OPEN :将文件属性和磁盘地址表载入主存,便于以后系统调用的快速存取。 CLOSE: 关闭文件以释放内部表空间。 READ:从文件中读取数据。一般,读出的数据来自当前位置。...CLOSEDIR:关闭该目录以释放内部表空间。 READDIR:返回打开目录的下一个目录项。 RENAME:更改目录名。 LINK:链接技术允许文件出现在多个目录中。...多数磁盘可以划分为一个或多个分区,该表给出了每个分区的起点和重点地址。...不会因为磁盘碎片而浪费存储空间 缺点:指针占用块空间;顺序读取文件非常方便,但是随机存取相当缓慢 将文件保存为磁盘块的链表 目录项:文件名+起始块号+长度 使用内存表的链表分配 链表分配使用内存中的一个文件分配表...i-节点 记录各个文件分别包含哪些磁盘块的方法是给每个文件赋予一张称为i-节点的小表,其中列出了文件属性和文件中各块在磁盘上的地址 目录项:文件名+I节点号 UNIX V7文件系统 UNIX

    2.3K20

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

    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

    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

    内核页表调试

    一、配置内核 首先配置内核,使其支持导出内核页表到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

    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

    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

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

    五级分页每级命名分别为页全局目录(PGD)、页4级目录(P4D)、页上级目录(PUD)、页中间目录(PMD)、页表(PTE)。...进程地址空间切换实质就是将TTBR0寄存器中Translation Table Base 0 Address修改为当前进程的PGD(页全局目录)。一级页表数量为4096,二级页表数量为256。...而Linux有一个三层的页表结构,可以很容易地将其包装成适合两层的页表结构—只使用PGD和PTE。但是,Linux还要求每个页面有一个“PTE”表,而且至少要有一个“dirty”位。...ARMv7页表属性的定义分为Linux版本的页表和ARMv7硬件的页表。 Linux版本的PTE页表属性定义加入前缀L_,如下所示: /* * "Linux" PTE definitions....通过对比Linux版本的页表和ARMv7硬件的页表会发现,ARMv7硬件的页表缺少“dirty”位和“young”位。

    3.7K11

    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

    【Linux 内核】Linux 内核源码目录说明 ① ( arch 目录 | block 目录 | certs 目录 | crypto 目录 | Documentation 目录 )

    文章目录 一、arch 目录 二、block 目录 三、certs 目录 四、crypto 目录 五、Documentation 目录 在上一篇博客 【Linux 内核】Linux 内核源码结构 ( 下载...Linux 内核源码 | 使用 VSCode 阅读 Linux 内核源码 ) 中 , 使用了 Visual Studio Code 查看 Linux 内核源码 , 本篇博客开始分析 Linux 内核源码结构...; 一、arch 目录 ---- arch 目录是 针对 不同 CPU 体系架构平台 的代码 , 将 与 平台 相关的代码 放在该目录中 , 如某些代码只针对 x86 架构的平台 , 那么放在 arch.../x86 目录下 ; 每种体系结构 , 都有 相应的子目录 , 如 arm , arm64 分别是 arm 32 位和 64 位平台 ; 二、block 目录 ---- block 目录 , 是子系统目录..., 其中存储了 块设备驱动 相关代码 ; 三、certs 目录 ---- certs 目录中存储了 认证 和 签名 相关代码 ; 四、crypto 目录 ---- crypto 目录中存储了 内核中常用的

    12.3K30

    【Linux 内核】Linux 内核源码目录说明 ② ( drivers 目录 | fs 目录 | include 目录 | init 目录 | ipc 目录 | kernel 目录 )

    文章目录 一、drivers 目录 二、fs 目录 三、include 目录 四、init 目录 五、ipc 目录 六、kernel 目录 一、drivers 目录 ---- drivers 目录中存储了...驱动程序 相关代码 , 如 USB 总线驱动程序 , PCI 总线驱动程序 , 显卡驱动程序 , 网卡驱动程序 等 ; 二、fs 目录 ---- fs 目录中存储了 虚拟文件系统 ( Virtual...目录 ---- include 目录中存储了 内核源码 依赖 的 大部分头文件 代码 ; include 目录中存储了 虚拟文件系统 ( Virtual File System ) 相关代码 ; 四、...init 目录 ---- init 目录中存储了 Linux 内核的初始化 相关代码 ; 该 初始化代码 关联到了 内存的各个组件 的入口 ; 五、ipc 目录 ---- ipc 目录中存储了 进程间通信...相关代码 ; 如 : 信号量 , 共享内存 等 ; 六、kernel 目录 ---- kernel 目录中存储了 内核核心代码 ; 其中包含了 进程管理 , IRQ 中断 等模块 ;

    12.4K20

    多级页表的好处

    ,如果只使用了一个页表,一个表项的大小为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 内核】Linux 内核源码目录说明 ③ ( lib 目录 | LICENSES 目录 | mm 目录 | net 目录 | samples 目录 | scripts 目录 )

    文章目录 一、lib 目录 二、LICENSES 目录 三、mm 目录 四、net 目录 五、samples 目录 六、scripts 目录 一、lib 目录 ---- lib 目录中存储了 C 语言标准库的子集...相关代码 ; 二、LICENSES 目录 ---- LICENSES 目录中存储了 开源许可协议 相关协议文本 ; 该目录拿下都是文本文件 ; 三、mm 目录 ---- mm 目录中存储了 内存管理...( Memory Management ) 相关代码 ; 四、net 目录 ---- net 目录中存储了 网络协议 相关代码 ; 如 : TCP , WIFI , IPV4 , IPV6 等 ;...五、samples 目录 ---- samples 目录中存储了 Linux 内核参考示例代码 ; 六、scripts 目录 ---- scripts 目录中存储了 内核 编译 配置 相关脚本 ;

    9.8K40
    领券