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

系统内存管理:虚拟内存内存分段与分页、缓存TLB以及Linux内存管理

虚拟地址与物理地址之间通过进行映射,存储在CPU的内存管理单元(MMU)中,从而CPU可以直接通过MMU找到实际访问的物理内存地址。...为了节省内存空间,我们可以将单级进行分页,将一个(一级)分为1024个(二级),每个二级包含1024个表项,形成二级分页结构。...这是因为程序执行过程中,访问的表项相对固定。通过利用TLB,可以大大提高地址转换的速度,加快程序的执行效率。Linux内存管理Linux内存管理涉及逻辑地址和线性地址的转换。...逻辑地址是程序使用的地址,而线性地址是通过段式内存管理映射的地址,也称为虚拟地址。Linux的虚拟地址空间分为内核空间和用户空间两部分。...Linux内存管理涉及逻辑地址和线性地址的转换,将虚拟地址空间分为内核空间和用户空间,方便进程访问内核空间内存。我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

43280

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

前面已经分析了内核的准备工作以及内核低端内存的建立,接着回到init_mem_mapping()中,低端内存建立后紧随着还有一个函数early_ioremap_page_table_range_init...,是从缓冲空间中申请还是通过memblock算法申请内存。...,创建并使其指向被创建的。...为了避免前期可能对固定映射区已经分配了表项,基于临时内核映射区间要求连续性的保证,所以在此重新申请连续的空间将原内容拷贝至此。...值得注意的是,与低端内存初始化不同的是,这里的只是被分配,相应的PTE项并未初始化,这个工作将会交由以后各个固定映射区部分的相关代码调用set_fixmap()来将相关的固定映射区与物理内存关联

1.5K11
您找到你想要的搜索结果了吗?
是的
没有找到

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.8K41

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

文章目录 一、Linux 内核中的内存管理模块 二、硬件设备内存管理 一、Linux 内核中的内存管理模块 ---- Linux 内核还需要处理如下内容 : ① 错误异常处理 ② 管理 ③ 引导内存分配器...: 分配器 , 块分配器 , 不连续分配器 , 连续内存分配器 , 每处理器内存分配器 ; " 分配器 " 负责分配 内存物理 , 使用的是 " 伙伴分配器 " ; " 不连续分配器 " 提供了...: 控制管理 被 进程 占用的 内存 ; 碎片整理 : 如果 " 内存碎片化 " 严重 , 没有连续物理 , 需要通过 整理内存碎片 并迁移数据 得到 连续的 物理 ; 内存回收 : 内存不足时 ,...回收内存 ; ⑦ 回收处理 二、硬件设备内存管理 ---- 硬件设备内存管理 : ① CPU 处理器 中的 " 内存管理单元 " ( MMU ) 和 高速缓存 ; ② 物理内存 在 " 内存管理单元..." ( MMU ) 中 , 还有一个 " 缓存 " ; 缓存 中缓存了 最近使用的 " 映射 “ , 该映射的作用是 将 ” 物理地址 " 映射为 " 虚拟地址 " ; CPU 处理器

1.4K40

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

文章目录 一、物理 page 简介 1、物理 page 引入 2、物理 page 与 MMU 内存管理单元 3、物理 page 结构体 4、Linux 内核源码中的 page 结构体 二、内存节点...pglist_data 与 物理 page 联系 内存管理系统 3 级结构 : ① 内存节点 Node , ② 内存区域 Zone , ③ 物理 Page , Linux 内核中 , 使用 上述..., 就是 " 内存区域 " zone , " 内存区域 " 再向下划分 , 就是 " 物理 " page ; 2、物理 page 与 MMU 内存管理单元 在 Linux 内核中 , MMU 内存管理单元...结构体 " 物理 " page 是 Linux 内核 " 内存管理 " 中的 最小单位 , 物理 中的 " 物理地址 " 是连续的 , 每个 " 物理 " 使用 struct page 结构体...SPARSEMEM */ // 描述数组 struct page *node_mem_map; #endif } 参考 【Linux 内核 内存管理】物理内存组织结构 ③ ( 内存管理系统三级结构

6.7K10

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

内核知识第八讲,PDE,PTE,目录,内存管理 一丶查看GDT.....: 虚拟地址: 0040256f  段选择子: cs:1B 那么此时段选择字当下表.虚拟地址当作偏移.去查询GDT 下图为选择子结构 段选择子结构:  首先先拆分选择子. 1B =   0000000000011...看一下CR0的结构: 但是我们0环可以进行操作的. 此图是从inter手册上截图下来的.有兴趣的可以查询CR0查看....我们说过,操作系统为了隔离内存.采用了分页管理.而我们线性地址转化到物理地址的时候. 则需要查表. 那么我们觉着这个应该怎么做?...但是通过两个查询.可以映射4G内存.而上面的设计方法不行. 首先前边20位保存了或者物理地址的基地址. 比如我们的目录. 查到了第5项.那么从中取出千20位来,加上000就等于了.

1.4K10

高端内存映射vmalloc分配内存中不连续的--Linux内存管理(十九)

分配到其中的可能位于物理内存中的任何地方. 通过修改负责该区域的内核, 即可做到这一点. ? ?...所有有关vmalloc的数据结构和API结构声明在include/linux/vmalloc.h 声明头文件 NON-MMU实现 MMU实现 include/linux/vmalloc.h mm/nommu.c...mm/vmalloc.c 2.1 数据结构 内核在管理虚拟内存中的vmalloc区域时, 内核必须跟踪哪些子区域被使用、哪些是空闲的....unmap_vm_area使用找到的vm_area实例,从删除不再需要的项。与分配内存时类似,该函 数需要操作各级,但这一次需要删除涉及的项。它还会更新CPU高速缓存。...然后对每一项调用__free_page,将释放 到伙伴系统。 最后,必须释放用于管理内存区的内核数据结构

2.9K10

Linux 内核 内存管理】物理内存组织结构 ② ( 内存模型 | 平坦内存 | 稀疏内存 | 非连续内存 | 内存管理系统三级结构 | 节点 Node | 区域 Zone | Page )

文章目录 一、内存模型 二、内存管理系统三级结构 一、内存模型 ---- 从 CPU 处理器 的角度出发 , 观察 内存的 " 物理分布 " , 有如下 3 种内存模型 , Linux 内核针对这...3 种内存模型进行不同的处理 ; ① 平坦内存 : Flat Memory , 物理地址空间 是 连续的 , 没有 " 内存空洞 " ; ② 稀疏内存 : Space Memory , 物理地址空间..." 内存空洞 " ; 内存热插拔支持 : 只有 " 稀疏内存模型 " 支持 内存条 的 热插拔 操作 ; 内存空洞 : 系统的 2 个物理内存 之间 , 存在 内存空洞 ; 1 个物理内存 内部也可能存在...内存空洞 ; 二、内存管理系统三级结构 ---- 内存管理系统 3 级结构 : ① 节点 Node , ② 区域 Zone , ③ Page , Linux 内核中 , 使用 上述 3 级结构...描述 和 管理 " 物理内存 " ;

2.7K30

DPDK巨地址管理Linux内核内存管理内存映射pagemaprdma内存注册

DPDK巨地址管理/Linux内核内存管理/内存映射/pagemap/rdma内存/注册术语PFN: 物理地址对应的帧号:pfn = pte_pfn(*pte)INFINIBAND_USER_MEM...可以在驱动程序初始化时选择资源配置文件HMC 需要在主机内存中驻留大量数据结构的后备存储来执行其功能。 9-11 提供了数据结构的列表以及需要为每个数据结构分配的内存量。...主机内存中PD结构的格式如表9-12所示图片HMC 支持物理地址是驱动程序分配的的地址,该页将保存 HMC 对象上下文。 该地址必须与主机内存中的 4 KB 地址对齐。...协议引擎资源将在 11.1 节中进一步讨论Linux内存管理数据结构的关系图关键函数rte_mem_virt2phyrte_eal_memory_initpte_to_pagemap_entrysmaps_pte_rangeshow_smappte_pfn...内存管理 (19)总结内存管理数据结构和API: https://www.cnblogs.com/arnoldlu/p/8335568.htmlRDMA IB uverbs 内存固定实现: https:

18610

Linux 内存管理vmalloc

走进vmalloc 根据前面的系列文章,我们知道了buddy system是基于框分配器,kmalloc是基于slab分配器,而且这些分配的地址都是物理内存连续的。...但是随着碎片化的积累,连续物理内存的分配就会变得困难,对于那些非DMA访问,不一定非要连续物理内存的话完全可以像malloc那样,将不连续的物理内存框映射到连续的虚拟地址空间中,这就是vmap的来源)...数据结构 vmap_area 描述一段虚拟地址的区域,可以将struct vm_struct构成一个链表,维护多段映射。...purge_list; /* "lazy purge" list */ //如果当前VA处于使用状态(即在vmap_area_root为根的红黑树中和vmap_area_list链表中),vm有效,指向用于管理虚拟地址和物理之间的映射关系的描述符...struct vm_struct *vm; struct rcu_head rcu_head; }; vm_struct 管理虚拟地址和物理之间的映射关系 struct vm_struct {

2K20

Linux 内存管理CMA

当设备驱动不用时,内存管理系统将该区域用于分配和管理可移动类型页面;当设备驱动使用时,此时已经分配的页面需要进行迁移,又用于连续内存分配;其用法与DMA子系统结合在一起充当DMA的后端,具体可参考《没有...数据结构 struct cma { //CMA区域物理地址的起始帧号 unsigned long base_pfn; //CMA区域总体的页数 unsigned long count...char *name; }; extern struct cma cma_areas[MAX_CMA_AREAS]; extern unsigned cma_area_count; bitmap来管理内存的分配...方式: reserved-memory { /* global autoconfigured region for contiguous allocations */ linux...将CMA区域添加到Buddy System 为了避免这块reserved的内存在不用时候的浪费,内存管理模块会将CMA区域添加到Buddy System中,用于可移动页面的分配和管理

2.9K30

Linux内存描述概述--Linux内存管理(一)

2 (N)UMA模型中linux内存的机构 Linux适用于各种不同的体系结构, 而不同体系结构内存管理方面的差别很大. 因此linux内核需要用一种体系结构无关的方式来表示内存....Linux内核通过插入一些兼容层, 使得不同体系结构的差异很好的被隐藏起来, 内核对一致和非一致内存访问使用相同的数据结构 2.1 (N)UMA模型中linux内存的机构 非一致存储器访问(NUMA)模式下...而内存管理的其他地方则认为他们就是在处理一个(伪)NUMA系统. 2.2 Linux物理内存的组织形式 Linux把物理内存划分为三个层次来管理 层次 描述 存储节点(Node) CPU被划分为多个节点...一个管理区(zone)由struct zone结构体来描述,在linux-2.4.37之前的内核中是用typedef struct zone_struct zone_t数据结构来描述) 对于x86_32..., 首先建立管理zone_table.

6.8K30

linux内存管理slab算法kmem_cache结构创建

cachep) goto oops; //如果申请的对象size大于等于512B,则slab管理结构不在本slab页面上,在早期初始化slab阶段所分配的cache都是onslab的 /...(kmem_bufctl_t) + sizeof(struct slab), align); //如果slab管理结构在本cache外面,并且剩余的字节数大于等于管理结构体的 //...cache上,则slab管理结构的大小不需要对齐,只需要计算真实的slab管理结构大小 if (flags & CFLGS_OFF_SLAB) { /* really off slab....cache,则需要给slab管理结构指定一个大小适合的kmem_cache //给slab管理结构分配内存 if (flags & CFLGS_OFF_SLAB) { cachep->slabp_cache...*/ //内部碎片乘以8,要小于等于所分配的大小 //比如此时只分配了一,那么leftover的大小不能大于512B if (left_over * 8 <= (PAGE_SIZE

94710

Linux内存管理mmap详解

不执行预读,只为已存在于内存中的页面建立入口。 fd:有效的文件描述词。如果MAP_ANONYMOUS被设定,为了兼容问题,其值应为-1。 offset:被映射对象内容的起点。 2....结构的成员: int (*mmap)(struct file *,struct vm_area_struct *); linux有2个方法建立: (1) 使用remap_pfn_range一次建立所有...因为保留和在物理内存顶之上的物理地址内存管理系统的各个子模块管理不到。640 KB 和 1MB 是保留可能映射,设备I/O内存也可以映射。...(2) 文件与 address_space结构的对应:一个具体的文件在打开后,内核会在内存中为建立一个struct inode结构,其中的i_mapping域指向一个address_space结构。...如果没有找到,则说明文件数据还没有读入内存,处理程序会从磁盘读入相应的页面,并返回相应地址,同时,进程也会更新. (5) 所有进程在映射同一个共享内存区域时,情况都一样,在建立线性地址与物理地址之间的映射之后

4.3K90

Linux内存管理mmap详解

作者:freeboy1015 来源:http://lib.csdn.net/article/linux/62126 一. mmap系统调用 1. mmap系统调用 mmap将一个文件或者其它对象映射进内存...结构的成员: int (*mmap)(struct file *,struct vm_area_struct *); linux有2个方法建立: (1) 使用remap_pfn_range一次建立所有...因为保留和在物理内存顶之上的物理地址内存管理系统的各个子模块管理不到。640 KB 和 1MB 是保留可能映射,设备I/O内存也可以映射。...(2) 文件与 address_space结构的对应:一个具体的文件在打开后,内核会在内存中为建立一个struct inode结构,其中的i_mapping域指向一个address_space结构。...如果没有找到,则说明文件数据还没有读入内存,处理程序会从磁盘读入相应的页面,并返回相应地址,同时,进程也会更新. (5) 所有进程在映射同一个共享内存区域时,情况都一样,在建立线性地址与物理地址之间的映射之后

2.5K40

Linux内存管理伙伴算法

这个时候,在这段内存上不能找到连续的5个空闲的框,就会去另一段内存上去寻找5个连续的框,这样子,久而久之就形成了框的浪费。...为了避免出现这种情况,Linux内核中引入了伙伴系统算法(Buddy system)。...最大可以申请1024个连续框,对应4MB大小的连续内存。每个框块的第一个框的物理地址是该块大小的整数倍,如图: ?...从上面可以知道Buddy算法一直在对框做拆开合并拆开合并的动作。Buddy算法牛逼就牛逼在运用了世界上任何正整数都可以由2^n的和组成。这也是Buddy算法管理空闲的本质。...,如果没有找到,则从更大的order中查找,直到MAX_ORDER; 查找到之后,从对应的链表中删除掉,并调用expand函数进行处理; 「__rmqueue:」 static struct page

2K30

Linux内存分配策略

伙伴系统分配算法 在上一节, 我们介绍了Linux内核怎么管理系统中的物理内存....但有时候内核需要分配一些物理内存地址也连续的内存, 所以Linux使用了 伙伴系统分配算法 来管理系统中的物理内存....在Linux内核中, 把两个物理地址相邻的内存当作成伙伴, 因为Linux是以页面号来管理内存的, 所以就是说两个相邻页面号的页面是伙伴关系....上一节我们介绍过内存管理区数据结构 struct zone_struct, 在内存管理区数据结构中有个名为 free_area 类型为 free_area_t 的字段, 他的作用就是用来管理内存管理区内的空闲物理内存...上一节我们说过, 在管理物理内存的 struct page 结构中有个 list 的字段, 内核就是通过这个字段把有着相同个数页面的内存块连成一个链表的: typedef struct page {

3.2K10
领券