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

与三级介绍

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

12510

多级好处

,如果只使用了一个,一个表项大小为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内核管理,看一看管理中那些鲜为人知秘密。...存放在物理内存中,打开mmu之后,如果需要修改,需要将所在物理地址映射到虚拟地址才能访问(如内核初始化后会将物理内存线性映射,这样通过物理地址和虚拟地址偏移就可以获得物理地址对应虚拟地址...Linux内核为何使用多级?...2)Linux内核 填写,将基地址告诉mmu 内核初始化建立内核,实现缺页异常等机制为用户任务按需分配并映射。 当然,内核也可以遍历,如缺页异常时遍历进程。 10....填写/切换时机 1)内核填充 内核初始化过程: 物理地址 -> 恒等映射(建立恒等映射和粗粒度内核) ->打开mmu -> paging_init(建立细粒度内核和内存线性映射

    1.9K22

    一文看懂影子和扩展

    二.影子 (Shadow page table) 影子我用一句话来描述就是:VMM把Guest和Host中合并成一个,称为影子,来实现GVA->HPA映射。...3, HVA->HPA,这一过程就是我们已知使用物理MMU完成VMM进程虚拟内存到物理内存转换。 4, 把GVA -> HPA,这一路映射关系记录到中,这个就是影子。...虚拟机和影子通过一个哈希建立关联(当然也有其他关联方式),客户机操作系统把当前进程基址载入PDBR时而VMM将会截获这一特权指令,将进程影子基址载入客户机PDBR,使客户机在恢复运行时...Guest运行时,Guest被载入PDBR,而 EPT 被载入专门EPT 指针寄存器 EPTP。...找到了目录HPA基地址,再通过GVA中Directory offset段,就找到VGA了,这个VGA再去EPT中进行GPA->HPA转换,就找到VGAHPA了。

    2.2K20

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

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

    1.6K20

    内核调试

    page映射区,linux内核用page结构体管理所有物理内存,每一大小为PAGE_SIZE对于arm64,可能是4K,16K,64K。...而为了快速方便找到对应物理而将所有的帧结构体映射到此区域,后续只需使用virt_to_page, phys_to_page等宏实现虚拟地址,物理地址到对应结构体快速查询。...地址空间port属性说明 第一列 当前映射范围地址 第二列 代表此映射范围大小 PMD PUD PTE 当标识为PMD PUD表示当前映射为block映射,如当前为4K,则pudblock映射一次性可映射...当标识为PTE表示为映射即PAGE_SIZE大小4K。 USR AP标记,用于标识当前范围是否在用户空间还是内核空间可读可写或者仅读。...x表述当前范围特权级别模式可执行,就是内核可执行代码段,在内核中这段一般指向内核text*段 SHD 表示可共享属性,在arm64上表述为多核之间可共享其可见 AF 访问标志,当首次映射时,

    19610

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

    内核知识第八讲,PDE,PTE,目录,内存管理 一丶查看GDT....首先说一下什么分页历史,和CR0控制寄存器. 在保护模式下, 寄存器CR0高位1表示开启分页.0表示不开启. 而这个在操作系统初始化是否就已经完成了....首先我们CR3寄存器保存了首地址. 这里有一个目录,还有关键词. 目录: 也称为PDE,而称之为PTE....PDE大小:   目录,存储在一个4K字节物理中,其中每一项是4个字节.保存了地址.   而最大是1M个. PTE大小.   PTE大小也和PDE一样....首先前边20位保存了或者物理地址基地址. 比如我们目录. 查到了第5项.那么从中取出千20位来,加上000就等于了.  然后从中查询千20位.

    1.7K10

    宋宝华: ARM64 Linux内核块映射

    我们看看这种情况下,我们既可以用最终【20:12】对应PTE映射项,以4K为单位,进行虚拟地址到物理地址映射;又可以以【29:21】对应PMD映射项,以2M为单位,进行虚拟地址到物理地址映射...当然,如果用户态虚实映射是这样,用户实际得到了一个1GB。但是对于内核线性映射区域而言,即便我们进行了1GBPUD映射,这1G内部就可以进一步切割为4KB或者2MB。...我们把它们全部选中,这样我们可以得到一个debugfs接口: /sys/kernel/debug/kernel_page_tables 来获知内核态情况。...我在内核启动参数加rodata=0实际上是让rodata_full为false。如果我把这个kernel启动选项去掉,我得到内核是完全不一样,线性映射区也全部是PTE映射: ?...牧春童鞋在“Linux阅码场”这里还有一些精彩文章: 宋牧春:Linux设备树文件结构与解析深度分析(1) 宋牧春:Linux设备树文件结构与解析深度分析(2) 宋牧春:多图详解Linux内存分配器

    3.4K10

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

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

    1.9K41

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

    前面已经分析了内核准备工作以及内核低端内存建立,接着回到init_mem_mapping()中,低端内存建立后紧随着还有一个函数early_ioremap_page_table_range_init...page_table_kmap_check(),其入参调用one_page_table_init()是用于当入参pmd没有指向时,创建并使其指向被创建。...= pte); #endif return pte; } 可以看到这里在此出现临时内核映射区间标识(FIX_KMAP_END和FIX_KMAP_BEGIN),检查当前初始化地址是否处于该区间范围...为了避免前期可能对固定映射区已经分配了表项,基于临时内核映射区间要求连续性保证,所以在此重新申请连续空间将原内容拷贝至此。...值得注意是,与低端内存初始化不同是,这里只是被分配,相应PTE项并未初始化,这个工作将会交由以后各个固定映射区部分相关代码调用set_fixmap()来将相关固定映射区与物理内存关联

    1.6K11

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

    Linux对于操作主要定义了以下函数或宏。这些操作方法也是与体系架构相关,因此需要按照体系架构硬件定义去实现。...而Linux有一个三层结构,可以很容易地将其包装成适合两层结构—只使用PGD和PTE。但是,Linux还要求每个页面有一个“PTE”,而且至少要有一个“dirty”位。...因此,在这里稍微调整了实现—告诉Linux在第一级有2048个条目,每个都是8字节。二级包含两个连续排列硬件PTE表项,前面的表项是包含Linux需要状态信息Linux PTE。...ARMv7属性定义分为Linux版本和ARMv7硬件Linux版本PTE属性定义加入前缀L_,如下所示: /* * "Linux" PTE definitions....通过对比Linux版本和ARMv7硬件会发现,ARMv7硬件缺少“dirty”位和“young”位。

    3.6K11

    Linux内核19-中断描述符IDT初始化

    Linux使用中断描述符IDT记录管理所有的中断和异常。那么,首先,Linux内核应该把IDT起始地址写入idtr寄存器,然后初始化所有的表项。这一步在初始化系统时完成。...因为汇编指令int允许用户进程发送任意编号中断(0-255)。为此,IDT初始化必须考虑阻止由用户进程int指令引发非法中断和异常。可以通过将中断描述符DPL域设为0来实现。...一旦Linux启动,IDT会被搬运到RAM受保护区域并被第二次初始化,因为Linux不会使用任何BIOS程序。 IDT结构被存储在idt_table中,包含256项。...完成这次IDT初始化之后,内核还会进行第二次初始化,用真正trap或中断处理函数代替刚才null函数。一旦这两步初始化都完成,IDT就包含具体中断、陷阱和系统门,用以控制每个中断请求。...对于IDT第二次初始化过程,我们将分别以异常和中断视角分开阐述。请参考后面的文章。

    93210

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

    作 者:道哥,10+年嵌入式开发老兵,专注于:C/C++、嵌入式、Linux。...关注下方公众号,回复【书籍】,获取 Linux、嵌入式领域经典书籍;回复【PDF】,获取所有原创文章( PDF 格式)。...这里每一个,就称作,所以一共有1024个。 一个中一共有1024个表项,每一个表项占用4个字节,所以一个就占用4KB物理内存空间,正好是一个物理大小。...表示这个物理数据是否被写过; 目录 现在,每一个物理,都被一个一个表项来指向了,那么这1024个地址,应该怎么来管理呢? 答案是:目录!...目录中,每一个表项格式如下: 其中属性字段,与属性类似,只不过它描述对象是。 还有一点:每一个用户程序都有自己目录和!下文有详细说明。

    1.4K30

    【进程 进程通常存在PCB中

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

    1.6K20

    内核必须懂(七): Linux四级(x64)

    目录 前言 Intel四级 实操寻址 获取cr3 获取PGD 获取PUD 获取PMD 获取PTE 获取内容 最后 ---- 前言 Linux四级作用主要就是地址映射, 将逻辑地址映射到物理地址...很多时候, 有些地方想不明白就可以查看实际物理地址进行分析. ---- Intel 四级 其实很多设计根源或者说原因都来自于CPU设计, OS很多时候都是辅助CPU....Linux四级就是依据CPU四级来设计. 这里主要说就是Intel x64面大小为4KB情况, 如图所示: ?...当然了, 按照CPU图示, cr3肯定是指向PML4E. 在Linux当中, 第一级称为PGD, 当然是有历史原因, 可以自行google....所以Linux四级分别是PGD -> PUD -> PMD -> PTE. ? ---- 获取PGD 想要获取PGD中内容需要通过计算. 这里先来处理一下局部变量地址.

    7.4K40

    Linux 匿名反向映射

    我们知道LINUX内存管理系统中有”反向映射“这一说,目的是为了快速去查找出一个特定物理在哪些进程中被映射到了什么地址,这样如果我们想把这一换出(SWAP),或是迁移(Migrate)时候,就能相应该更改所有相关进程来达到这个目的...1、为什么要使用反向映射   物理内存分页机制,一个PTE(Page Table Entry)对应一个物理,但一个物理可以由多个PTE与之相对应,当该页要被回收时,Linux2.4做法是遍历每个进程所有...Linux采用三级: PGD:顶级,由pgd_t项组成数组,其中第一项指向一个二级。...PMD:二级,由pmd_t项组成数组,其中第一项指向一个三级(两级处理器没有物理PMD)。 PTE:是一个对齐数组,第一项称为一个表项,由pte_t类型表示。...,12-21PMD,22-31位PGD,即线性地址右移22位结果为其在全局目录偏移 #define PTRS_PER_PGD 1024 // 因PGD共10位,所以其最多可以有2^

    3.7K31
    领券