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

Linux内核 MMU的工作原理

执行下面这些指令: MOVE REG,0// 将 0 号地址的值传递进寄存器 REG 虚拟地址 0 将被送往MMUMMU看到该虚拟地址落在0 范围内(0 范围是0 到 4095),从上图我们可以看出...物理内存中的称为物理帧(page frame),虚拟内存的哪个页面映射到物理内存的哪个帧是通过(Page Table)来描述的,保存在物理内存中,MMU 会查找来确定一个VA 应该映射到什么...操作系统和 MMU 是这样配合的:操作系统在初始化或分配、释放内存时会执行一些指令在物理内存中填写,然后用指令设置MMU,告诉MMU 在物理内存中的什么位置。...MMU 除了做地址转换之外,还提供内存保护机制,各种体系结构都有用户模式(User Mode)和特权模式(Privileged Mode)之分,操作系统可以在中设置每个内存页面的访问权限, 有些页面不允许访问...用户空间和内核空间 通常操作系统把虚拟地址划分为用户空间和内核空间,例如 X86平台的Linux 系统虚拟地址空间是0x00000000 - 0xFFFFFFFF,前3GB(0x00000000 - 0xBFFFFFFF

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

    Linux内存管理之MMU的过程

    在解释地址转换的本质前我们先理解下几个概念: TLB:MMU工作的过程就是查询的过程。如果把放在内存中查询的时候开销太大,因此为了提高查找效率,专门用一小片访问更快的区域存放地址转换条目。...我们知道linux采用了分页机制,通常采用四级全局目录(PGD),上级目录(PUD),中间目录(PMD),(PTE)。如下: ?...第三次读取内存得到pmd_t结构的目录项,从中取出的物理基地址。 从线性地址的第四部分中取出表项的索引,与基址相加得到表项的物理地址。...linux中对地址转换的实现 /*描述各级中的表项*/ typedef struct { pteval_t pte; } pte_t; typedef struct { pmdval_t pmd;...这个过程也是mmu的过程。 小结 我相信你已经对cpu通过MMU访问内存的本质有所掌握(还是不理解的话不要说认识我),而且通过linux的一个实验,对其软件模拟流程也有所感性的认识。

    2.3K42

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

    文章目录 一、Linux 内核中的内存管理模块 二、硬件设备内存管理 一、Linux 内核中的内存管理模块 ---- Linux 内核还需要处理如下内容 : ① 错误异常处理 ② 管理 ③ 引导内存分配器...: 分配器 , 块分配器 , 不连续分配器 , 连续内存分配器 , 每处理器内存分配器 ; " 分配器 " 负责分配 内存物理 , 使用的是 " 伙伴分配器 " ; " 不连续分配器 " 提供了...vmalloc 函数 用于分配内存 , vfree 函数 用于 释放内存 ; 申请的 " 不连续物理 “ 可以 映射到 ” 连续的虚拟 " ; ④ 内存碎片整理 ⑤ 内存耗尽处理 ⑥ 内存控制组...回收内存 ; ⑦ 回收处理 二、硬件设备内存管理 ---- 硬件设备内存管理 : ① CPU 处理器 中的 " 内存管理单元 " ( MMU ) 和 高速缓存 ; ② 物理内存 在 " 内存管理单元..." ( MMU ) 中 , 还有一个 " 缓存 " ; 缓存 中缓存了 最近使用的 " 映射 “ , 该映射的作用是 将 ” 物理地址 " 映射为 " 虚拟地址 " ; CPU 处理器

    1.5K40

    与三级介绍

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

    11510

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

    虚拟地址转换物理地址的过程:打开mmu后,cpu访问的都是虚拟地址,当cpu访问一个虚拟地址的时候,会通过cpu内部的mmu查询物理地址,mmu首先通过虚拟地址在tlb中查找,如果找到相应表项,直接获得物理地址...;如果tlb没有找到,就会通过虚拟地址从基地址寄存器保存的基地址开始查询多级,最终查询到找到相应表项,会将表项缓存到tlb中,然后从表项中获得物理地址。...Linux内核为何使用多级?...遍历,将va转换为pa,页面权限管理 涉及到的硬件为: mmu ->功能:查询tlb或者遍历 tlb ->功能:缓存最近转换的条目 基地址寄存器 如ttbr0_el1 ttbr1_el1...2)Linux内核 填写,将基地址告诉mmu 内核初始化建立内核,实现缺页异常等机制为用户任务按需分配并映射。 当然,内核也可以遍历,如缺页异常时遍历进程。 10.

    1.9K22

    Linux下内存空间分配、物理地址与虚拟地址映射

    4M,这对空间占用和MMU查询速度都很不利。...具体说可以把20bits的页号再划分为几部分 简单说每次MMU根据虚拟地址查询都是一级级进行,先根据PGD的值查询,如果查到PGD的匹配,但后续PMD和PTE没有,就以2(offset+pte+pmd...系统初始化代码会在内存中生成,然后把地址设置给MMU对应寄存器,使MMU知道在物理内存中的什么位置,以便在需要时进行查找。...条目就到外部查询,并置换进TLB;根据PTE条目中对访问权限的限定检查该条VA指令是否符合,若不符合则不继续,并抛出exception异常;符合后根据VA的地址分段查询,保持offset(广义)...在这个过程中,软件的工作核心就是生成和配置。 ARM系列的MMU ARM出品的CPU,MMU作为一个协处理器存在。根据不同的系列有不同搭配。需要查询DATASHEET才可知道是否有MMU

    3.5K31

    内存系列学习(一):万字长文带你搞定MMU&TLB&TWU

    TLB是一个高速缓存,用于缓存转换的结果,从而缩短查询的时间。 TWU是一个遍历模块,是由操作系统维护在物理内存中,但是的遍历查询是由TWU完成的,这样减少对CPU资源的消耗。...在REE(linux)和TEE(optee)双系统的环境下,可同时开启两个系统的MMU。...Walk),查询的过程由硬件自动完成,但是的维护需要软件来完成。...查询是一个相对耗时的过程,理想的状态是TLB里缓存有转换的相关信息。当TLB未命中时,才会去查询,并且开始读入的内容。...MMU查询的过程中,用户进程的一级的基址存放在TTBR0。操作系统的内核空间公用一块地址空间,MMU查询的过程中,内核空间的一级基址存放在TTBR1。

    1.9K31

    一文看懂影子和扩展

    后引入机制,把虚拟地址送往MMUMMU查TLB不中的情况下,依次查就可以找到对应的物理地址。...,X86上叫CR3 EPT:扩展 ptr:这里用来描述指向某个的寄存器 一.内存虚拟化要解决的问题 内存虚拟化实际实现就是MMU虚拟化,要实现GVA -> GPA -> HVA -> HPA...3, HVA->HPA,这一过程就是我们已知的使用物理MMU完成VMM进程的虚拟内存到物理内存的转换。 4, 把GVA -> HPA,这一路的映射关系记录到中,这个就是影子。...所以说EPT/NPT MMU解耦了GVA->GPA转换和GPA->HPA转换之间的依赖关系。并且一个VM只需要一套EPT,减少了内存开销,维护也比较简单。...四.看图总结 最后我们直观的看看引入虚拟化之后MMU的变化情况: 没有虚拟化: 影子: EPT/NPT: 通过上面的对比图,我们应该能清楚的看到MMU虚拟化的整个设计思。

    2.1K20

    廖威雄: 学习Linux必备的硬件基础一网打尽

    图 5-1获取物理地址 【a】CPU向MMU发送虚拟地址 【b】MMU查询TLB 快命中:从快获取物理地址,由MMU继续根据物理地址匹配数据【步骤A】 快不命中:查询【步骤c】 【c】从高速缓存查询...从获取虚拟地址的映射关系后,进入【步骤e】 【e】把查询表项记录到高速缓存,进入【步骤f】 【f】MMU从高速缓存中获取表项 虚拟地址有分配物理框:转换物理地址并更新快,由MMU继续根据物理地址匹配数据...图 5-3最理想情况下CPU获取数据 【a】CPU向MMU发送虚拟地址 【b】MMU查询TLB 快命中:从快获取物理地址,由MMU继续根据物理地址匹配数据【步骤A】 【A】MMU获取物理地址后...图 6-4获取物理地址 【a】CPU向MMU发送虚拟地址0x10240011,转换出虚拟页号为第66112,偏移为0x11 【b】MMU查询TLB,快不命中 【c】从高速缓存查询,高速缓存不命中...【d】从内存中查询,内存中有进程的完整页 【e】把查询表项记录到高速缓存 【f】MMU从高速缓存中获取表项,发现虚拟地址没分配物理框,触发缺页中断 【g】进入缺页中断处理程序 【h】为第

    1.1K20

    Liunux内核内存管理之虚拟地址空间

    、MacOS、Linux、Android; 不用MMU的是:FreeRTOS、VxWorks、UCOS…… 与此相对应的:CPU也可以分成两类,带MMU的、不带MMU的。...带MMU的是:Cortex-A系列、ARM9、ARM11系列; 不带MMU的是:Cortex-M系列……(STM32是M系列,没有MMU,不能运行Linux,只能运行一些UCOS、FreeRTOS等等)...只有在TLB无法完成地址翻译任务时,才会到内存中查询,这样就减少了查询导致的处理器性能下降。 如果没有TLB,则每次取数据都需要两次访问内存,即查获得物理地址和取数据....虚拟内存的哪个页面映射到物理内存的哪个帧是通过(Page Table)来描述的,保存在物理内存中,MMU会查找来确定一个VA应该映射到什么PA。...OS和MMU是这样配合的: 操作系统在初始化或分配、释放内存时会执行一些指令在物理内存中填写,然后用指令设置MMU,告诉MMU在物理内存中的什么位置。

    1.1K20

    内核调试

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

    19410

    Linux 内核 内存管理】物理内存组织结构 ⑥ ( 物理 page 简介 | 物理 page 与 MMU 内存管理单元 | 内存节点 pglist_data 与 物理 page 联系 )

    文章目录 一、物理 page 简介 1、物理 page 引入 2、物理 page 与 MMU 内存管理单元 3、物理 page 结构体 4、Linux 内核源码中的 page 结构体 二、内存节点..., 就是 " 内存区域 " zone , " 内存区域 " 再向下划分 , 就是 " 物理 " page ; 2、物理 page 与 MMU 内存管理单元 在 Linux 内核中 , MMU 内存管理单元..., 主要作用是 将 " 虚拟地址 " 映射到 真实的 " 物理地址 " 中 , MMU 将 物理 page 作为内存管理基本单位 , 不同体系结构的支持的 物理 大小也不同 , 32 位体系结构中...结构体 " 物理 " page 是 Linux 内核 " 内存管理 " 中的 最小单位 , 物理 中的 " 物理地址 " 是连续的 , 每个 " 物理 " 使用 struct page 结构体...内核源码中的 page 结构体 " 物理 " 使用 page 结构体 进行描述 , 该结构体又称为 " 描述符 " ; 该 page 结构体 定义在 Linux 内核源码的 linux-4.12\

    6.8K10

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

    而VPN到PFN的映射关系是通过表记录的。MMU通过表记录的映射关系完成VPN到PFN的转换,即找到了就找到了物理地址。 1.1 存在哪里?...可见所需要的空间是很大的,所以都存储在物理内存中。即MMU通将虚拟地址转换为物理地址,需要访问物理内存中对应的。...不同进程都拥有自己的一套,因而即使两个进程虚拟地址相同,映射的物理地址也是不同的。切换地址空间相当于控制MMU访问不同进程拥有的MMU找到了就找到了物理地址。...多级的后几级映射关系没有存在内存中,MMU地址转换中发现不存在需要向操作系统上报缺页异常,操作系统需要在缺页异常中下发到内存; 额外的内存访问:MMU进行地址转换需要通过基址寄存器找到一级...ARMv7属性的定义分为Linux版本的和ARMv7硬件的Linux版本的PTE属性定义加入前缀L_,如下所示: /* * "Linux" PTE definitions.

    3.6K11

    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

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

    转换寄存器描述符 1.1,/目录结构 基于前言中的内核配置,内核采用39位虚拟地址,因此可寻址范围为2^39 = 512G,采用(linux 默认为五级,另外还有PUD,P4D,由于本文只配置三级...; 当bit[1:0] = {1,0|0,0}时,该表项为无效项; 转换描述符中lower attributes中存储相关属性信息,mmu在查找到相应的表项时,首先会查询属性信息,确认地址的相关属性(...查询,因此在进程切换时,TTBR0中的值(task_struct.mm.pgd)是要同时改变的,这也与linux中每一个进程都独占整个虚拟(此为512G)地址空间相对应; 三、转换流程 据此可以画出如下转换框图...假设它有效,且允许访问内存; 5,MMU从PGD目录表项中获取bit[39:12],作为PMD的物理基址(table descriptor)。...6,PMD包含512个64位PTE,从虚拟地址中获取VA[30:21]进行索引,PMD+(index[30:21]8),MMU从PMD表项中读取PTE的基地址; 7,MMU检查PMD目录项的有效性(

    51100

    操作系统段结合的实际内存管理--13

    虚拟地址,经过MMU计算,得到虚拟页号,然后去查询对应的,得到对应的真实物理页号 通过真实的物理页号,和对应的内偏移地址,就可以计算出真实的物理地址了 ---- 一个实际的段、式内存管理 这个故事从哪里开始...假设父进程需要向内存中写入一个7,然后给出一个偏移地址,MMU通过段基址寄存器中保存的段号,和对应的偏移地址自动去查询,得到对应的虚拟地址,然后通过虚拟地址就知道了目录号,页号,和内偏移地址,然后马上又会去查询...---- 虚拟地址转换物理地址的过程: 打开mmu后,cpu访问的都是虚拟地址,当cpu访问一个虚拟地址的时候,会通过cpu内部的mmu查询物理地址,mmu首先通过虚拟地址在tlb中查找,如果找到相应表项...,直接获得物理地址;如果tlb没有找到,就会通过虚拟地址从基地址寄存器(cr3)保存的基地址开始查询多级,最终查询到找到相应表项,会将表项缓存到tlb中,然后从表项中获得物理地址。...OS和MMU的关系简单说: 系统初始化代码会在内存中生成,然后把地址设置给MMU对应寄存器,使MMU知道在物理内存中的什么位置,以便在需要时进行查找。

    83220
    领券